Dump current status

This commit is contained in:
rozlette 2018-10-25 21:29:41 -05:00
parent d3a5a2f29d
commit cc9baa93a8
75 changed files with 60092 additions and 0 deletions

79
Makefile Normal file
View File

@ -0,0 +1,79 @@
# TODO think about how to split this up
MIPS_BINUTILS := mips-linux-gnu-
AS := $(MIPS_BINUTILS)as
LD := $(MIPS_BINUTILS)ld
QEMU_IRIX := ~/irixemu/mips-linux-user/qemu-mips
IRIX_ROOT := ./ido/
CC := $(QEMU_IRIX) -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc
CFLAGS := -G 0 -non_shared -Xfullwarn -Xcpluscomm
MIPS_VERSION := -mips2
OPTIMIZATION := -O2 -g3
build/src/libultra/os/%: OPTIMIZATION := -O1
build/src/libultra/io/%: OPTIMIZATION := -O2
build/src/libultra/libc/%: OPTIMIZATION := -O2
test.txt: OPTIMIZATION := -O2
test.txt: MIPS_VERSION := -mips2
BASEROM_FILES := $(wildcard baserom/*)
BASEROM_O_FILES := $(BASEROM_FILES:baserom/%=build/baserom/%.o)
S_FILES := $(wildcard asm/*)
S_O_FILES = $(S_FILES:asm/%.asm=build/asm/%.o)
C_FILES := $(wildcard src/*) $(wildcard src/libultra/*) $(wildcard src/libultra/os/*) $(wildcard src/libultra/io/*) $(wildcard src/libultra/libc/*) $(wildcard src/code/*)
C_O_FILES = $(C_FILES:src/%.c=build/src/%.o)
O_FILES := $(BASEROM_O_FILES) $(S_O_FILES)
ROM := rom.z64
ELF := build/rom.elf
# make build directories
$(shell mkdir -p build/asm)
$(shell mkdir -p build/baserom)
$(shell mkdir -p build/src)
$(shell mkdir -p build/src/libultra)
$(shell mkdir -p build/src/libultra/os)
$(shell mkdir -p build/src/libultra/io)
$(shell mkdir -p build/src/libultra/libc)
$(shell mkdir -p build/src/code)
check: $(ROM) code.bin boot.bin
@md5sum -c checksum.md5
$(ROM): $(ELF)
@python3 elf2rom.py
$(ELF): $(O_FILES) ldscript.txt
$(LD) -T ldscript.txt --no-check-sections --accept-unknown-input-arch -o $@
boot.bin: code.elf
$(MIPS_BINUTILS)objcopy --dump-section boot=$@ $<
code.bin: code.elf
$(MIPS_BINUTILS)objcopy --dump-section code=$@ $<
code.elf: $(S_O_FILES) $(C_O_FILES) codescript.txt undef.txt
$(LD) -T codescript.txt -T undef.txt --no-check-sections --accept-unknown-input-arch -o $@
test.txt: build/src/test.o
$(MIPS_BINUTILS)objdump -d --adjust-vma=0x8008F1A0 $< > test.txt
clean:
rm $(ROM) $(ELF) code.elf code.bin boot.bin -r build
# Recipes
build/baserom/%.o: baserom/%
$(MIPS_BINUTILS)objcopy -I binary -O elf32-big $< $@
build/asm/%.o: asm/%.asm
$(AS) -march=vr4300 -32 $^ -o $@
build/src/%.o: src/%.c include/*
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTIMIZATION) -Iinclude $< -o $@

6
README Normal file
View File

@ -0,0 +1,6 @@
WIP Majora's Mask decomp, proper docs and README will be made later.
Basic steps (assuming you already have IDO and irixqemu):
Run extract_rom.py with a USA Majora's Mask ROM named baserom.z64 (will need to get libyaz0 first, I'll set up the dependency file eventually)
Run disasm.py
Run Make (edit the makefile with the paths to ido, etc. I'll make it use evironment variables eventually)

3
checksum.md5 Normal file
View File

@ -0,0 +1,3 @@
2a0a8acb61538235bc1094d297fb6556 rom.z64
4e8afbb44e6a4b9bc00eaa318bb1650c code.bin
b0145fad4be13d63d5d7aa75062db400 boot.bin

302
codescript.txt Normal file
View File

@ -0,0 +1,302 @@
SECTIONS
{
boot 0x80080060:
{
build/asm/boot_0x80080060.o(.text)
build/asm/boot_0x800805E0.o(.text)
build/asm/boot_0x80080790.o(.text)
build/asm/boot_0x80080E30.o(.text)
build/asm/boot_0x80081820.o(.text)
build/asm/boot_0x80081920.o(.text)
build/asm/boot_0x80081980.o(.text)
build/asm/boot_0x80083EB0.o(.text)
build/asm/boot_0x80084940.o(.text)
build/asm/boot_0x80085130.o(.text)
build/asm/boot_0x80085320.o(.text)
build/asm/boot_0x80085570.o(.text)
build/asm/boot_0x80086110.o(.text)
build/asm/boot_0x80086280.o(.text)
build/asm/boot_0x800862E0.o(.text)
build/asm/boot_0x80086760.o(.text)
build/asm/boot_0x80087160.o(.text)
build/asm/boot_0x80087830.o(.text)
build/asm/boot_0x80087900.o(.text)
build/asm/setcause.o(.text)
build/src/libultra/os/sendmesg.o(.text)
build/asm/boot_0x80087C60.o(.text)
build/asm/boot_0x80087E00.o(.text)
build/src/libultra/os/stopthread.o(.text)
build/src/libultra/os/recvmesg.o(.text)
build/asm/setintmask.o(.text)
build/asm/getintmask.o(.text)
build/asm/boot_0x80088110.o(.text)
build/asm/boot_0x800882A0.o(.text)
build/asm/sinf.o(.text)
build/asm/sins.o(.text)
build/asm/sptask.o(.text)
build/asm/ll.o(.text)
build/asm/exceptasm.o(.text)
build/src/libultra/os/thread.o(.text)
build/src/libultra/os/destroythread.o(.text)
build/asm/boot_0x80089580.o(.text)
build/asm/bzero.o(.text)
build/asm/boot_0x800896D0.o(.text)
build/asm/siacs.o(.text)
build/asm/controller.o(.text)
build/src/libultra/os/createthread.o(.text)
build/asm/contreaddata.o(.text)
build/asm/boot_0x8008A170.o(.text)
build/src/libultra/os/virtualtophysical.o(.text)
build/asm/getsr.o(.text)
build/asm/setsr.o(.text)
build/asm/writebackdcache.o(.text)
build/asm/boot_0x8008A660.o(.text)
build/asm/boot_0x8008AA10.o(.text)
build/asm/perspective.o(.text)
build/asm/boot_0x8008ACE0.o(.text)
build/asm/sirawdma.o(.text)
build/asm/boot_0x8008AE20.o(.text)
build/asm/boot_0x8008AE70.o(.text)
build/asm/boot_0x8008AEE0.o(.text)
build/src/libultra/os/getthreadid.o(.text)
build/asm/sptaskyield.o(.text)
build/asm/boot_0x8008AF70.o(.text)
build/asm/boot_0x8008B3C0.o(.text)
build/asm/boot_0x8008B600.o(.text)
build/asm/boot_0x8008B650.o(.text)
build/asm/getconfig.o(.text)
build/asm/setconfig.o(.text)
build/asm/boot_0x8008B6D0.o(.text)
build/asm/boot_0x8008B9F0.o(.text)
build/src/libultra/os/stoptimer.o(.text)
build/asm/probetlb.o(.text)
build/asm/pimgr.o(.text)
build/asm/piacs.o(.text)
build/asm/boot_0x8008C260.o(.text)
build/asm/boot_0x8008C740.o(.text)
build/asm/getcount.o(.text)
build/asm/boot_0x8008D2E0.o(.text)
build/asm/boot_0x8008D350.o(.text)
build/asm/boot_0x8008D470.o(.text)
build/src/libultra/os/seteventmesg.o(.text)
build/asm/sqrtf.o(.text)
build/asm/boot_0x8008D710.o(.text)
build/src/libultra/io/contquery.o(.text)
build/asm/boot_0x8008D7D0.o(.text)
build/asm/xprintf.o(.text)
build/asm/boot_0x8008ED30.o(.text)
build/asm/unmaptlball.o(.text)
build/asm/pidma.o(.text)
build/asm/boot_0x8008EED0.o(.text)
build/asm/boot_0x8008F100.o(.text)
build/src/libultra/libc/string.o(.text)
build/asm/createmesgqueue.o(.text)
build/asm/invalicache.o(.text)
build/asm/invaldcache.o(.text)
build/asm/timerintr.o(.text)
build/asm/boot_0x8008F7D0.o(.text)
build/asm/boot_0x8008FA00.o(.text)
build/asm/si.o(.text)
build/asm/boot_0x8008FA60.o(.text)
build/src/libultra/os/jammesg.o(.text)
build/asm/setthreadpri.o(.text)
build/asm/getthreadpri.o(.text)
build/asm/boot_0x8008FD00.o(.text)
build/asm/boot_0x8008FE60.o(.text)
build/asm/boot_0x8008FEB0.o(.text)
build/asm/boot_0x800900C0.o(.text)
build/asm/sptaskyielded.o(.text)
build/asm/memcmp.o(.text)
build/asm/gettime.o(.text)
build/asm/boot_0x800904B0.o(.text)
build/asm/setglobalintmask.o(.text)
build/asm/boot_0x800906D0.o(.text)
build/asm/boot_0x80090810.o(.text)
build/asm/boot_0x80090900.o(.text)
build/asm/boot_0x80090AF0.o(.text)
build/asm/boot_0x80090C40.o(.text)
build/asm/boot_0x80090E70.o(.text)
build/asm/boot_0x800910A0.o(.text)
build/asm/boot_0x80091210.o(.text)
build/asm/boot_0x80091220.o(.text)
build/asm/setcompare.o(.text)
build/asm/getcompare.o(.text)
build/asm/dpgetstat.o(.text)
build/asm/dpsetstat.o(.text)
build/asm/bcopy.o(.text)
build/asm/resetglobalintmask.o(.text)
build/asm/boot_0x80091630.o(.text)
build/asm/ortho.o(.text)
build/asm/interrupt.o(.text)
build/asm/vi.o(.text)
build/asm/viswapcontext.o(.text)
build/asm/pigetcmdq.o(.text)
build/asm/cosf.o(.text)
build/asm/boot_0x800920B0.o(.text)
build/asm/boot_0x80092100.o(.text)
build/asm/coss.o(.text)
build/asm/settime.o(.text)
build/asm/boot_0x800922C0.o(.text)
build/asm/boot_0x80092440.o(.text)
build/asm/boot_0x80092730.o(.text)
build/asm/boot_0x80092920.o(.text)
build/asm/boot_0x80092A80.o(.text)
build/asm/boot_0x80092C00.o(.text)
build/asm/contsetch.o(.text)
build/asm/setfpccsr.o(.text)
build/asm/getfpccsr.o(.text)
build/asm/boot_0x80092D00.o(.text)
build/asm/boot_0x80092EE0.o(.text)
build/asm/boot_0x800931F0.o(.text)
build/asm/aigetlen.o(.text)
build/asm/boot_0x80093BB0.o(.text)
build/asm/maptlbrdb.o(.text)
build/asm/yieldthread.o(.text)
build/asm/boot_0x80093CC0.o(.text)
build/asm/getcause.o(.text)
build/asm/boot_0x80093DA0.o(.text)
build/asm/boot_0x80093FF0.o(.text)
build/asm/settimer.o(.text)
build/asm/xldtob.o(.text)
build/asm/ldiv.o(.text)
build/asm/xlitob.o(.text)
build/asm/sirawread.o(.text)
build/asm/spgetstat.o(.text)
build/asm/spsetstat.o(.text)
build/asm/vimgr.o(.text)
build/asm/vigetcurrcontext.o(.text)
build/asm/writebackdcacheall.o(.text)
build/src/libultra/os/getcurrfaultthread.o(.text)
build/asm/boot_0x80095600.o(.text)
build/asm/boot_0x80095740.o(.text)
build/src/libultra/os/startthread.o(.text)
build/asm/boot_0x80095900.o(.text)
build/asm/boot_0x80095950.o(.text)
build/asm/llcvt.o(.text)
build/asm/boot_0x80095C70.o(.text)
build/asm/boot_0x80096360.o(.text)
build/asm/boot_0x80096410.o(.text)
build/asm/boot_0x800964D0.o(.text)
build/asm/spsetpc.o(.text)
build/asm/boot_0x80096540.o(.text)
build/asm/boot_0x80096770.o(.text)
build/asm/boot_0x800967A0.o(.text)
build/asm/boot_0x80096810.o(.text)
build/asm/boot_0x80096820.o(.text)
build/asm/boot_0x80096880.o(.text)
build/asm/boot_0x800968B0.o(.text)
build/asm/boot_0x800968F0.o(.text)
build/asm/boot_0x80096930.o(.text)
}
code 0x800A5AC0:
{
build/asm/code_0x800A5AC0.o(.text)
build/asm/code_0x800A5D00.o(.text)
build/asm/code_0x800A81F0.o(.text)
build/asm/code_0x800ACBF0.o(.text)
build/asm/code_0x800B32D0.o(.text)
build/asm/code_0x800B3AD0.o(.text)
build/asm/code_0x800BF9A0.o(.text)
build/asm/code_0x800BFB80.o(.text)
build/asm/code_0x800CAAD0.o(.text)
build/asm/code_0x800CAE10.o(.text)
build/asm/code_0x800E03A0.o(.text)
build/asm/code_0x800E0410.o(.text)
build/asm/code_0x800E8EA0.o(.text)
build/asm/code_0x800E9360.o(.text)
build/asm/code_0x800E9C90.o(.text)
build/asm/code_0x800EE320.o(.text)
build/asm/code_0x800EFE60.o(.text)
build/asm/code_0x800F0390.o(.text)
build/asm/code_0x800F05C0.o(.text)
build/asm/code_0x800F07C0.o(.text)
build/asm/code_0x800F1250.o(.text)
build/asm/code_0x800F1460.o(.text)
build/asm/code_0x800F2620.o(.text)
build/asm/code_0x800F2D30.o(.text)
build/asm/code_0x800F42A0.o(.text)
build/asm/code_0x800F4F40.o(.text)
build/asm/code_0x800F5090.o(.text)
build/asm/code_0x800FEC90.o(.text)
build/asm/code_0x801005C0.o(.text)
build/asm/code_0x80102C60.o(.text)
build/asm/code_0x80102E40.o(.text)
build/asm/code_0x8010A000.o(.text)
build/asm/code_0x8010A760.o(.text)
build/asm/code_0x8010C0C0.o(.text)
build/asm/code_0x8010C230.o(.text)
build/asm/code_0x8010CB80.o(.text)
build/asm/code_0x80122660.o(.text)
build/asm/code_0x801226E0.o(.text)
build/asm/code_0x8012BC50.o(.text)
build/asm/code_0x8012D510.o(.text)
build/asm/code_0x8012EC80.o(.text)
build/asm/code_0x8012F2E0.o(.text)
build/asm/code_0x801307C0.o(.text)
build/asm/code_0x801322C0.o(.text)
build/asm/code_0x801323D0.o(.text)
build/asm/code_0x80137970.o(.text)
build/asm/code_0x80138410.o(.text)
build/asm/code_0x80138BA0.o(.text)
build/asm/code_0x8013A240.o(.text)
build/asm/code_0x8013A7C0.o(.text)
build/asm/code_0x8013EC10.o(.text)
build/asm/code_0x8013EE60.o(.text)
build/asm/code_0x80140260.o(.text)
build/asm/code_0x80140E80.o(.text)
build/asm/code_0x801418B0.o(.text)
build/asm/code_0x801420C0.o(.text)
build/asm/code_0x80142440.o(.text)
build/asm/code_0x80147520.o(.text)
build/asm/code_0x801588D0.o(.text)
build/asm/code_0x8015E750.o(.text)
build/asm/code_0x80160A90.o(.text)
build/asm/code_0x80161180.o(.text)
build/asm/code_0x801639A0.o(.text)
build/asm/code_0x80163C90.o(.text)
build/asm/code_0x80163DC0.o(.text)
build/asm/code_0x801647D0.o(.text)
build/asm/code_0x80164AF0.o(.text)
build/asm/code_0x801651B0.o(.text)
build/asm/code_0x8016AC10.o(.text)
build/asm/code_0x801727F0.o(.text)
build/asm/code_0x80172A00.o(.text)
build/asm/code_0x80172BC0.o(.text)
build/asm/code_0x80172C30.o(.text)
build/asm/code_0x80173130.o(.text)
build/asm/code_0x80173BF0.o(.text)
build/asm/code_0x80173D30.o(.text)
build/asm/code_0x80174A40.o(.text)
build/asm/code_0x80174AA0.o(.text)
build/asm/code_0x80174BF0.o(.text)
build/asm/code_0x80174F10.o(.text)
build/asm/code_0x80176280.o(.text)
build/asm/code_0x80177390.o(.text)
build/asm/code_0x80178750.o(.text)
build/asm/code_0x80178F30.o(.text)
build/asm/code_0x801795F0.o(.text)
build/asm/code_0x80180160.o(.text)
build/asm/code_0x80182CE0.o(.text)
build/asm/code_0x80183070.o(.text)
build/asm/code_0x801830A0.o(.text)
build/asm/code_0x80185F90.o(.text)
build/asm/code_0x801877D0.o(.text)
build/asm/code_0x8018B0F0.o(.text)
build/asm/code_0x8018EB60.o(.text)
build/asm/code_0x80192BE0.o(.text)
build/asm/code_0x80194710.o(.text)
build/asm/code_0x80194930.o(.text)
build/asm/code_0x801974D0.o(.text)
build/asm/code_0x8019AE40.o(.text)
build/asm/code_0x8019AEC0.o(.text)
build/asm/code_0x8019AF00.o(.text)
build/asm/code_0x801A51F0.o(.text)
build/asm/code_0x801A5BD0.o(.text)
build/asm/code_0x801A7B10.o(.text)
build/asm/code_0x801AA020.o(.text)
build/asm/code_0x801AA610.o(.text)
build/asm/code_0x801AAAA0.o(.text)
build/asm/code_0x801AAAB0.o(.text)
}
}

629
disasm.py Normal file
View File

@ -0,0 +1,629 @@
import os
import struct
SPLIT_FILES = True
GENERATE_HEADERS = True
loadHighRefs = {}
loadLowRefs = {}
from objects import *
from functions import *
from variables import *
from files import *
regs = {
0:"$zero", 1:"$at", 2:"$v0", 3:"$v1", 4:"$a0", 5:"$a1", 6:"$a2", 7:"$a3",
8:"$t0", 9:"$t1", 10:"$t2", 11:"$t3", 12:"$t4", 13:"$t5", 14:"$t6", 15:"$t7",
16:"$s0", 17:"$s1", 18:"$s2", 19:"$s3", 20:"$s4", 21:"$s5", 22:"$s6", 23:"$s7",
24:"$t8", 25:"$t9", 26:"$k0", 27:"$k1", 28:"$gp", 29:"$sp", 30:"$fp", 31:"$ra",
}
ops = {
2:"j", 3:"jal", 4:"beq", 5:"bne", 6:"blez", 7:"bgtz",
8:"addi", 9:"addiu", 10:"slti", 11:"sltiu", 12:"andi", 13:"ori", 14:"xori", 15:"lui",
20:"beql", 21:"bnel", 22:"blezl", 23:"bgtzl",
24:"daddi", 25:"daddiu",
32:"lb", 33:"lh", 34:"lwl", 35:"lw", 36:"lbu", 37:"lhu", 38:"lwr",
40:"sb", 41:"sh", 42:"swl", 43:"sw", 46:"swr", 47:"cache",
48:"ll", 49:"lwc1", 50:"lwc2", 51:"pref", 53:"ldc1", 54:"ldc2", 55:"ld",
56:"sc", 57:"swc1", 58:"swc2", 61:"sdc1", 62:"sdc2", 63:"sd",
}
funcs = {
0:"sll", 2:"srl", 3:"sra", 4:"sllv", 6:"srlv", 7:"srav",
8:"jr", 9:"jalr", 10:"movz", 11:"movn", 12:"syscall", 13:"break", 15:"sync",
16:"mfhi", 17:"mthi", 18:"mflo", 19:"mtlo", 20:"dsllv", 22:"dsrlv", 23:"dsrav",
24:"mult", 25:"multu", 26:"div", 27:"divu", 28:"dmult", 29:"dmultu", 30:"ddiv", 31:"ddivu",
32:"add", 33:"addu", 34:"sub", 35:"subu", 36:"and", 37:"or", 38:"xor", 39:"nor",
42:"slt", 43:"sltu", 44:"dadd", 45:"daddu",
48:"tge", 49:"tgeu", 50:"tlt", 51:"tltu", 52:"teq", 54:"tne",
56:"dsll", 59:"dsra", 60:"dsll32", 63:"dsra32",
}
branch1reg = {
0:"bltz", 1:"bgez", 2:"bltzl", 3:"bgezl",
8:"tgei", 9:"tgeiu", 10:"tlti", 11:"tltiu", 12:"tegi", 14:"tnei",
16:"bltzal", 17:"bgezal", 18:"bltall", 19:"bgczall",
}
floats = {
0:"add", 1:"sub", 2:"mul", 3:"div", 4:"sqrt", 5:"abs", 6:"mov", 7:"neg",
8:"round.l", 9:"trunc.l", 10:"ceil.l", 11:"floor.l", 12:"round.w", 13:"trunc.w", 14:"ceil.w", 15:"floor.w",
18:"movz", 19:"movn",
32:"cvt.s", 33:"cvt.d", 36:"cvt.w", 37:"cvt.l",
48:"c.f", 49:"c.un", 50:"c.eq", 51:"c.ueq", 52:"c.olt", 53:"c.ult", 54:"c.ole", 55:"c.ule",
56:"c.sf", 57:"c.ngle", 58:"c.seq", 59:"c.ngl", 60:"c.lt", 61:"c.nge", 62:"c.le", 63:"c.ngt",
}
def read_file(name):
file_data=[]
try:
with open(name, 'rb') as f:
file_data = f.read()
except IOError:
print('failed to read file ' + name)
return file_data
def float_reg(num):
if num == 31:
return "$31"
return "$f%d" % num
def get_op(inst):
return (inst & 0b11111100000000000000000000000000) >> 26
def get_func(inst):
return (inst & 0b00000000000000000000000000111111)
def get_rs(inst):
return (inst & 0b00000011111000000000000000000000) >> 21
def get_rt(inst):
return (inst & 0b00000000000111110000000000000000) >> 16
def get_rd(inst):
return (inst & 0b00000000000000001111100000000000) >> 11
def get_shift(inst):
return (inst & 0b00000000000000000000011111000000) >> 6
def get_ft(inst):
return (inst & 0b00000000000111110000000000000000) >> 16
def get_fs(inst):
return (inst & 0b00000000000000001111100000000000) >> 11
def get_fd(inst):
return (inst & 0b00000000000000000000011111000000) >> 6
def get_imm(inst):
return inst & 0b00000000000000001111111111111111
def get_signed_imm(inst):
imm = get_imm(inst)
if (imm & (1 << 15)) != 0:
imm = -2**15 + (imm & 0b00000000000000000111111111111111)
return imm
def is_load(inst):
return get_op(inst) > 31
def get_func_name(addr):
if addr in known_funcs:
return known_funcs[addr][0]
else:
return "func_%08X" % addr
def get_symbol_name(addr):
if addr in known_vars and known_vars[addr][0] != "":
return known_vars[addr][0]
else:
return "D_%08X" % addr
def write_header(file):
file.write(".set noat # allow use of $at\n.set noreorder # don't insert nops after branches\n.set gp=64 # allow use of 64bit registers\n\n");
# TODO add code_regions?
class Disassembler:
class File:
def __init__(self, name, data, vaddr):
self.name = name
self.data = data
self.vaddr = vaddr
self.size = len(data)
def get_inst(self, num):
offset = num*4
return struct.unpack('>I', self.data[offset:offset+4])[0]
def __init__(self):
self.files = list()
self.objects = set()
self.functions = set()
self.labels = set()
self.vars = set()
self.data_regions = list()
self.is_data_cache = {}
self.is_code_cache = {}
def load_defaults(self):
for file in known_files:
self.add_file(file[0], file[1], file[2])
self.add_object(file[2]) # assume every file starts with a object and function
self.add_function(file[2])
for region in file[3]:
self.add_data_region(region[0], region[1])
for addr in known_funcs:
self.add_function(addr)
for addr in known_objects:
self.add_object(addr)
self.add_function(addr) # assume every object starts with a function
for addr in known_vars:
self.add_variable(addr)
def add_file(self, path, name, vaddr):
self.files.append(self.File(name, read_file(path), vaddr))
self.is_data_cache = {}
self.is_code_cache = {}
def add_object(self, addr):
self.objects.add(addr)
def add_function(self, addr):
self.functions.add(addr)
def add_variable(self, addr):
self.vars.add(addr)
def add_label(self, addr):
self.labels.add(addr)
def add_data_region(self, start, end):
self.data_regions.append((start, end))
self.is_data_cache = {}
self.is_code_cache = {}
def is_in_data(self, addr):
if addr in self.is_data_cache:
return self.is_data_cache[addr]
start = 0;
last = len(self.data_regions) - 1
while start <= last:
midpoint = (start + last) // 2
if addr >= self.data_regions[midpoint][0]:
if addr <= self.data_regions[midpoint][1]:
self.is_data_cache[addr] = True
return True;
else:
start = midpoint + 1
else:
last = midpoint - 1
self.is_data_cache[addr] = False
return False
def is_in_code(self, addr):
if addr in self.is_code_cache:
return self.is_code_cache[addr]
start = 0;
last = len(self.files) - 1
while start <= last:
midpoint = (start + last) // 2
if addr >= self.files[midpoint].vaddr:
if addr < (self.files[midpoint].vaddr + self.files[midpoint].size):
self.is_code_cache[addr] = not self.is_in_data(addr)
return self.is_code_cache[addr];
else:
start = midpoint + 1
else:
last = midpoint - 1
self.is_code_cache[addr] = False
return False
def is_in_data_or_undef(self, addr):
# return true if it is in a defined data region
if self.is_in_data(addr):
return True
# otherwise return false if it is in a file's bounds
if self.is_in_code(addr):
return False
# otherwise it is undefined (return true)
return True
def make_label(self, imm, cur):
addr = (imm*4) + cur + 4
self.add_label(addr)
return ".L_%08X" % addr
def make_func(self, imm, cur):
addr = (imm*4) + (cur & 0xF0000000)
self.add_function(addr)
return get_func_name(addr)
def make_load(self, addr):
if self.is_in_data_or_undef(addr):
return get_symbol_name(addr)
else:
return get_func_name(addr)
# TODO refactor to remove file_addr
def get_object_name(self, addr, file_addr):
filename = "";
for file in self.files:
if file_addr == file.vaddr:
filename = file.name
if filename == "":
print("Bad file_addr passed to get_object_name: 0x%0X" % addr)
return
if SPLIT_FILES:
if addr in known_objects and known_objects[addr] != "": # no name means object boundary is known but not the name
return known_objects[addr]
else:
return '%s_0x%08X' % (filename, addr)
else:
return "%s" % filename
def guess_functions_from_data(self):
for file in self.files:
for i in range(0, file.size // 4):
word = file.get_inst(i)
addr = file.vaddr + i*4
if self.is_in_data(addr) and self.is_in_code(word):
self.add_function(word)
def disassemble(self, path):
# TODO keep sorted
self.files = sorted(self.files, key = lambda file: file.vaddr)
self.data_regions = sorted(self.data_regions, key = lambda region: region[0])
self.__first_pass()
self.guess_functions_from_data()
self.__second_pass(path)
def __first_pass(self):
for file in self.files:
for i in range(0, file.size // 4):
inst = file.get_inst(i)
addr = file.vaddr + i*4
if not self.is_in_data_or_undef(addr):
self.disassemble_inst(inst, addr, i, file)
if inst == 0x03E00008: # jr $ra
next_index = i+2
if file.get_inst(next_index) == 0: # nop
while file.get_inst(next_index) == 0:
next_index += 1
new_object_start = file.vaddr + next_index*4 + 15
new_object_start -= new_object_start % 16
# don't split if it's the start of a data section, it's probably the same object
if not self.is_in_data_or_undef(new_object_start):
self.add_object(new_object_start)
def __second_pass(self, path):
for file in self.files:
filename = path + '/%s.asm' % self.get_object_name(file.vaddr, file.vaddr);
with open(filename, 'w') as f:
write_header(f)
for i in range(0, file.size // 4):
inst = file.get_inst(i)
addr = file.vaddr + i*4
if addr in self.objects and SPLIT_FILES:
f.close();
filename = path + '/%s.asm' % self.get_object_name(addr, file.vaddr);
f = open(filename, 'w')
write_header(f)
if addr in self.labels:
f.write(".L_%08X:\n" % addr)
if addr in self.functions:
name = get_func_name(addr)
f.write("\n.global %s\n%s:\n" % (name, name))
if addr in self.vars:
name = self.make_load(addr)
f.write(".global %s\n%s:\n" % (name, name))
if not self.is_in_data_or_undef(addr):
f.write("/* %06d 0x%08X %08X */ %s\n" % (i, addr, inst, self.disassemble_inst(inst, addr, i, file)))
else:
f.write("/* %06d 0x%08X */ .word\t0x%08X\n" % (i, addr, inst))
def determine_load_ref(self, file, inst_i):
# TODO better detect when the register gets dirty
pc = file.vaddr + inst_i*4
cur_inst = file.get_inst(inst_i)
if get_op(cur_inst) != 15:
return
prev_was_jump = False
for i in range(1, 7): # TODO find a good limit
next_inst = file.get_inst(inst_i + i)
if get_op(next_inst) == 15 and get_rt(cur_inst) == get_rt(next_inst):
return # return if another lui overwrites reg
if (get_op(next_inst) == 9) and (get_rt(cur_inst) == get_rt(next_inst) == get_rs(next_inst)): # lui + addiu (move pointer)
addr = (get_imm(cur_inst) << 16) + get_signed_imm(next_inst)
if self.is_in_data_or_undef(addr):
self.add_variable(addr)
else:
self.add_function(addr)
loadHighRefs[pc] = addr
loadLowRefs[pc + 4*i] = addr
return
elif is_load(next_inst) and (get_rt(cur_inst) == get_rs(next_inst)): # lui + load (load pointer)
addr = (get_imm(cur_inst) << 16) + get_signed_imm(next_inst)
if self.is_in_data_or_undef(addr):
self.add_variable(addr)
else:
print("Warning: Pointer load location is in code 0x%08X" % addr)
self.add_variable(addr)
loadHighRefs[pc] = addr
loadLowRefs[pc + 4*i] = addr
return
# if this is a jump, mark to return after we evaluate the following instruction
if prev_was_jump:
return
if get_op(next_inst) == 2 or get_op(next_inst) == 3:
prev_was_jump = True
def disassemble_inst(self, inst, addr, i, file):
if inst == 0:
return "nop"
dis = ""
op_num = get_op(inst)
if op_num == 0:
func = get_func(inst)
if func == 1:
cc = (inst & (7 << 18)) >> 18
if (inst & (1 << 16)) == 0:
dis += "movf\t%s, %s, %d" % (regs[get_rd(inst)], regs[get_rs(inst)], cc)
else:
dis += "movt\t%s, %s, %d" % (regs[get_rd(inst)], regs[get_rs(inst)], cc)
else:
if func not in funcs:
dis += "func_error: %d" % func
else:
if func == 37 and get_rt(inst) == 0: # or with zero reg is move
return "move\t%s, %s" % (regs[get_rd(inst)], regs[get_rs(inst)])
dis += "%s\t" % funcs[func]
if func == 0 or func == 2 or func == 3 or func == 56 or func == 59 or func == 60 or func == 63: # sll, srl, sra, dsll, dsra dsll32, dsra32
dis += "%s, %s, %d" % (regs[get_rd(inst)], regs[get_rt(inst)], get_shift(inst))
elif func == 4 or func == 6 or func == 7: # sllv, srlv, srav
dis += "%s, %s, %s" % (regs[get_rd(inst)], regs[get_rt(inst)], regs[get_rs(inst)])
elif func == 8 or func == 9: # jr, jalr
dis += "%s" % regs[get_rs(inst)]
elif func == 13: # break
dis += "0x%05X" % ((inst & (0xFFFFF << 6)) >> 16) # TODO the error code is 20 bits in the manual, why does gas want something else?
elif func == 16 or func == 18: # mfhi, mflo
dis += "%s" % regs[get_rd(inst)]
elif func == 17 or func == 19: # mthi, mtlo
dis += "%s" % regs[get_rs(inst)]
elif func == 24 or func == 25 or func == 28 or func == 29: # mult, multu, dmult, dmultu
dis += "%s, %s" % (regs[get_rs(inst)], regs[get_rt(inst)])
elif func == 26 or func == 27 or func == 30 or func == 31: # div, divu, ddiv, ddivu
dis += "$zero, %s, %s" % (regs[get_rs(inst)], regs[get_rt(inst)]) # TODO why does this need $zero for gas to not think it's a macro?
elif func == 34 and get_rs(inst) == 0: # sub with $zero is neg
dis = "neg\t%s, %s" % (regs[get_rd(inst)], regs[get_rt(inst)])
elif func == 35 and get_rs(inst) == 0: # subu with $zero is negu
dis = "negu\t%s, %s" % (regs[get_rd(inst)], regs[get_rt(inst)])
elif func == 20 or func == 22 or func == 23: # doubleword ops
dis += "%s, %s, %s" % (regs[get_rd(inst)], regs[get_rt(inst)], regs[get_rs(inst)])
else: # add, sub, logical, etc.
dis += "%s, %s, %s" % (regs[get_rd(inst)], regs[get_rs(inst)], regs[get_rt(inst)])
# TODO traps
elif op_num == 1:
rt = get_rt(inst)
if rt not in branch1reg:
dis += "branch1reg_erro: %d" % rt
else:
# TODO traps
dis += "%s\t%s, %s" % (branch1reg[rt], regs[get_rs(inst)], self.make_label(get_signed_imm(inst), addr))
elif op_num == 16 or op_num == 17 or op_num == 18:
z = op_num - 16
rs = get_rs(inst)
if rs == 0:
dis += "mfc%d\t%s, %s" % (z, regs[get_rt(inst)], float_reg(get_rd(inst)) if z != 0 else "$%d" % get_rd(inst))
elif rs == 1:
dis += "dmfc%d\t%s, %s" % (z, regs[get_rt(inst)], float_reg(get_rd(inst)) if z != 0 else "$%d" % get_rd(inst))
elif rs == 2:
dis += "cfc%d\t%s, %s" % (z, regs[get_rt(inst)], float_reg(get_rd(inst)) if z != 0 else "$%d" % get_rd(inst))
elif rs == 4:
dis += "mtc%d\t%s, %s" % (z, regs[get_rt(inst)], float_reg(get_rd(inst)) if z != 0 else "$%d" % get_rd(inst))
elif rs == 5:
dis += "dmtc%d\t%s, %s" % (z, regs[get_rt(inst)], float_reg(get_rd(inst)) if z != 0 else "$%d" % get_rd(inst))
elif rs == 6:
dis += "ctc%d\t%s, %s" % (z, regs[get_rt(inst)], float_reg(get_rd(inst)) if z != 0 else "$%d" % get_rd(inst))
elif rs == 8:
dis += "bc%d%s%s %s" % (z, "f" if ((inst & (1 << 16)) == 0) else "t", "" if ((inst & (1 << 17)) == 0) else "l", self.make_label(get_signed_imm(inst), addr))
elif rs == 16 or rs == 17 or rs == 20 or rs == 21:
if z == 0:
func = get_func(inst)
if func == 1:
dis += "tlbr"
elif func == 2:
dis += "tlbwi"
elif func == 6:
dis += "tlbwr"
elif func == 8:
dis += "tlbp"
elif func == 24:
dis += "eret"
else:
# TODO deret?
dis += "cop0_error: %d" % func
elif z != 1:
dis += "cop_error: %d" % z
else:
if rs == 16:
f = "s"
elif rs == 17:
f = "d"
elif rs == 20:
f = "w"
elif rs == 21:
f = "l"
func = get_func(inst)
if func not in floats:
dis += "float_error: %d" % func
else:
dis += "%s.%s\t" % (floats[func], f)
if func == 0 or func == 1 or func == 2 or func == 3 or func == 18 or func == 19: # 3 op
dis += "%s, %s, %s" % (float_reg(get_fd(inst)), float_reg(get_fs(inst)), float_reg(get_ft(inst)))
elif (func == 4 or func == 5 or func == 6 or func == 7 or func == 8 or func == 9 or func == 10 or func == 11 or func == 12
or func == 13 or func == 14 or func == 15 or func == 32 or func == 33 or func == 36 or func == 37): # 2 op
dis += "%s, %s" % (float_reg(get_fd(inst)), float_reg(get_fs(inst)))
elif func == 50 or func == 60 or func == 62: # c.eq, c.lt, c.le
dis += "%s, %s" % (float_reg(get_fs(inst)), float_reg(get_ft(inst)))
else:
dis += "coproc_error: %d" % rs
elif op_num not in ops:
dis += "error: %d" % op_num
else:
dis += "%s\t" % ops[op_num]
if op_num == 2 or op_num == 3: # j, jal
dis += "%s" % self.make_func(inst & 0x3FFFFFF, addr);
elif op_num == 4 or op_num == 5 or op_num == 20 or op_num == 21: # beq, bne, beql, bnel
if op_num == 4 and get_rs(inst) == get_rt(inst) == 0: # beq with both zero regs is a branch always (b %label)
dis = "b\t%s" % self.make_label(get_signed_imm(inst), addr)
else:
if get_rt(inst) == 0: # branchs comparing to 0 have a shorthand
dis = "%s\t" % ("beqz" if op_num == 4 else "bnez" if op_num == 5 else "beqzl" if op_num == 20 else "bnezl")
dis += "%s, %s" % (regs[get_rs(inst)], self.make_label(get_signed_imm(inst), addr))
else:
dis += "%s, %s, %s" % (regs[get_rs(inst)], regs[get_rt(inst)], self.make_label(get_signed_imm(inst), addr))
elif op_num == 6 or op_num == 7 or op_num == 22 or op_num == 23: # blez, bgtz, blezl, bgtzl
dis += "%s, %s" % (regs[get_rs(inst)], self.make_label(get_signed_imm(inst), addr))
elif op_num == 8 or op_num == 9 or op_num == 10 or op_num == 11 or op_num == 24 or op_num == 25: # addi, addiu, slti, sltiu, daddi, daddiu
if op_num == 9 and get_rs(inst) == 0: # addiu with reg 0 is load immediate (li)
dis = "li\t%s, %d" % (regs[get_rt(inst)], get_signed_imm(inst))
elif op_num == 9 and addr in loadLowRefs: # addiu loading the lower half of a pointer
dis += "%s, %%lo(%s)" % (regs[get_rt(inst)], self.make_load(loadLowRefs[addr]))
else:
dis += "%s, %s, %d" % (regs[get_rt(inst)], regs[get_rs(inst)], get_signed_imm(inst))
elif op_num == 12 or op_num == 13 or op_num == 14: # andi, ori, xori
dis += "%s, %s, 0x%X" % (regs[get_rt(inst)], regs[get_rs(inst)], get_imm(inst))
elif op_num == 15: # lui
self.determine_load_ref(file, i)
if addr in loadHighRefs: # lui loading the higher half of a pointer
dis += "%s, %%hi(%s)" % (regs[get_rt(inst)], self.make_load(loadHighRefs[addr]))
else:
dis += "%s, 0x%04X" % (regs[get_rt(inst)], get_imm(inst))
elif (op_num == 32 or op_num == 33 or op_num == 34 or op_num == 35 or op_num == 38 or op_num == 40 or op_num == 41 or
op_num == 42 or op_num == 42 or op_num == 43 or op_num == 46 or op_num == 55 or op_num == 63): # load/stores
if addr in loadLowRefs: # loading with immediate forming lower half of pointer
dis += "%s, %%lo(%s)(%s)" % (regs[get_rt(inst)], self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
else:
dis += "%s, %d(%s)" % (regs[get_rt(inst)], get_signed_imm(inst), regs[get_rs(inst)])
elif op_num == 36 or op_num == 37: # lbu, lhu
if addr in loadLowRefs: # loading with immediate forming lower half of pointer
dis += "%s, %%lo(%s)(%s)" % (regs[get_rt(inst)], self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
else:
dis += "%s, %d(%s)" % (regs[get_rt(inst)], get_signed_imm(inst), regs[get_rs(inst)])
elif (op_num == 49 or op_num == 50 or op_num == 53 or op_num == 54 or op_num == 57 or op_num == 58 or
op_num == 61 or op_num == 62): # load/store between co-processors
if addr in loadLowRefs: # loading with immediate forming lower half of pointer
dis += "%s, %%lo(%s)(%s)" % (float_reg(get_rt(inst)), self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
else:
dis += "%s, %d(%s)" % (float_reg(get_rt(inst)), get_signed_imm(inst), regs[get_rs(inst)])
elif op_num == 47: # cache
if addr in loadLowRefs: # cache op with immediate forming lower half of pointer
dis += "0x%02X, %%lo(%s)(%s)" % (get_rt(inst), self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
else:
dis += "0x%02X, %d(%s)" % (get_rt(inst), get_signed_imm(inst), regs[get_rs(inst)])
return dis
def generate_headers(self, path):
with open(path + "functions.h", 'w', newline='\n') as f:
f.write("#ifndef _FUNCTIONS_H_\n#define _FUNCTIONS_H_\n\n");
f.write('#include <PR/ultratypes.h>\n#include <osint.h>\n#include <unk.h>\n#include <structs.h>\n\n');
for addr in sorted(self.functions):
if addr in known_funcs:
f.write("%s %s(%s); // func_%08X\n" % (known_funcs[addr][1], get_func_name(addr), known_funcs[addr][2], addr));
else:
f.write("// UNK_RET %s(UNK_ARGS);\n" % get_func_name(addr));
f.write("\n#endif\n");
with open(path + "variables.h", 'w', newline='\n') as f:
f.write("#ifndef _VARIABLES_H_\n#define _VARIABLES_H_\n\n");
f.write('#include <PR/ultratypes.h>\n#include <osint.h>\n#include <unk.h>\n#include <structs.h>\n\n');
for addr in sorted(self.vars):
if addr in known_vars:
f.write("extern %s %s%s; // D_%08X\n" % (known_vars[addr][1], self.make_load(addr), "[]" if known_vars[addr][2] else "", addr));
else:
f.write("//extern UNK_TYPE %s;\n" % self.make_load(addr));
f.write("\n// extra variables needed for one reason or another\n\n");
for (name, var_type) in extra_vars:
f.write("extern %s %s;\n" % (var_type, name));
f.write("\n#endif\n");
with open("undef.txt", 'w', newline='\n') as f:
for addr in sorted(self.vars):
f.write("%s = 0x%08X;\n" % (self.make_load(addr), addr));
# TODO not hard code
f.write("func_84001B0C = 0x84001B0C;\nfunc_840010CC = 0x840010CC;\nfunc_84001060 = 0x84001060;\nD_80920340 = 0x80920340;\nD_80922430 = 0x80922430;\n")
if __name__ == "__main__":
dis = Disassembler()
dis.load_defaults()
dis.disassemble('./asm/')
dis.generate_headers('./')

36
elf2rom.py Normal file
View File

@ -0,0 +1,36 @@
import os
import struct
FILENAME = 'build/rom.elf'
OUT = 'rom.z64'
try:
with open(FILENAME, 'rb') as f:
fileData = f.read()
except IOError:
print('failed to read file ' + FILENAME)
def read_uint32_be(offset):
return struct.unpack('>I', fileData[offset:offset+4])[0]
def read_uint16_be(offset):
return struct.unpack('>H', fileData[offset:offset+2])[0]
with open(OUT, 'wb') as w:
sht_off = read_uint32_be(0x20)
sh_size = read_uint16_be(0x2E)
num_sections = read_uint16_be(0x30)
total_size = 0
for i in range(0, num_sections):
type_ = read_uint32_be(sht_off + i*sh_size + 0x04)
offset = read_uint32_be(sht_off + i*sh_size + 0x10)
size = read_uint32_be(sht_off + i*sh_size + 0x14)
if type_ == 1:# SHT_PROGBITS
total_size += size
w.write(fileData[offset:offset+size])
while total_size < 0x2000000:
w.write((total_size % 256).to_bytes(1,"big"))
total_size += 1

1629
extract_rom.py Normal file

File diff suppressed because it is too large Load Diff

177
extract_textures.py Normal file
View File

@ -0,0 +1,177 @@
import struct;
from tkinter import *;
from tkinter.ttk import *
from PIL import Image, ImageTk, ImageDraw
import png;
#FILE_NAME = 'baserom/jpn_font_static'
FILE_NAME = 'decomp/object_boss03'
data = []
image_data = [];
try:
with open(FILE_NAME, 'rb') as f:
data = f.read()
except IOError:
print('failed to read file ' + FILE_NAME)
sys.exit(1)
#size = 0x80
height = 32
width = 32
pixel_width = 2
size = height*width*pixel_width
scale = 4
window = Tk()
window.title("MM Texture viewer")
window.geometry('500x500')
def load_file():
print('load')
update_image()
def read_i4_image(data, image_data):
for i in range(0, len(data)):
byte = data[i]
color1 = ((byte >> 4) & 0xF) * 17
color2 = (byte & 0xF) * 17
image_data.append(color1)
image_data.append(color1)
image_data.append(color1)
image_data.append(255)
image_data.append(color2)
image_data.append(color2)
image_data.append(color2)
image_data.append(255)
def read_i8_image(data, image_data):
for i in range(0, len(data)):
byte = data[i]
image_data.append(byte)
image_data.append(byte)
image_data.append(byte)
image_data.append(255)
def read_ia4_image(data, image_data):
None
def read_ia8_image(data, image_data):
None
def read_ia16_image(data, image_data):
None
def read_rbg5a1_image(data, image_data):
for i in range(0, len(data) // 2):
byte1 = data[i*2]
byte2 = data[i*2 + 1]
red = (byte1 >> 3)*8
green = (((byte1&0x7)<<2) | ((byte2>>6)&0x3))*8
blue = ((byte2 >> 1) & 0x1F)*8
alpha = (byte2&0x1)*0xFF
image_data.append(red)
image_data.append(green)
image_data.append(blue)
image_data.append(alpha)
def read_rbga32_image(data, image_data):
for i in range(0, len(data)):
byte = data[i]
image_data.append(byte)
def read_ci4_image(data, image_data):
None
def read_ci8_image(data, image_data):
None
def update_image(*args):
global image_label
global image_data
global data
image_data = []
texture_type = texture_type_combo.get()
if texture_type == 'i4':
read_i4_image(data, image_data)
elif texture_type == 'i8':
read_i8_image(data, image_data)
elif texture_type == 'ia4':
read_ia4_image(data, image_data)
elif texture_type == 'ia8':
read_ia8_image(data, image_data)
elif texture_type == 'ia16':
read_ia16_image(data, image_data)
elif texture_type == 'rbg5a1':
read_rbg5a1_image(data, image_data)
elif texture_type == 'rbga32':
read_rbga32_image(data, image_data)
elif texture_type == 'ci4':
read_ci4_image(data, image_data)
elif texture_type == 'ci8':
read_ci8_image(data, image_data)
else:
print('other type')
offset = int(offset_spinbox.get())
image = Image.frombytes("RGBA", (width, height), bytes(image_data[offset*4:])).resize((width*scale, height*scale))
image_tk = ImageTk.PhotoImage(image=image)
image_label.configure(image=image_tk)
image_label.image = image_tk # prevent GC?
load_button = Button(window, text='Load File', command=load_file)
load_button.pack()
texture_type_combo = Combobox(window)
texture_type_combo['values'] = ('i4', 'i8', 'ia4', 'ia8', 'ia16', 'rbg5a1', 'rbga32', 'ci4', 'ci8')
texture_type_combo.current(5)
texture_type_combo.bind("<<ComboboxSelected>>", update_image)
texture_type_combo.pack()
# TODO textures should be able to only take a few discret values, find them
width_default = StringVar(window)
width_default.set("32")
width_spinbox = Spinbox(window, from_=1, to=48, textvariable=width_default, command=update_image)
width_spinbox.pack();
offset_default = StringVar(window)
offset_default.set("0")
offset_spinbox = Spinbox(window, from_=0, to=len(data), textvariable=offset_default, command=update_image)
offset_spinbox.pack();
image_label = Label(window)
image_label.pack()
update_image()
window.mainloop()
#for i in range(0, len(data) // size):
# texture_data = data[(i * size):((i + 1) * size)]
#
# with open('font_test2/' + str(i) + '.png', 'wb') as f:
# w = png.Writer(width, height, alpha=True)#, greyscale=True)#
# png_data = [];
# for y in range(0, height):
# row = []
# '''
# for x in range(0, 16//2):
# byte = texture_data[8*y + x]
# row.append(((byte >> 4) & 0xF) * 17)
# row.append((byte & 0xF) * 17)
# '''
# '''
# for x in range(0, width*pixel_width):
# byte = texture_data[width*pixel_width*y + x]
# row.append(byte)
# '''
# png_data.append(row)
# w.write(f, png_data)

578
files.py Normal file
View File

@ -0,0 +1,578 @@
known_files = {
# TODO the data starts for the overlays are guesses based on the actor init vars location, should check
('baserom/boot', 'boot', 0x80080060, ((0x800969C0, 0x800A5ABF),)),
('decomp/code', 'code', 0x800A5AC0, ((0x80186028, 0x80186A6F),(0x801AAC04, 0x801E3F9C),)),
('decomp/ovl_En_Test', 'ovl_En_Test', 0x80862B70, ((0x808637B0, 0x8086386F),)),
('decomp/ovl_En_GirlA', 'ovl_En_GirlA', 0x80863870, ((0x80864A30, 0x8086536F),)),
('decomp/ovl_En_Part', 'ovl_En_Part', 0x80865370, ((0x808658E0, 0x8086598F),)),
('decomp/ovl_En_Light', 'ovl_En_Light', 0x80865990, ((0x808666B0, 0x808667FF),)),
('decomp/ovl_En_Door', 'ovl_En_Door', 0x80866800, ((0x808674B0, 0x80867BCF),)),
('decomp/ovl_En_Box', 'ovl_En_Box', 0x80867BD0, ((0x80869B30, 0x80869D8F),)),
('decomp/ovl_En_Pametfrog', 'ovl_En_Pametfrog', 0x80869D90, ((0x8086D940, 0x8086DE1F),)),
('decomp/ovl_En_Okuta', 'ovl_En_Okuta', 0x8086DE20, ((0x80870870, 0x80870DAF),)),
('decomp/ovl_En_Bom', 'ovl_En_Bom', 0x80870DB0, ((0x80872DA0, 0x8087480F),)),
('decomp/ovl_En_Wallmas', 'ovl_En_Wallmas', 0x80874810, ((0x80876340, 0x8087666F),)),
('decomp/ovl_En_Dodongo', 'ovl_En_Dodongo', 0x80876670, ((0x808790B0, 0x808796EF),)),
('decomp/ovl_En_Firefly', 'ovl_En_Firefly', 0x808796F0, ((0x8087B450, 0x8087B72F),)),
('decomp/ovl_En_Horse', 'ovl_En_Horse', 0x8087B730, ((0x80888EC0, 0x8088A23F),)),
('decomp/ovl_En_Arrow', 'ovl_En_Arrow', 0x8088A240, ((0x8088C1C0, 0x8088C50F),)),
('decomp/ovl_En_Elf', 'ovl_En_Elf', 0x8088C510, ((0x808909C0, 0x8089105F),)),
('decomp/ovl_En_Niw', 'ovl_En_Niw', 0x80891060, ((0x80893460, 0x808937EF),)),
('decomp/ovl_En_Tite', 'ovl_En_Tite', 0x808937F0, ((0x80896AB0, 0x80896F2F),)),
('decomp/ovl_En_Peehat', 'ovl_En_Peehat', 0x80896F30, ((0x80899410, 0x8089995F),)),
('decomp/ovl_En_Holl', 'ovl_En_Holl', 0x80899960, ((0x8089A530, 0x8089A6DF),)),
('decomp/ovl_En_Dinofos', 'ovl_En_Dinofos', 0x8089A6E0, ((0x8089E150, 0x8089E8DF),)),
('decomp/ovl_En_Hata', 'ovl_En_Hata', 0x8089E8E0, ((0x8089ED10, 0x8089ED8F),)),
('decomp/ovl_En_Zl1', 'ovl_En_Zl1', 0x8089ED90, ((0x8089EDD0, 0x8089EE1F),)),
('decomp/ovl_En_Viewer', 'ovl_En_Viewer', 0x8089EE20, ((0x8089F3E0, 0x8089F4DF),)),
('decomp/ovl_En_Bubble', 'ovl_En_Bubble', 0x8089F4E0, ((0x808A06E0, 0x808A08EF),)),
('decomp/ovl_Door_Shutter', 'ovl_Door_Shutter', 0x808A08F0, ((0x808A2160, 0x808A24CF),)),
('decomp/ovl_En_Boom', 'ovl_En_Boom', 0x808A24D0, ((0x808A2FF0, 0x808A31AF),)),
('decomp/ovl_En_Torch2', 'ovl_En_Torch2', 0x808A31B0, ((0x808A35B0, 0x808A366F),)),
('decomp/ovl_En_Minifrog', 'ovl_En_Minifrog', 0x808A3670, ((0x808A4D20, 0x808A504F),)),
('decomp/ovl_En_St', 'ovl_En_St', 0x808A5050, ((0x808A7590, 0x808A792F),)),
('decomp/ovl_Obj_Wturn', 'ovl_Obj_Wturn', 0x808A7930, ((0x808A7DA0, 0x808A7E2F),)),
('decomp/ovl_En_River_Sound', 'ovl_En_River_Sound', 0x808A7E30, ((0x808A8040, 0x808A809F),)),
('decomp/ovl_En_Ossan', 'ovl_En_Ossan', 0x808A80A0, ((0x808AC010, 0x808AC91F),)),
('decomp/ovl_En_Famos', 'ovl_En_Famos', 0x808AC920, ((0x808AE5E0, 0x808AE8BF),)),
('decomp/ovl_En_Bombf', 'ovl_En_Bombf', 0x808AE8C0, ((0x808AFB00, 0x808AFCCF),)),
('decomp/ovl_En_Am', 'ovl_En_Am', 0x808AFCD0, ((0x808B1050, 0x808B132F),)),
('decomp/ovl_En_Dekubaba', 'ovl_En_Dekubaba', 0x808B1330, ((0x808B4D40, 0x808B522F),)),
('decomp/ovl_En_M_Fire1', 'ovl_En_M_Fire1', 0x808B5230, ((0x808B5340, 0x808B53BF),)),
('decomp/ovl_En_M_Thunder', 'ovl_En_M_Thunder', 0x808B53C0, ((0x808B7100, 0x808B735F),)),
('decomp/ovl_Bg_Breakwall', 'ovl_Bg_Breakwall', 0x808B7360, ((0x808B8120, 0x808B848F),)),
('decomp/ovl_Door_Warp1', 'ovl_Door_Warp1', 0x808B8490, ((0x808BBB20, 0x808BC00F),)),
('decomp/ovl_Obj_Syokudai', 'ovl_Obj_Syokudai', 0x808BC010, ((0x808BCCA0, 0x808BCDEF),)),
('decomp/ovl_Item_B_Heart', 'ovl_Item_B_Heart', 0x808BCDF0, ((0x808BD160, 0x808BD1DF),)),
('decomp/ovl_En_Dekunuts', 'ovl_En_Dekunuts', 0x808BD1E0, ((0x808BEF10, 0x808BF21F),)),
('decomp/ovl_En_Bbfall', 'ovl_En_Bbfall', 0x808BF220, ((0x808C0D10, 0x808C102F),)),
('decomp/ovl_Arms_Hook', 'ovl_Arms_Hook', 0x808C1030, ((0x808C1BA0, 0x808C1D3F),)),
('decomp/ovl_En_Bb', 'ovl_En_Bb', 0x808C1D40, ((0x808C3780, 0x808C3A4F),)),
('decomp/ovl_Bg_Keikoku_Spr', 'ovl_Bg_Keikoku_Spr', 0x808C3A50, ((0x808C3BA0, 0x808C3BFF),)),
('decomp/ovl_En_Wood02', 'ovl_En_Wood02', 0x808C3C00, ((0x808C4CE0, 0x808C4F7F),)),
('decomp/ovl_En_Death', 'ovl_En_Death', 0x808C4F80, ((0x808C98C0, 0x808CA0AF),)),
('decomp/ovl_En_Minideath', 'ovl_En_Minideath', 0x808CA0B0, ((0x808CBF30, 0x808CC25F),)),
('decomp/ovl_En_Vm', 'ovl_En_Vm', 0x808CC260, ((0x808CD4A0, 0x808CD73F),)),
('decomp/ovl_Demo_Effect', 'ovl_Demo_Effect', 0x808CD740, ((0x808CE290, 0x808CE44F),)),
('decomp/ovl_Demo_Kankyo', 'ovl_Demo_Kankyo', 0x808CE450, ((0x808D03C0, 0x808D067F),)),
('decomp/ovl_En_Floormas', 'ovl_En_Floormas', 0x808D0680, ((0x808D3880, 0x808D3E1F),)),
('decomp/ovl_En_Rd', 'ovl_En_Rd', 0x808D3E20, ((0x808D70C0, 0x808D754F),)),
('decomp/ovl_Bg_F40_Flift', 'ovl_Bg_F40_Flift', 0x808D7550, ((0x808D7810, 0x808D78CF),)),
# ('decomp/ovl_Obj_Mure', 'ovl_Obj_Mure', 0x808D78D0, ((0x808D8760, 0x808D893F),)), # TODO figure this one out
('decomp/ovl_En_Sw', 'ovl_En_Sw', 0x808D8940, ((0x808DB9C0, 0x808DBE7F),)),
('decomp/ovl_Object_Kankyo', 'ovl_Object_Kankyo', 0x808DBE80, ((0x808DE320, 0x808DE5BF),)),
('decomp/ovl_En_Horse_Link_Child', 'ovl_En_Horse_Link_Child', 0x808DE5C0, ((0x808DFEA0, 0x808E019F),)),
('decomp/ovl_Door_Ana', 'ovl_Door_Ana', 0x808E01A0, ((0x808E0740, 0x808E082F),)),
('decomp/ovl_En_Encount1', 'ovl_En_Encount1', 0x808E0830, ((0x808E0DD0, 0x808E0E3F),)),
('decomp/ovl_Demo_Tre_Lgt', 'ovl_Demo_Tre_Lgt', 0x808E0E40, ((0x808E1490, 0x808E155F),)),
('decomp/ovl_En_Encount2', 'ovl_En_Encount2', 0x808E1560, ((0x808E1ED0, 0x808E1FDF),)),
('decomp/ovl_En_Fire_Rock', 'ovl_En_Fire_Rock', 0x808E1FE0, ((0x808E2020, 0x808E206F),)),
('decomp/ovl_Bg_Ctower_Rot', 'ovl_Bg_Ctower_Rot', 0x808E2070, ((0x808E2540, 0x808E25FF),)),
('decomp/ovl_Mir_Ray', 'ovl_Mir_Ray', 0x808E2600, ((0x808E3BD0, 0x808E3EEF),)),
('decomp/ovl_En_Sb', 'ovl_En_Sb', 0x808E3EF0, ((0x808E4DF0, 0x808E4FBF),)),
('decomp/ovl_En_Bigslime', 'ovl_En_Bigslime', 0x808E4FC0, ((0x808ED640, 0x808F11FF),)),
('decomp/ovl_En_Karebaba', 'ovl_En_Karebaba', 0x808F1200, ((0x808F2D80, 0x808F30AF),)),
('decomp/ovl_En_In', 'ovl_En_In', 0x808F30B0, ((0x808F6A40, 0x808F74AF),)),
('decomp/ovl_En_Bom_Chu', 'ovl_En_Bom_Chu', 0x808F74B0, ((0x808F88C0, 0x808F8A9F),)),
('decomp/ovl_En_Horse_Game_Check', 'ovl_En_Horse_Game_Check', 0x808F8AA0, ((0x808F9B00, 0x808F9DFF),)),
('decomp/ovl_En_Rr', 'ovl_En_Rr', 0x808F9E00, ((0x808FC130, 0x808FC54F),)),
('decomp/ovl_En_Fr', 'ovl_En_Fr', 0x808FC550, ((0x808FC670, 0x808FC6BF),)),
('decomp/ovl_Obj_Oshihiki', 'ovl_Obj_Oshihiki', 0x80917290, ((0x80918830, 0x80918B3F),)),
('decomp/ovl_Eff_Dust', 'ovl_Eff_Dust', 0x80918B40, ((0x80919D90, 0x80919F2F),)),
('decomp/ovl_Bg_Umajump', 'ovl_Bg_Umajump', 0x80919F30, ((0x8091A7F0, 0x8091A89F),)),
('decomp/ovl_En_Insect', 'ovl_En_Insect', 0x8091A8A0, ((0x8091BD60, 0x8091C09F),)),
('decomp/ovl_En_Butte', 'ovl_En_Butte', 0x8091C0A0, ((0x8091D2D0, 0x8091D62F),)),
('decomp/ovl_En_Fish', 'ovl_En_Fish', 0x8091D630, ((0x8091FA60, 0x8091FEEF),)),
('decomp/ovl_Item_Etcetera', 'ovl_Item_Etcetera', 0x8091FEF0, ((0x80920210, 0x8092033F),)),
('decomp/ovl_Arrow_Fire', 'ovl_Arrow_Fire', 0x80920340, ((0x80920DF0, 0x8092242F),)),
('decomp/ovl_Arrow_Ice', 'ovl_Arrow_Ice', 0x80922430, ((0x80922DB0, 0x809242FF),)),
('decomp/ovl_Arrow_Light', 'ovl_Arrow_Light', 0x80924300, ((0x80924C60, 0x809261AF),)),
('decomp/ovl_Obj_Kibako', 'ovl_Obj_Kibako', 0x809261B0, ((0x80927380, 0x809275BF),)),
('decomp/ovl_Obj_Tsubo', 'ovl_Obj_Tsubo', 0x809275C0, ((0x80929500, 0x8092990F),)),
('decomp/ovl_En_Ik', 'ovl_En_Ik', 0x80929910, ((0x8092BFA0, 0x8092C52F),)),
('decomp/ovl_Demo_Shd', 'ovl_Demo_Shd', 0x8092C530, ((0x8092C570, 0x8092C5BF),)),
('decomp/ovl_En_Dns', 'ovl_En_Dns', 0x8092C5C0, ((0x8092DCB0, 0x8092DF8F),)),
('decomp/ovl_Elf_Msg', 'ovl_Elf_Msg', 0x8092DF90, ((0x8092E450, 0x8092E50F),)),
('decomp/ovl_En_Honotrap', 'ovl_En_Honotrap', 0x8092E510, ((0x809303F0, 0x809307DF),)),
('decomp/ovl_En_Tubo_Trap', 'ovl_En_Tubo_Trap', 0x809307E0, ((0x80931410, 0x8093155F),)),
('decomp/ovl_Obj_Ice_Poly', 'ovl_Obj_Ice_Poly', 0x80931560, ((0x80932300, 0x8093248F),)),
('decomp/ovl_En_Fz', 'ovl_En_Fz', 0x80932490, ((0x809346D0, 0x809349DF),)),
('decomp/ovl_En_Kusa', 'ovl_En_Kusa', 0x809349E0, ((0x809366A0, 0x80936CEF),)),
('decomp/ovl_Obj_Bean', 'ovl_Obj_Bean', 0x80936CF0, ((0x80938F80, 0x809393AF),)),
('decomp/ovl_Obj_Bombiwa', 'ovl_Obj_Bombiwa', 0x809393B0, ((0x8093A920, 0x8093ABCF),)),
('decomp/ovl_Obj_Switch', 'ovl_Obj_Switch', 0x8093ABD0, ((0x8093CC60, 0x8093D3BF),)),
('decomp/ovl_Obj_Lift', 'ovl_Obj_Lift', 0x8093D3C0, ((0x8093DD30, 0x8093DE9F),)),
('decomp/ovl_Obj_Hsblock', 'ovl_Obj_Hsblock', 0x8093DEA0, ((0x8093E310, 0x8093E41F),)),
('decomp/ovl_En_Okarina_Tag', 'ovl_En_Okarina_Tag', 0x8093E420, ((0x8093E810, 0x8093E89F),)),
('decomp/ovl_En_Goroiwa', 'ovl_En_Goroiwa', 0x8093E8A0, ((0x80942DA0, 0x809434AF),)),
('decomp/ovl_En_Daiku', 'ovl_En_Daiku', 0x809434B0, ((0x80944040, 0x809441DF),)),
('decomp/ovl_En_Nwc', 'ovl_En_Nwc', 0x809441E0, ((0x80945370, 0x809454EF),)),
('decomp/ovl_Item_Inbox', 'ovl_Item_Inbox', 0x809454F0, ((0x80945600, 0x8094564F),)),
('decomp/ovl_En_Ge1', 'ovl_En_Ge1', 0x80945650, ((0x809464B0, 0x8094669F),)),
('decomp/ovl_Obj_Blockstop', 'ovl_Obj_Blockstop', 0x809466A0, ((0x80946880, 0x809468CF),)),
('decomp/ovl_En_Sda', 'ovl_En_Sda', 0x809468D0, ((0x80947A40, 0x80947F5F),)),
('decomp/ovl_En_Clear_Tag', 'ovl_En_Clear_Tag', 0x80947F60, ((0x8094AD40, 0x8094DEDF),)),
('decomp/ovl_En_Gm', 'ovl_En_Gm', 0x8094DEE0, ((0x80951820, 0x8095261F),)),
('decomp/ovl_En_Ms', 'ovl_En_Ms', 0x80952620, ((0x80952B80, 0x80952C4F),)),
('decomp/ovl_En_Hs', 'ovl_En_Hs', 0x80952C50, ((0x809538F0, 0x80953A8F),)),
('decomp/ovl_Bg_Ingate', 'ovl_Bg_Ingate', 0x80953A90, ((0x809548A0, 0x8095495F),)),
('decomp/ovl_En_Kanban', 'ovl_En_Kanban', 0x80954960, ((0x809572E0, 0x809580BF),)),
('decomp/ovl_En_Attack_Niw', 'ovl_En_Attack_Niw', 0x809580C0, ((0x80959100, 0x809592DF),)),
('decomp/ovl_En_Mk', 'ovl_En_Mk', 0x809592E0, ((0x8095A240, 0x8095A50F),)),
('decomp/ovl_En_Owl', 'ovl_En_Owl', 0x8095A510, ((0x8095D2D0, 0x8095D6DF),)),
('decomp/ovl_En_Ishi', 'ovl_En_Ishi', 0x8095D6E0, ((0x8095F690, 0x8095FB0F),)),
('decomp/ovl_Obj_Hana', 'ovl_Obj_Hana', 0x8095FB10, ((0x8095FB90, 0x8095FBEF),)),
('decomp/ovl_Obj_Lightswitch', 'ovl_Obj_Lightswitch', 0x8095FBF0, ((0x80960B70, 0x80960CEF),)),
('decomp/ovl_Obj_Mure2', 'ovl_Obj_Mure2', 0x80960CF0, ((0x80961570, 0x809616DF),)),
('decomp/ovl_En_Fu', 'ovl_En_Fu', 0x809616E0, ((0x80964AE0, 0x8096564F),)),
('decomp/ovl_En_Stream', 'ovl_En_Stream', 0x80965650, ((0x80965B00, 0x80965BAF),)),
('decomp/ovl_En_Mm', 'ovl_En_Mm', 0x80965BB0, ((0x80966320, 0x8096640F),)),
('decomp/ovl_En_Weather_Tag', 'ovl_En_Weather_Tag', 0x80966410, ((0x809677A0, 0x809679CF),)),
('decomp/ovl_En_Ani', 'ovl_En_Ani', 0x809679D0, ((0x80968650, 0x809687AF),)),
('decomp/ovl_En_Js', 'ovl_En_Js', 0x809687B0, ((0x8096AB80, 0x8096B09F),)),
('decomp/ovl_En_Okarina_Effect', 'ovl_En_Okarina_Effect', 0x8096B0A0, ((0x8096B290, 0x8096B30F),)),
('decomp/ovl_En_Mag', 'ovl_En_Mag', 0x8096B310, ((0x8096E910, 0x8096EC3F),)),
('decomp/ovl_Elf_Msg2', 'ovl_Elf_Msg2', 0x8096EC40, ((0x8096F090, 0x8096F15F),)),
('decomp/ovl_Bg_F40_Swlift', 'ovl_Bg_F40_Swlift', 0x8096F160, ((0x8096F510, 0x8096F5DF),)),
('decomp/ovl_En_Kakasi', 'ovl_En_Kakasi', 0x8096F5E0, ((0x80971D80, 0x8097234F),)),
('decomp/ovl_Obj_Makeoshihiki', 'ovl_Obj_Makeoshihiki', 0x80972350, ((0x80972630, 0x8097267F),)),
('decomp/ovl_Oceff_Spot', 'ovl_Oceff_Spot', 0x80972680, ((0x80972D80, 0x8097354F),)),
('decomp/ovl_En_Torch', 'ovl_En_Torch', 0x80973550, ((0x809735E0, 0x8097363F),)),
('decomp/ovl_Shot_Sun', 'ovl_Shot_Sun', 0x80973640, ((0x80973B80, 0x80973C4F),)),
('decomp/ovl_Obj_Roomtimer', 'ovl_Obj_Roomtimer', 0x80973C50, ((0x80973E90, 0x80973EEF),)),
('decomp/ovl_En_Ssh', 'ovl_En_Ssh', 0x80973EF0, ((0x80976010, 0x809764AF),)),
('decomp/ovl_Oceff_Wipe', 'ovl_Oceff_Wipe', 0x809764B0, ((0x80976980, 0x8097720F),)),
('decomp/ovl_Oceff_Storm', 'ovl_Oceff_Storm', 0x80981760, ((0x80981F70, 0x8098351F),)),
('decomp/ovl_Obj_Demo', 'ovl_Obj_Demo', 0x80983520, ((0x80983890, 0x809838EF),)),
('decomp/ovl_En_Minislime', 'ovl_En_Minislime', 0x809838F0, ((0x809857C0, 0x80985C3F),)),
('decomp/ovl_En_Nutsball', 'ovl_En_Nutsball', 0x80985C40, ((0x809861D0, 0x8098626F),)),
('decomp/ovl_Oceff_Wipe2', 'ovl_Oceff_Wipe2', 0x80986270, ((0x80986670, 0x809879DF),)),
('decomp/ovl_Oceff_Wipe3', 'ovl_Oceff_Wipe3', 0x809879E0, ((0x80987DF0, 0x8098913F),)),
('decomp/ovl_En_Dg', 'ovl_En_Dg', 0x80989140, ((0x8098C280, 0x8098CA1F),)),
('decomp/ovl_En_Si', 'ovl_En_Si', 0x8098CA20, ((0x8098CD60, 0x8098CE3F),)),
('decomp/ovl_Obj_Comb', 'ovl_Obj_Comb', 0x8098CE40, ((0x8098E420, 0x8098E5BF),)),
('decomp/ovl_Obj_Kibako2', 'ovl_Obj_Kibako2', 0x8098E5C0, ((0x8098EE40, 0x8098EF5F),)),
('decomp/ovl_En_Hs2', 'ovl_En_Hs2', 0x8098EF60, ((0x8098EFF0, 0x8098F03F),)),
('decomp/ovl_Obj_Mure3', 'ovl_Obj_Mure3', 0x8098F040, ((0x8098F720, 0x8098F7FF),)),
('decomp/ovl_En_Tg', 'ovl_En_Tg', 0x8098F800, ((0x809901A0, 0x8099030F),)),
('decomp/ovl_En_Wf', 'ovl_En_Wf', 0x80990310, ((0x80994150, 0x809947AF),)),
('decomp/ovl_En_Skb', 'ovl_En_Skb', 0x809947B0, ((0x80997330, 0x80997A8F),)),
('decomp/ovl_En_Gs', 'ovl_En_Gs', 0x80997A90, ((0x8099A380, 0x8099A91F),)),
('decomp/ovl_Obj_Sound', 'ovl_Obj_Sound', 0x8099A920, ((0x8099AAE0, 0x8099AB2F),)),
('decomp/ovl_En_Crow', 'ovl_En_Crow', 0x8099AB30, ((0x8099C050, 0x8099C28F),)),
('decomp/ovl_En_Cow', 'ovl_En_Cow', 0x8099C290, ((0x8099D5F0, 0x8099D77F),)),
('decomp/ovl_Oceff_Wipe4', 'ovl_Oceff_Wipe4', 0x8099D780, ((0x8099DB90, 0x8099E78F),)),
('decomp/ovl_En_Zo', 'ovl_En_Zo', 0x8099E790, ((0x8099F490, 0x8099F72F),)),
('decomp/ovl_Obj_Makekinsuta', 'ovl_Obj_Makekinsuta', 0x8099FA40, ((0x8099FE10, 0x8099FEAF),)),
('decomp/ovl_En_Ge3', 'ovl_En_Ge3', 0x8099FEB0, ((0x809A0D80, 0x809A0F1F),)),
('decomp/ovl_Obj_Hamishi', 'ovl_Obj_Hamishi', 0x809A0F20, ((0x809A1A80, 0x809A1BAF),)),
('decomp/ovl_En_Zl4', 'ovl_En_Zl4', 0x809A1BB0, ((0x809A1F60, 0x809A202F),)),
('decomp/ovl_En_Mm2', 'ovl_En_Mm2', 0x809A2030, ((0x809A2250, 0x809A2B5F),)),
('decomp/ovl_Door_Spiral', 'ovl_Door_Spiral', 0x809A2B60, ((0x809A3230, 0x809A33DF),)),
('decomp/ovl_Obj_Pzlblock', 'ovl_Obj_Pzlblock', 0x809A33E0, ((0x809A4030, 0x809A41BF),)),
('decomp/ovl_Obj_Toge', 'ovl_Obj_Toge', 0x809A41C0, ((0x809A4C90, 0x809A4DFF),)),
('decomp/ovl_Obj_Armos', 'ovl_Obj_Armos', 0x809A4E00, ((0x809A5B90, 0x809A5D0F),)),
('decomp/ovl_Obj_Boyo', 'ovl_Obj_Boyo', 0x809A5D10, ((0x809A6150, 0x809A627F),)),
('decomp/ovl_En_Grasshopper', 'ovl_En_Grasshopper', 0x809A6280, ((0x809A8C80, 0x809A910F),)),
('decomp/ovl_Obj_Grass', 'ovl_Obj_Grass', 0x809A9110, ((0x809AA9F0, 0x809AAE5F),)),
('decomp/ovl_Obj_Grass_Carry', 'ovl_Obj_Grass_Carry', 0x809AAE60, ((0x809ABBB0, 0x809ABDDF),)),
('decomp/ovl_Obj_Grass_Unit', 'ovl_Obj_Grass_Unit', 0x809ABDE0, ((0x809AC340, 0x809AC4AF),)),
('decomp/ovl_Bg_Fire_Wall', 'ovl_Bg_Fire_Wall', 0x809AC4B0, ((0x809ACC40, 0x809ACD8F),)),
('decomp/ovl_En_Bu', 'ovl_En_Bu', 0x809ACD90, ((0x809ACED0, 0x809ACF3F),)),
('decomp/ovl_En_Encount3', 'ovl_En_Encount3', 0x809ACF40, ((0x809AD7F0, 0x809AD8DF),)),
('decomp/ovl_En_Jso', 'ovl_En_Jso', 0x809AD8E0, ((0x809B0F40, 0x809B154F),)),
('decomp/ovl_Obj_Chikuwa', 'ovl_Obj_Chikuwa', 0x809B1550, ((0x809B1FA0, 0x809B20EF),)),
('decomp/ovl_En_Knight', 'ovl_En_Knight', 0x809B20F0, ((0x809BDAF0, 0x809C075F),)),
('decomp/ovl_En_Warp_tag', 'ovl_En_Warp_tag', 0x809C0760, ((0x809C0FE0, 0x809C10AF),)),
('decomp/ovl_En_Aob_01', 'ovl_En_Aob_01', 0x809C10B0, ((0x809C3770, 0x809C3D7F),)),
('decomp/ovl_En_Boj_01', 'ovl_En_Boj_01', 0x809C3D80, ((0x809C3DC0, 0x809C3E0F),)),
('decomp/ovl_En_Boj_02', 'ovl_En_Boj_02', 0x809C3E10, ((0x809C3E50, 0x809C3E9F),)),
('decomp/ovl_En_Boj_03', 'ovl_En_Boj_03', 0x809C3EA0, ((0x809C3EE0, 0x809C3F2F),)),
('decomp/ovl_En_Encount4', 'ovl_En_Encount4', 0x809C3F30, ((0x809C46B0, 0x809C478F),)),
('decomp/ovl_En_Bom_Bowl_Man', 'ovl_En_Bom_Bowl_Man', 0x809C4790, ((0x809C6100, 0x809C64BF),)),
('decomp/ovl_En_Syateki_Man', 'ovl_En_Syateki_Man', 0x809C64C0, ((0x809C9160, 0x809C9A5F),)),
('decomp/ovl_Bg_Icicle', 'ovl_Bg_Icicle', 0x809C9A60, ((0x809CA2B0, 0x809CA3EF),)),
('decomp/ovl_En_Syateki_Crow', 'ovl_En_Syateki_Crow', 0x809CA3F0, ((0x809CB050, 0x809CB1FF),)),
('decomp/ovl_En_Boj_04', 'ovl_En_Boj_04', 0x809CB200, ((0x809CB240, 0x809CB28F),)),
('decomp/ovl_En_Cne_01', 'ovl_En_Cne_01', 0x809CB290, ((0x809CBEE0, 0x809CC05F),)),
('decomp/ovl_En_Bba_01', 'ovl_En_Bba_01', 0x809CC060, ((0x809CCC60, 0x809CCDDF),)),
('decomp/ovl_En_Bji_01', 'ovl_En_Bji_01', 0x809CCDE0, ((0x809CDC30, 0x809CDEBF),)),
('decomp/ovl_Bg_Spdweb', 'ovl_Bg_Spdweb', 0x809CDEC0, ((0x809CF060, 0x809CF34F),)),
('decomp/ovl_En_Mt_tag', 'ovl_En_Mt_tag', 0x809CF350, ((0x809D0190, 0x809D052F),)),
('decomp/ovl_Boss_01', 'ovl_Boss_01', 0x809D0530, ((0x809D7980, 0x809DA1CF),)),
('decomp/ovl_Boss_02', 'ovl_Boss_02', 0x809DA1D0, ((0x809DF550, 0x809E275F),)),
('decomp/ovl_Boss_03', 'ovl_Boss_03', 0x809E2760, ((0x809E8EA0, 0x809EC03F),)),
('decomp/ovl_Boss_04', 'ovl_Boss_04', 0x809EC040, ((0x809EE150, 0x809EE4DF),)),
('decomp/ovl_Boss_05', 'ovl_Boss_05', 0x809EE4E0, ((0x809F1A20, 0x809F211F),)),
('decomp/ovl_Boss_06', 'ovl_Boss_06', 0x809F2120, ((0x809F4080, 0x809F497F),)),
('decomp/ovl_Boss_07', 'ovl_Boss_07', 0x809F4980, ((0x80A07950, 0x80A0A89F),)),
('decomp/ovl_Bg_Dy_Yoseizo', 'ovl_Bg_Dy_Yoseizo', 0x80A0A8A0, ((0x80A0C4A0, 0x80A0C77F),)),
('decomp/ovl_En_Boj_05', 'ovl_En_Boj_05', 0x80A0C780, ((0x80A0C7C0, 0x80A0C80F),)),
('decomp/ovl_En_Sob1', 'ovl_En_Sob1', 0x80A0C810, ((0x80A10860, 0x80A10FCF),)),
('decomp/ovl_En_Go', 'ovl_En_Go', 0x80A10FD0, ((0x80A16100, 0x80A16D3F),)),
('decomp/ovl_En_Raf', 'ovl_En_Raf', 0x80A16D40, ((0x80A18EC0, 0x80A1973F),)),
('decomp/ovl_Obj_Funen', 'ovl_Obj_Funen', 0x80A19740, ((0x80A198B0, 0x80A1990F),)),
('decomp/ovl_Obj_Raillift', 'ovl_Obj_Raillift', 0x80A19910, ((0x80A1A390, 0x80A1A4FF),)),
('decomp/ovl_Bg_Numa_Hana', 'ovl_Bg_Numa_Hana', 0x80A1A500, ((0x80A1B240, 0x80A1B3CF),)),
('decomp/ovl_Obj_Flowerpot', 'ovl_Obj_Flowerpot', 0x80A1B3D0, ((0x80A1D380, 0x80A1DA4F),)),
('decomp/ovl_Obj_Spinyroll', 'ovl_Obj_Spinyroll', 0x80A1DA50, ((0x80A1F020, 0x80A1F40F),)),
('decomp/ovl_Dm_Hina', 'ovl_Dm_Hina', 0x80A1F410, ((0x80A1FDB0, 0x80A1FE4F),)),
('decomp/ovl_En_Syateki_Wf', 'ovl_En_Syateki_Wf', 0x80A1FE50, ((0x80A20E50, 0x80A2114F),)),
('decomp/ovl_Obj_Skateblock', 'ovl_Obj_Skateblock', 0x80A21150, ((0x80A229F0, 0x80A22D3F),)),
('decomp/ovl_Obj_Iceblock', 'ovl_Obj_Iceblock', 0x80A23090, ((0x80A26E30, 0x80A2751F),)),
('decomp/ovl_En_Bigpamet', 'ovl_En_Bigpamet', 0x80A27520, ((0x80A296E0, 0x80A29A7F),)),
('decomp/ovl_Bg_Dblue_Movebg', 'ovl_Bg_Dblue_Movebg', 0x80A29A80, ((0x80A2B870, 0x80A2BBFF),)),
('decomp/ovl_En_Syateki_Dekunuts', 'ovl_En_Syateki_Dekunuts', 0x80A2BC00, ((0x80A2CA90, 0x80A2CD0F),)),
('decomp/ovl_Elf_Msg3', 'ovl_Elf_Msg3', 0x80A2CD10, ((0x80A2D1C0, 0x80A2D27F),)),
('decomp/ovl_En_Fg', 'ovl_En_Fg', 0x80A2D280, ((0x80A2E4E0, 0x80A2E79F),)),
('decomp/ovl_Dm_Ravine', 'ovl_Dm_Ravine', 0x80A2E7A0, ((0x80A2E910, 0x80A2E95F),)),
('decomp/ovl_Dm_Sa', 'ovl_Dm_Sa', 0x80A2E960, ((0x80A2ECE0, 0x80A2ED9F),)),
('decomp/ovl_En_Slime', 'ovl_En_Slime', 0x80A2EDA0, ((0x80A31AD0, 0x80A3220F),)),
('decomp/ovl_En_Pr', 'ovl_En_Pr', 0x80A32210, ((0x80A338A0, 0x80A33AFF),)),
('decomp/ovl_Obj_Toudai', 'ovl_Obj_Toudai', 0x80A33B00, ((0x80A34570, 0x80A346FF),)),
('decomp/ovl_Obj_Entotu', 'ovl_Obj_Entotu', 0x80A34700, ((0x80A353F0, 0x80A3550F),)),
('decomp/ovl_Obj_Bell', 'ovl_Obj_Bell', 0x80A35510, ((0x80A35E70, 0x80A35FEF),)),
('decomp/ovl_En_Syateki_Okuta', 'ovl_En_Syateki_Okuta', 0x80A35FF0, ((0x80A37550, 0x80A37ECF),)),
('decomp/ovl_Obj_Shutter', 'ovl_Obj_Shutter', 0x80A37ED0, ((0x80A38110, 0x80A3818F),)),
('decomp/ovl_Dm_Zl', 'ovl_Dm_Zl', 0x80A38190, ((0x80A387D0, 0x80A3899F),)),
('decomp/ovl_En_Ru', 'ovl_En_Ru', 0x80A389A0, ((0x80A39430, 0x80A396AF),)),
('decomp/ovl_En_Elfgrp', 'ovl_En_Elfgrp', 0x80A396B0, ((0x80A3AAD0, 0x80A3AC5F),)),
('decomp/ovl_Dm_Tsg', 'ovl_Dm_Tsg', 0x80A3AC60, ((0x80A3B010, 0x80A3B07F),)),
('decomp/ovl_En_Baguo', 'ovl_En_Baguo', 0x80A3B080, ((0x80A3C2D0, 0x80A3C4DF),)),
('decomp/ovl_Obj_Vspinyroll', 'ovl_Obj_Vspinyroll', 0x80A3C4E0, ((0x80A3D430, 0x80A3D67F),)),
('decomp/ovl_Obj_Smork', 'ovl_Obj_Smork', 0x80A3D680, ((0x80A3E270, 0x80A3E38F),)),
('decomp/ovl_En_Test2', 'ovl_En_Test2', 0x80A3E390, ((0x80A3E690, 0x80A3E7DF),)),
('decomp/ovl_En_Test3', 'ovl_En_Test3', 0x80A3E7E0, ((0x80A41530, 0x80A41D6F),)),
('decomp/ovl_En_Test4', 'ovl_En_Test4', 0x80A41D70, ((0x80A43320, 0x80A434DF),)),
('decomp/ovl_En_Bat', 'ovl_En_Bat', 0x80A434E0, ((0x80A449E0, 0x80A44C7F),)),
('decomp/ovl_En_Sekihi', 'ovl_En_Sekihi', 0x80A44C80, ((0x80A45250, 0x80A4535F),)),
('decomp/ovl_En_Wiz', 'ovl_En_Wiz', 0x80A45360, ((0x80A48B30, 0x80A48FDF),)),
('decomp/ovl_En_Wiz_Brock', 'ovl_En_Wiz_Brock', 0x80A48FE0, ((0x80A495B0, 0x80A4969F),)),
('decomp/ovl_En_Wiz_Fire', 'ovl_En_Wiz_Fire', 0x80A496A0, ((0x80A4C1C0, 0x80A4C48F),)),
('decomp/ovl_Eff_Change', 'ovl_Eff_Change', 0x80A4C490, ((0x80A4C900, 0x80A4C9AF),)),
('decomp/ovl_Dm_Statue', 'ovl_Dm_Statue', 0x80A4C9B0, ((0x80A4CA40, 0x80A4CA8F),)),
('decomp/ovl_Obj_Fireshield', 'ovl_Obj_Fireshield', 0x80A4CA90, ((0x80A4D800, 0x80A4D9EF),)),
('decomp/ovl_Bg_Ladder', 'ovl_Bg_Ladder', 0x80A4D9F0, ((0x80A4DE20, 0x80A4DECF),)),
('decomp/ovl_En_Mkk', 'ovl_En_Mkk', 0x80A4DED0, ((0x80A4F700, 0x80A4FA3F),)),
('decomp/ovl_Demo_Getitem', 'ovl_Demo_Getitem', 0x80A4FA40, ((0x80A4FD40, 0x80A4FDCF),)),
('decomp/ovl_En_Dnb', 'ovl_En_Dnb', 0x80A4FDD0, ((0x80A50C90, 0x80A50D3F),)),
('decomp/ovl_En_Dnh', 'ovl_En_Dnh', 0x80A50D40, ((0x80A51250, 0x80A514EF),)),
('decomp/ovl_En_Dnk', 'ovl_En_Dnk', 0x80A514F0, ((0x80A521A0, 0x80A5252F),)),
('decomp/ovl_En_Dnq', 'ovl_En_Dnq', 0x80A52530, ((0x80A53400, 0x80A537CF),)),
('decomp/ovl_Bg_Keikoku_Saku', 'ovl_Bg_Keikoku_Saku', 0x80A537D0, ((0x80A53B50, 0x80A53BDF),)),
('decomp/ovl_Obj_Hugebombiwa', 'ovl_Obj_Hugebombiwa', 0x80A53BE0, ((0x80A55CE0, 0x80A560BF),)),
('decomp/ovl_En_Firefly2', 'ovl_En_Firefly2', 0x80A560C0, ((0x80A56100, 0x80A5614F),)),
('decomp/ovl_En_Rat', 'ovl_En_Rat', 0x80A56150, ((0x80A583E0, 0x80A5879F),)),
('decomp/ovl_En_Water_Effect', 'ovl_En_Water_Effect', 0x80A587A0, ((0x80A5AF90, 0x80A5B15F),)),
('decomp/ovl_En_Kusa2', 'ovl_En_Kusa2', 0x80A5B160, ((0x80A5EAA0, 0x80A60B1F),)),
('decomp/ovl_Bg_Spout_Fire', 'ovl_Bg_Spout_Fire', 0x80A60B20, ((0x80A61140, 0x80A612AF),)),
('decomp/ovl_En_Dy_Extra', 'ovl_En_Dy_Extra', 0x80A612B0, ((0x80A61720, 0x80A6180F),)),
('decomp/ovl_En_Bal', 'ovl_En_Bal', 0x80A61810, ((0x80A63CC0, 0x80A6449F),)),
('decomp/ovl_En_Ginko_Man', 'ovl_En_Ginko_Man', 0x80A644A0, ((0x80A65D40, 0x80A6617F),)),
('decomp/ovl_En_Warp_Uzu', 'ovl_En_Warp_Uzu', 0x80A66180, ((0x80A664A0, 0x80A6656F),)),
('decomp/ovl_Obj_Driftice', 'ovl_Obj_Driftice', 0x80A66570, ((0x80A67600, 0x80A678AF),)),
('decomp/ovl_En_Look_Nuts', 'ovl_En_Look_Nuts', 0x80A678B0, ((0x80A685E0, 0x80A6879F),)),
('decomp/ovl_En_Mushi2', 'ovl_En_Mushi2', 0x80A687A0, ((0x80A6B930, 0x80A6BF8F),)),
('decomp/ovl_En_Fall', 'ovl_En_Fall', 0x80A6BF90, ((0x80A6E490, 0x80A6F09F),)),
('decomp/ovl_En_Mm3', 'ovl_En_Mm3', 0x80A6F0A0, ((0x80A703D0, 0x80A706EF),)),
('decomp/ovl_Bg_Crace_Movebg', 'ovl_Bg_Crace_Movebg', 0x80A706F0, ((0x80A71080, 0x80A711CF),)),
('decomp/ovl_En_Dno', 'ovl_En_Dno', 0x80A711D0, ((0x80A739A0, 0x80A73F9F),)),
('decomp/ovl_En_Pr2', 'ovl_En_Pr2', 0x80A73FA0, ((0x80A75BC0, 0x80A75DBF),)),
('decomp/ovl_En_Prz', 'ovl_En_Prz', 0x80A75DC0, ((0x80A771C0, 0x80A773BF),)),
('decomp/ovl_En_Jso2', 'ovl_En_Jso2', 0x80A773C0, ((0x80A7B4F0, 0x80A7BC6F),)),
('decomp/ovl_Obj_Etcetera', 'ovl_Obj_Etcetera', 0x80A7BC70, ((0x80A7C770, 0x80A7C98F),)),
('decomp/ovl_En_Egol', 'ovl_En_Egol', 0x80A7C990, ((0x80A80C40, 0x80A811CF),)),
('decomp/ovl_Obj_Mine', 'ovl_Obj_Mine', 0x80A811D0, ((0x80A84550, 0x80A84CCF),)),
('decomp/ovl_Obj_Purify', 'ovl_Obj_Purify', 0x80A84CD0, ((0x80A85460, 0x80A8561F),)),
('decomp/ovl_En_Tru', 'ovl_En_Tru', 0x80A85620, ((0x80A88910, 0x80A8B76F),)),
('decomp/ovl_En_Trt', 'ovl_En_Trt', 0x80A8B770, ((0x80A8FE10, 0x80A903AF),)),
('decomp/ovl_En_Test5', 'ovl_En_Test5', 0x80A903B0, ((0x80A906E0, 0x80A9072F),)),
('decomp/ovl_En_Test6', 'ovl_En_Test6', 0x80A90730, ((0x80A93E60, 0x80A94A2F),)),
('decomp/ovl_En_Az', 'ovl_En_Az', 0x80A94A30, ((0x80A99010, 0x80A99E9F),)),
('decomp/ovl_En_Estone', 'ovl_En_Estone', 0x80A99EA0, ((0x80A9AB50, 0x80A9ACCF),)),
('decomp/ovl_Bg_Hakugin_Post', 'ovl_Bg_Hakugin_Post', 0x80A9ACD0, ((0x80A9D860, 0x80A9F94F),)),
('decomp/ovl_Dm_Opstage', 'ovl_Dm_Opstage', 0x80A9F950, ((0x80A9FD10, 0x80A9FDAF),)),
('decomp/ovl_Dm_Stk', 'ovl_Dm_Stk', 0x80A9FDB0, ((0x80AA3580, 0x80AA557F),)),
('decomp/ovl_Dm_Char00', 'ovl_Dm_Char00', 0x80AA5580, ((0x80AA6F90, 0x80AA81DF),)),
('decomp/ovl_Dm_Char01', 'ovl_Dm_Char01', 0x80AA81E0, ((0x80AA9DC0, 0x80AAAE2F),)),
('decomp/ovl_Dm_Char02', 'ovl_Dm_Char02', 0x80AAAE30, ((0x80AAB390, 0x80AAB49F),)),
('decomp/ovl_Dm_Char03', 'ovl_Dm_Char03', 0x80AAB4A0, ((0x80AABB60, 0x80AABC3F),)),
('decomp/ovl_Dm_Char04', 'ovl_Dm_Char04', 0x80AABC40, ((0x80AAC440, 0x80AAC59F),)),
('decomp/ovl_Dm_Char05', 'ovl_Dm_Char05', 0x80AAC5A0, ((0x80AAE240, 0x80AAE67F),)),
('decomp/ovl_Dm_Char06', 'ovl_Dm_Char06', 0x80AAE680, ((0x80AAE960, 0x80AAE9BF),)),
('decomp/ovl_Dm_Char07', 'ovl_Dm_Char07', 0x80AAE9C0, ((0x80AAEFF0, 0x80AAF04F),)),
('decomp/ovl_Dm_Char08', 'ovl_Dm_Char08', 0x80AAF050, ((0x80AB1370, 0x80AB1E0F),)),
('decomp/ovl_Dm_Char09', 'ovl_Dm_Char09', 0x80AB1E10, ((0x80AB2690, 0x80AB278F),)),
('decomp/ovl_Obj_Tokeidai', 'ovl_Obj_Tokeidai', 0x80AB2790, ((0x80AB49C0, 0x80AB4D0F),)),
('decomp/ovl_En_Mnk', 'ovl_En_Mnk', 0x80AB4D10, ((0x80AB9CF0, 0x80ABA79F),)),
('decomp/ovl_En_Egblock', 'ovl_En_Egblock', 0x80ABA7A0, ((0x80ABB040, 0x80ABB0DF),)),
('decomp/ovl_En_Guard_Nuts', 'ovl_En_Guard_Nuts', 0x80ABB0E0, ((0x80ABBDD0, 0x80ABBFBF),)),
('decomp/ovl_Bg_Hakugin_Bombwall', 'ovl_Bg_Hakugin_Bombwall', 0x80ABBFC0, ((0x80ABCF60, 0x80ABD1CF),)),
('decomp/ovl_Obj_Tokei_Tobira', 'ovl_Obj_Tokei_Tobira', 0x80ABD1D0, ((0x80ABD730, 0x80ABD82F),)),
('decomp/ovl_Bg_Hakugin_Elvpole', 'ovl_Bg_Hakugin_Elvpole', 0x80ABD830, ((0x80ABDC50, 0x80ABDC9F),)),
('decomp/ovl_En_Ma4', 'ovl_En_Ma4', 0x80ABDCA0, ((0x80AC0090, 0x80AC082F),)),
('decomp/ovl_En_Twig', 'ovl_En_Twig', 0x80AC0830, ((0x80AC1090, 0x80AC126F),)),
('decomp/ovl_En_Po_Fusen', 'ovl_En_Po_Fusen', 0x80AC1270, ((0x80AC1D80, 0x80AC1ECF),)),
('decomp/ovl_En_Door_Etc', 'ovl_En_Door_Etc', 0x80AC1ED0, ((0x80AC2580, 0x80AC26EF),)),
('decomp/ovl_En_Bigokuta', 'ovl_En_Bigokuta', 0x80AC26F0, ((0x80AC4510, 0x80AC48EF),)),
('decomp/ovl_Bg_Icefloe', 'ovl_Bg_Icefloe', 0x80AC48F0, ((0x80AC4F10, 0x80AC506F),)),
('decomp/ovl_Obj_Ocarinalift', 'ovl_Obj_Ocarinalift', 0x80AC94C0, ((0x80AC9D50, 0x80AC9E9F),)),
('decomp/ovl_En_Time_Tag', 'ovl_En_Time_Tag', 0x80AC9EA0, ((0x80ACA9D0, 0x80ACAB0F),)),
('decomp/ovl_Bg_Open_Shutter', 'ovl_Bg_Open_Shutter', 0x80ACAB10, ((0x80ACB120, 0x80ACB1DF),)),
('decomp/ovl_Bg_Open_Spot', 'ovl_Bg_Open_Spot', 0x80ACB1E0, ((0x80ACB390, 0x80ACB3FF),)),
('decomp/ovl_Bg_Fu_Kaiten', 'ovl_Bg_Fu_Kaiten', 0x80ACB400, ((0x80ACB630, 0x80ACB69F),)),
('decomp/ovl_Obj_Aqua', 'ovl_Obj_Aqua', 0x80ACB6A0, ((0x80ACC2A0, 0x80ACC46F),)),
('decomp/ovl_En_Elforg', 'ovl_En_Elforg', 0x80ACC470, ((0x80ACDA10, 0x80ACDCCF),)),
('decomp/ovl_En_Elfbub', 'ovl_En_Elfbub', 0x80ACDCD0, ((0x80ACE250, 0x80ACE32F),)),
('decomp/ovl_En_Fu_Mato', 'ovl_En_Fu_Mato', 0x80ACE330, ((0x80ACF5F0, 0x80ACF77F),)),
('decomp/ovl_En_Fu_Kago', 'ovl_En_Fu_Kago', 0x80ACF780, ((0x80AD05D0, 0x80AD082F),)),
('decomp/ovl_En_Osn', 'ovl_En_Osn', 0x80AD0830, ((0x80AD22A0, 0x80AD2B6F),)),
('decomp/ovl_Bg_Ctower_Gear', 'ovl_Bg_Ctower_Gear', 0x80AD2B70, ((0x80AD3250, 0x80AD337F),)),
('decomp/ovl_En_Trt2', 'ovl_En_Trt2', 0x80AD3380, ((0x80AD57E0, 0x80AD5BAF),)),
('decomp/ovl_Obj_Tokei_Step', 'ovl_Obj_Tokei_Step', 0x80AD5BB0, ((0x80AD6600, 0x80AD675F),)),
('decomp/ovl_Bg_Lotus', 'ovl_Bg_Lotus', 0x80AD6760, ((0x80AD6CF0, 0x80AD6DCF),)),
('decomp/ovl_En_Kame', 'ovl_En_Kame', 0x80AD6DD0, ((0x80AD8DC0, 0x80AD923F),)),
('decomp/ovl_Obj_Takaraya_Wall', 'ovl_Obj_Takaraya_Wall', 0x80AD9240, ((0x80ADA280, 0x80ADAAEF),)),
('decomp/ovl_Bg_Fu_Mizu', 'ovl_Bg_Fu_Mizu', 0x80ADAAF0, ((0x80ADAD80, 0x80ADADCF),)),
('decomp/ovl_En_Sellnuts', 'ovl_En_Sellnuts', 0x80ADADD0, ((0x80ADD910, 0x80ADE22F),)),
('decomp/ovl_Bg_Dkjail_Ivy', 'ovl_Bg_Dkjail_Ivy', 0x80ADE230, ((0x80ADE930, 0x80ADEA6F),)),
('decomp/ovl_Obj_Visiblock', 'ovl_Obj_Visiblock', 0x80ADEA70, ((0x80ADEB30, 0x80ADEB8F),)),
('decomp/ovl_En_Takaraya', 'ovl_En_Takaraya', 0x80ADEB90, ((0x80ADFAE0, 0x80ADFC9F),)),
('decomp/ovl_En_Tsn', 'ovl_En_Tsn', 0x80ADFCA0, ((0x80AE1170, 0x80AE164F),)),
('decomp/ovl_En_Ds2n', 'ovl_En_Ds2n', 0x80AE1650, ((0x80AE1AB0, 0x80AE1B6F),)),
('decomp/ovl_En_Fsn', 'ovl_En_Fsn', 0x80AE1B70, ((0x80AE5B00, 0x80AE612F),)),
('decomp/ovl_En_Shn', 'ovl_En_Shn', 0x80AE6130, ((0x80AE6F00, 0x80AE739F),)),
('decomp/ovl_En_Stop_heishi', 'ovl_En_Stop_heishi', 0x80AE73A0, ((0x80AE8890, 0x80AE8B6F),)),
('decomp/ovl_Obj_Bigicicle', 'ovl_Obj_Bigicicle', 0x80AE8B70, ((0x80AE9800, 0x80AE9A1F),)),
('decomp/ovl_En_Lift_Nuts', 'ovl_En_Lift_Nuts', 0x80AE9A20, ((0x80AEBD30, 0x80AEC45F),)),
('decomp/ovl_En_Tk', 'ovl_En_Tk', 0x80AEC460, ((0x80AEF800, 0x80AF005F),)),
('decomp/ovl_Bg_Market_Step', 'ovl_Bg_Market_Step', 0x80AF0060, ((0x80AF00F0, 0x80AF016F),)),
('decomp/ovl_Obj_Lupygamelift', 'ovl_Obj_Lupygamelift', 0x80AF0170, ((0x80AF0720, 0x80AF081F),)),
('decomp/ovl_En_Test7', 'ovl_En_Test7', 0x80AF0820, ((0x80AF33F0, 0x80AF390F),)),
('decomp/ovl_Obj_Lightblock', 'ovl_Obj_Lightblock', 0x80AF3910, ((0x80AF3E80, 0x80AF3F6F),)),
('decomp/ovl_Mir_Ray2', 'ovl_Mir_Ray2', 0x80AF3F70, ((0x80AF4330, 0x80AF43EF),)),
('decomp/ovl_En_Wdhand', 'ovl_En_Wdhand', 0x80AF43F0, ((0x80AF63C0, 0x80AF675F),)),
('decomp/ovl_En_Gamelupy', 'ovl_En_Gamelupy', 0x80AF6760, ((0x80AF6CD0, 0x80AF6DDF),)),
('decomp/ovl_Bg_Danpei_Movebg', 'ovl_Bg_Danpei_Movebg', 0x80AF6DE0, ((0x80AF7510, 0x80AF763F),)),
('decomp/ovl_En_Snowwd', 'ovl_En_Snowwd', 0x80AF7640, ((0x80AF7A70, 0x80AF7B3F),)),
('decomp/ovl_En_Pm', 'ovl_En_Pm', 0x80AF7B40, ((0x80AFAD80, 0x80AFC95F),)),
('decomp/ovl_En_Gakufu', 'ovl_En_Gakufu', 0x80AFC960, ((0x80AFD1B0, 0x80AFD37F),)),
('decomp/ovl_Elf_Msg4', 'ovl_Elf_Msg4', 0x80AFD380, ((0x80AFD8D0, 0x80AFD98F),)),
('decomp/ovl_Elf_Msg5', 'ovl_Elf_Msg5', 0x80AFD990, ((0x80AFDBB0, 0x80AFDC3F),)),
('decomp/ovl_En_Col_Man', 'ovl_En_Col_Man', 0x80AFDC40, ((0x80AFE730, 0x80AFE89F),)),
('decomp/ovl_En_Talk_Gibud', 'ovl_En_Talk_Gibud', 0x80AFE8A0, ((0x80B011E0, 0x80B0198F),)),
('decomp/ovl_En_Giant', 'ovl_En_Giant', 0x80B01990, ((0x80B02930, 0x80B02CCF),)),
('decomp/ovl_Obj_Snowball', 'ovl_Obj_Snowball', 0x80B02CD0, ((0x80B04F30, 0x80B0528F),)),
('decomp/ovl_Boss_Hakugin', 'ovl_Boss_Hakugin', 0x80B05290, ((0x80B0E6E0, 0x80B0F5DF),)),
('decomp/ovl_En_Gb2', 'ovl_En_Gb2', 0x80B0F5E0, ((0x80B11990, 0x80B11E5F),)),
('decomp/ovl_En_Onpuman', 'ovl_En_Onpuman', 0x80B11E60, ((0x80B12370, 0x80B1242F),)),
('decomp/ovl_Bg_Tobira01', 'ovl_Bg_Tobira01', 0x80B12430, ((0x80B12800, 0x80B1286F),)),
('decomp/ovl_En_Tag_Obj', 'ovl_En_Tag_Obj', 0x80B12870, ((0x80B12900, 0x80B1297F),)),
('decomp/ovl_Obj_Dhouse', 'ovl_Obj_Dhouse', 0x80B12980, ((0x80B13E70, 0x80B1417F),)),
('decomp/ovl_Obj_Hakaisi', 'ovl_Obj_Hakaisi', 0x80B14180, ((0x80B15590, 0x80B1578F),)),
('decomp/ovl_Bg_Hakugin_Switch', 'ovl_Bg_Hakugin_Switch', 0x80B15790, ((0x80B16840, 0x80B16AFF),)),
('decomp/ovl_En_Snowman', 'ovl_En_Snowman', 0x80B16B00, ((0x80B199E0, 0x80B19F5F),)),
('decomp/ovl_TG_Sw', 'ovl_TG_Sw', 0x80B19F60, ((0x80B1A320, 0x80B1A3AF),)),
('decomp/ovl_En_Po_Sisters', 'ovl_En_Po_Sisters', 0x80B1A3B0, ((0x80B1DA30, 0x80B1DEAF),)),
('decomp/ovl_En_Pp', 'ovl_En_Pp', 0x80B1DEB0, ((0x80B21620, 0x80B21AFF),)),
('decomp/ovl_En_Hakurock', 'ovl_En_Hakurock', 0x80B21B00, ((0x80B22A60, 0x80B22BFF),)),
('decomp/ovl_En_Hanabi', 'ovl_En_Hanabi', 0x80B22C00, ((0x80B23A80, 0x80B23D4F),)),
('decomp/ovl_Obj_Dowsing', 'ovl_Obj_Dowsing', 0x80B23D50, ((0x80B23E80, 0x80B23ECF),)),
('decomp/ovl_Obj_Wind', 'ovl_Obj_Wind', 0x80B23ED0, ((0x80B24460, 0x80B2462F),)),
('decomp/ovl_En_Racedog', 'ovl_En_Racedog', 0x80B24630, ((0x80B25D20, 0x80B2629F),)),
('decomp/ovl_En_Kendo_Js', 'ovl_En_Kendo_Js', 0x80B262A0, ((0x80B27C10, 0x80B2807F),)),
('decomp/ovl_Bg_Botihasira', 'ovl_Bg_Botihasira', 0x80B28080, ((0x80B282D0, 0x80B2836F),)),
('decomp/ovl_En_Fish2', 'ovl_En_Fish2', 0x80B28370, ((0x80B2B2E0, 0x80B2B82F),)),
('decomp/ovl_En_Pst', 'ovl_En_Pst', 0x80B2B830, ((0x80B2C200, 0x80B2C6EF),)),
('decomp/ovl_En_Poh', 'ovl_En_Poh', 0x80B2C6F0, ((0x80B2F660, 0x80B2FB0F),)),
('decomp/ovl_Obj_Spidertent', 'ovl_Obj_Spidertent', 0x80B2FB10, ((0x80B31040, 0x80B3158F),)),
('decomp/ovl_En_Zoraegg', 'ovl_En_Zoraegg', 0x80B31590, ((0x80B33910, 0x80B33D2F),)),
('decomp/ovl_En_Kbt', 'ovl_En_Kbt', 0x80B33D30, ((0x80B34B20, 0x80B34F6F),)),
('decomp/ovl_En_Gg', 'ovl_En_Gg', 0x80B34F70, ((0x80B36BE0, 0x80B3707F),)),
('decomp/ovl_En_Maruta', 'ovl_En_Maruta', 0x80B37080, ((0x80B38680, 0x80B38E1F),)),
('decomp/ovl_Obj_Snowball2', 'ovl_Obj_Snowball2', 0x80B38E20, ((0x80B3A8C0, 0x80B3AC4F),)),
('decomp/ovl_En_Gg2', 'ovl_En_Gg2', 0x80B3AC50, ((0x80B3BEE0, 0x80B3C25F),)),
('decomp/ovl_Obj_Ghaka', 'ovl_Obj_Ghaka', 0x80B3C260, ((0x80B3C940, 0x80B3CA1F),)),
('decomp/ovl_En_Dnp', 'ovl_En_Dnp', 0x80B3CA20, ((0x80B3DC60, 0x80B3DFEF),)),
('decomp/ovl_En_Dai', 'ovl_En_Dai', 0x80B3DFF0, ((0x80B3FBD0, 0x80B4007F),)),
('decomp/ovl_Bg_Goron_Oyu', 'ovl_Bg_Goron_Oyu', 0x80B40080, ((0x80B40760, 0x80B407FF),)),
('decomp/ovl_En_Kgy', 'ovl_En_Kgy', 0x80B40800, ((0x80B43250, 0x80B439AF),)),
('decomp/ovl_En_Invadepoh', 'ovl_En_Invadepoh', 0x80B439B0, ((0x80B4E890, 0x80B5040F),)),
('decomp/ovl_En_Gk', 'ovl_En_Gk', 0x80B50410, ((0x80B531F0, 0x80B5383F),)),
('decomp/ovl_En_An', 'ovl_En_An', 0x80B53840, ((0x80B581D0, 0x80B5A71F),)),
('decomp/ovl_En_Bee', 'ovl_En_Bee', 0x80B5A720, ((0x80B5B1F0, 0x80B5B2DF),)),
('decomp/ovl_En_Ot', 'ovl_En_Ot', 0x80B5B2E0, ((0x80B5E380, 0x80B5E88F),)),
('decomp/ovl_En_Dragon', 'ovl_En_Dragon', 0x80B5E890, ((0x80B605D0, 0x80B60ACF),)),
('decomp/ovl_Obj_Dora', 'ovl_Obj_Dora', 0x80B60AD0, ((0x80B612F0, 0x80B615DF),)),
('decomp/ovl_En_Bigpo', 'ovl_En_Bigpo', 0x80B615E0, ((0x80B64FF0, 0x80B654BF),)),
('decomp/ovl_Obj_Kendo_Kanban', 'ovl_Obj_Kendo_Kanban', 0x80B654C0, ((0x80B66640, 0x80B66A1F),)),
('decomp/ovl_Obj_Hariko', 'ovl_Obj_Hariko', 0x80B66A20, ((0x80B66CB0, 0x80B66D2F),)),
('decomp/ovl_En_Sth', 'ovl_En_Sth', 0x80B66D30, ((0x80B685A0, 0x80B6D65F),)),
('decomp/ovl_Bg_Sinkai_Kabe', 'ovl_Bg_Sinkai_Kabe', 0x80B6D660, ((0x80B6DB50, 0x80B6DBDF),)),
('decomp/ovl_Bg_Haka_Curtain', 'ovl_Bg_Haka_Curtain', 0x80B6DBE0, ((0x80B6DF80, 0x80B6E01F),)),
('decomp/ovl_Bg_Kin2_Bombwall', 'ovl_Bg_Kin2_Bombwall', 0x80B6E020, ((0x80B6E6D0, 0x80B6E81F),)),
('decomp/ovl_Bg_Kin2_Fence', 'ovl_Bg_Kin2_Fence', 0x80B6E820, ((0x80B6EDC0, 0x80B6EF9F),)),
('decomp/ovl_Bg_Kin2_Picture', 'ovl_Bg_Kin2_Picture', 0x80B6EFA0, ((0x80B6F970, 0x80B6FB2F),)),
('decomp/ovl_Bg_Kin2_Shelf', 'ovl_Bg_Kin2_Shelf', 0x80B6FB30, ((0x80B70730, 0x80B708BF),)),
('decomp/ovl_En_Rail_Skb', 'ovl_En_Rail_Skb', 0x80B708C0, ((0x80B732B0, 0x80B73A8F),)),
('decomp/ovl_En_Jg', 'ovl_En_Jg', 0x80B73A90, ((0x80B75800, 0x80B7602F),)),
('decomp/ovl_En_Tru_Mt', 'ovl_En_Tru_Mt', 0x80B76030, ((0x80B774F0, 0x80B7776F),)),
('decomp/ovl_Obj_Um', 'ovl_Obj_Um', 0x80B77770, ((0x80B7C0F0, 0x80B7C88F),)),
('decomp/ovl_En_Neo_Reeba', 'ovl_En_Neo_Reeba', 0x80B7C890, ((0x80B7E4E0, 0x80B7E92F),)),
('decomp/ovl_Bg_Mbar_Chair', 'ovl_Bg_Mbar_Chair', 0x80B7E930, ((0x80B7EA00, 0x80B7EA5F),)),
('decomp/ovl_Bg_Ikana_Block', 'ovl_Bg_Ikana_Block', 0x80B7EA60, ((0x80B7F620, 0x80B7F72F),)),
('decomp/ovl_Bg_Ikana_Mirror', 'ovl_Bg_Ikana_Mirror', 0x80B7F730, ((0x80B7FF30, 0x80B802DF),)),
('decomp/ovl_Bg_Ikana_Rotaryroom', 'ovl_Bg_Ikana_Rotaryroom', 0x80B802E0, ((0x80B820C0, 0x80B823AF),)),
('decomp/ovl_Bg_Dblue_Balance', 'ovl_Bg_Dblue_Balance', 0x80B823B0, ((0x80B83A00, 0x80B83C7F),)),
('decomp/ovl_Bg_Dblue_Waterfall', 'ovl_Bg_Dblue_Waterfall', 0x80B83C80, ((0x80B85350, 0x80B8558F),)),
('decomp/ovl_En_Kaizoku', 'ovl_En_Kaizoku', 0x80B85590, ((0x80B8A8D0, 0x80B8B2CF),)),
('decomp/ovl_En_Ge2', 'ovl_En_Ge2', 0x80B8B2D0, ((0x80B8CE20, 0x80B8D02F),)),
('decomp/ovl_En_Ma_Yts', 'ovl_En_Ma_Yts', 0x80B8D030, ((0x80B8E150, 0x80B8E51F),)),
('decomp/ovl_En_Ma_Yto', 'ovl_En_Ma_Yto', 0x80B8E520, ((0x80B913F0, 0x80B91CBF),)),
('decomp/ovl_Obj_Tokei_Turret', 'ovl_Obj_Tokei_Turret', 0x80B91CC0, ((0x80B91EA0, 0x80B91F1F),)),
('decomp/ovl_Bg_Dblue_Elevator', 'ovl_Bg_Dblue_Elevator', 0x80B91F20, ((0x80B92940, 0x80B92B0F),)),
('decomp/ovl_Obj_Warpstone', 'ovl_Obj_Warpstone', 0x80B92B10, ((0x80B93200, 0x80B9330F),)),
('decomp/ovl_En_Zog', 'ovl_En_Zog', 0x80B93310, ((0x80B95860, 0x80B95E1F),)),
('decomp/ovl_Obj_Rotlift', 'ovl_Obj_Rotlift', 0x80B95E20, ((0x80B96140, 0x80B961DF),)),
('decomp/ovl_Obj_Jg_Gakki', 'ovl_Obj_Jg_Gakki', 0x80B961E0, ((0x80B963C0, 0x80B9640F),)),
('decomp/ovl_Bg_Inibs_Movebg', 'ovl_Bg_Inibs_Movebg', 0x80B96410, ((0x80B96540, 0x80B965CF),)),
('decomp/ovl_En_Zot', 'ovl_En_Zot', 0x80B965D0, ((0x80B998C0, 0x80B9A0AF),)),
('decomp/ovl_Obj_Tree', 'ovl_Obj_Tree', 0x80B9A0B0, ((0x80B9A550, 0x80B9A64F),)),
('decomp/ovl_Obj_Y2lift', 'ovl_Obj_Y2lift', 0x80B9A650, ((0x80B9A920, 0x80B9A97F),)),
('decomp/ovl_Obj_Y2shutter', 'ovl_Obj_Y2shutter', 0x80B9A980, ((0x80B9AE50, 0x80B9AF4F),)),
('decomp/ovl_Obj_Boat', 'ovl_Obj_Boat', 0x80B9AF50, ((0x80B9B660, 0x80B9B6DF),)),
('decomp/ovl_Obj_Taru', 'ovl_Obj_Taru', 0x80B9B6E0, ((0x80B9C320, 0x80B9C44F),)),
('decomp/ovl_Obj_Hunsui', 'ovl_Obj_Hunsui', 0x80B9C450, ((0x80B9DC70, 0x80B9DEDF),)),
('decomp/ovl_En_Jc_Mato', 'ovl_En_Jc_Mato', 0x80B9DEE0, ((0x80B9E1F0, 0x80B9E2BF),)),
('decomp/ovl_Mir_Ray3', 'ovl_Mir_Ray3', 0x80B9E2C0, ((0x80B9F400, 0x80B9F56F),)),
('decomp/ovl_En_Zob', 'ovl_En_Zob', 0x80B9F570, ((0x80BA10B0, 0x80BA159F),)),
('decomp/ovl_Elf_Msg6', 'ovl_Elf_Msg6', 0x80BA15A0, ((0x80BA22E0, 0x80BA241F),)),
('decomp/ovl_Obj_Nozoki', 'ovl_Obj_Nozoki', 0x80BA2420, ((0x80BA3490, 0x80BA36BF),)),
('decomp/ovl_En_Toto', 'ovl_En_Toto', 0x80BA36C0, ((0x80BA4FD0, 0x80BA53FF),)),
('decomp/ovl_En_Railgibud', 'ovl_En_Railgibud', 0x80BA5400, ((0x80BA80A0, 0x80BA881F),)),
('decomp/ovl_En_Baba', 'ovl_En_Baba', 0x80BA8820, ((0x80BAA380, 0x80BAA6CF),)),
('decomp/ovl_En_Suttari', 'ovl_En_Suttari', 0x80BAA6D0, ((0x80BAE6B0, 0x80BAEF6F),)),
('decomp/ovl_En_Zod', 'ovl_En_Zod', 0x80BAEF70, ((0x80BB0520, 0x80BB08DF),)),
('decomp/ovl_En_Kujiya', 'ovl_En_Kujiya', 0x80BB08E0, ((0x80BB1500, 0x80BB16CF),)),
('decomp/ovl_En_Geg', 'ovl_En_Geg', 0x80BB16D0, ((0x80BB3E50, 0x80BB46FF),)),
('decomp/ovl_Obj_Kinoko', 'ovl_Obj_Kinoko', 0x80BB4700, ((0x80BB4A70, 0x80BB4AEF),)),
('decomp/ovl_Obj_Yasi', 'ovl_Obj_Yasi', 0x80BB4AF0, ((0x80BB4D70, 0x80BB4DFF),)),
('decomp/ovl_En_Tanron1', 'ovl_En_Tanron1', 0x80BB4E00, ((0x80BB5E00, 0x80BB67CF),)),
('decomp/ovl_En_Tanron2', 'ovl_En_Tanron2', 0x80BB67D0, ((0x80BB8150, 0x80BB859F),)),
('decomp/ovl_En_Tanron3', 'ovl_En_Tanron3', 0x80BB85A0, ((0x80BB9720, 0x80BB98DF),)),
('decomp/ovl_Obj_Chan', 'ovl_Obj_Chan', 0x80BB98E0, ((0x80BBAB10, 0x80BBAC9F),)),
('decomp/ovl_En_Zos', 'ovl_En_Zos', 0x80BBACA0, ((0x80BBC6D0, 0x80BBCA7F),)),
('decomp/ovl_En_S_Goro', 'ovl_En_S_Goro', 0x80BBCA80, ((0x80BBF800, 0x80BBFDAF),)),
('decomp/ovl_En_Nb', 'ovl_En_Nb', 0x80BBFDB0, ((0x80BC13F0, 0x80BC18FF),)),
('decomp/ovl_En_Ja', 'ovl_En_Ja', 0x80BC1900, ((0x80BC35F0, 0x80BC397F),)),
('decomp/ovl_Bg_F40_Block', 'ovl_Bg_F40_Block', 0x80BC3980, ((0x80BC4600, 0x80BC47AF),)),
('decomp/ovl_Bg_F40_Switch', 'ovl_Bg_F40_Switch', 0x80BC47B0, ((0x80BC4DD0, 0x80BC4F2F),)),
('decomp/ovl_En_Po_Composer', 'ovl_En_Po_Composer', 0x80BC4F30, ((0x80BC6760, 0x80BC6BEF),)),
('decomp/ovl_En_Guruguru', 'ovl_En_Guruguru', 0x80BC6BF0, ((0x80BC7960, 0x80BC7ACF),)),
('decomp/ovl_Oceff_Wipe5', 'ovl_Oceff_Wipe5', 0x80BC7AD0, ((0x80BC7EF0, 0x80BC926F),)),
('decomp/ovl_En_Stone_heishi', 'ovl_En_Stone_heishi', 0x80BC9270, ((0x80BCA380, 0x80BCA59F),)),
('decomp/ovl_Oceff_Wipe6', 'ovl_Oceff_Wipe6', 0x80BCA5A0, ((0x80BCA8B0, 0x80BCABEF),)),
('decomp/ovl_En_Scopenuts', 'ovl_En_Scopenuts', 0x80BCABF0, ((0x80BCCB20, 0x80BCCFFF),)),
('decomp/ovl_En_Scopecrow', 'ovl_En_Scopecrow', 0x80BCD000, ((0x80BCDB50, 0x80BCDCAF),)),
('decomp/ovl_Oceff_Wipe7', 'ovl_Oceff_Wipe7', 0x80BCDCB0, ((0x80BCDFC0, 0x80BCEB1F),)),
('decomp/ovl_Eff_Kamejima_Wave', 'ovl_Eff_Kamejima_Wave', 0x80BCEB20, ((0x80BCF070, 0x80BCF1CF),)),
('decomp/ovl_En_Hg', 'ovl_En_Hg', 0x80BCF1D0, ((0x80BCFF90, 0x80BD02AF),)),
('decomp/ovl_En_Hgo', 'ovl_En_Hgo', 0x80BD02B0, ((0x80BD0E80, 0x80BD11DF),)),
('decomp/ovl_En_Zov', 'ovl_En_Zov', 0x80BD11E0, ((0x80BD26C0, 0x80BD2A2F),)),
('decomp/ovl_En_Ah', 'ovl_En_Ah', 0x80BD2A30, ((0x80BD3DB0, 0x80BD408F),)),
('decomp/ovl_Obj_Hgdoor', 'ovl_Obj_Hgdoor', 0x80BD4090, ((0x80BD4670, 0x80BD471F),)),
('decomp/ovl_Bg_Ikana_Bombwall', 'ovl_Bg_Ikana_Bombwall', 0x80BD4720, ((0x80BD5250, 0x80BD53BF),)),
('decomp/ovl_Bg_Ikana_Ray', 'ovl_Bg_Ikana_Ray', 0x80BD53C0, ((0x80BD55D0, 0x80BD568F),)),
('decomp/ovl_Bg_Ikana_Shutter', 'ovl_Bg_Ikana_Shutter', 0x80BD5690, ((0x80BD5CF0, 0x80BD5DFF),)),
('decomp/ovl_Bg_Haka_Bombwall', 'ovl_Bg_Haka_Bombwall', 0x80BD5E00, ((0x80BD6480, 0x80BD657F),)),
('decomp/ovl_Bg_Haka_Tomb', 'ovl_Bg_Haka_Tomb', 0x80BD6580, ((0x80BD6880, 0x80BD690F),)),
('decomp/ovl_En_Sc_Ruppe', 'ovl_En_Sc_Ruppe', 0x80BD6910, ((0x80BD6DF0, 0x80BD6F0F),)),
('decomp/ovl_Bg_Iknv_Doukutu', 'ovl_Bg_Iknv_Doukutu', 0x80BD6F10, ((0x80BD79C0, 0x80BD7AAF),)),
('decomp/ovl_Bg_Iknv_Obj', 'ovl_Bg_Iknv_Obj', 0x80BD7AB0, ((0x80BD81D0, 0x80BD82AF),)),
('decomp/ovl_En_Pamera', 'ovl_En_Pamera', 0x80BD82B0, ((0x80BDA460, 0x80BDAA2F),)),
('decomp/ovl_Obj_HsStump', 'ovl_Obj_HsStump', 0x80BDAA30, ((0x80BDAF60, 0x80BDB03F),)),
('decomp/ovl_En_Hidden_Nuts', 'ovl_En_Hidden_Nuts', 0x80BDB040, ((0x80BDC0B0, 0x80BDC26F),)),
('decomp/ovl_En_Zow', 'ovl_En_Zow', 0x80BDC270, ((0x80BDDCD0, 0x80BDDFDF),)),
('decomp/ovl_En_Talk', 'ovl_En_Talk', 0x80BDDFE0, ((0x80BDE140, 0x80BDE19F),)),
('decomp/ovl_En_Al', 'ovl_En_Al', 0x80BDE1A0, ((0x80BDFC70, 0x80BE04DF),)),
('decomp/ovl_En_Tab', 'ovl_En_Tab', 0x80BE04E0, ((0x80BE18D0, 0x80BE1C7F),)),
('decomp/ovl_En_Nimotsu', 'ovl_En_Nimotsu', 0x80BE1C80, ((0x80BE1F90, 0x80BE202F),)),
('decomp/ovl_En_Hit_Tag', 'ovl_En_Hit_Tag', 0x80BE2030, ((0x80BE21D0, 0x80BE225F),)),
('decomp/ovl_En_Ruppecrow', 'ovl_En_Ruppecrow', 0x80BE2260, ((0x80BE3990, 0x80BE3B7F),)),
('decomp/ovl_En_Tanron4', 'ovl_En_Tanron4', 0x80BE3B80, ((0x80BE4880, 0x80BE492F),)),
('decomp/ovl_En_Tanron5', 'ovl_En_Tanron5', 0x80BE4930, ((0x80BE5D80, 0x80BE603F),)),
('decomp/ovl_En_Tanron6', 'ovl_En_Tanron6', 0x80BE6040, ((0x80BE6150, 0x80BE61CF),)),
('decomp/ovl_En_Daiku2', 'ovl_En_Daiku2', 0x80BE61D0, ((0x80BE78D0, 0x80BE7AFF),)),
('decomp/ovl_En_Muto', 'ovl_En_Muto', 0x80BE7B00, ((0x80BE83F0, 0x80BE84EF),)),
('decomp/ovl_En_Baisen', 'ovl_En_Baisen', 0x80BE84F0, ((0x80BE8DF0, 0x80BE8F1F),)),
('decomp/ovl_En_Heishi', 'ovl_En_Heishi', 0x80BE8F20, ((0x80BE9430, 0x80BE950F),)),
('decomp/ovl_En_Demo_heishi', 'ovl_En_Demo_heishi', 0x80BE9510, ((0x80BE9A30, 0x80BE9B1F),)),
('decomp/ovl_En_Dt', 'ovl_En_Dt', 0x80BE9B20, ((0x80BEB1B0, 0x80BEB51F),)),
('decomp/ovl_En_Cha', 'ovl_En_Cha', 0x80BEB520, ((0x80BEB860, 0x80BEB93F),)),
('decomp/ovl_Obj_Dinner', 'ovl_Obj_Dinner', 0x80BEB940, ((0x80BEBA70, 0x80BEBABF),)),
('decomp/ovl_Eff_Lastday', 'ovl_Eff_Lastday', 0x80BEBAC0, ((0x80BEC190, 0x80BEC23F),)),
('decomp/ovl_Bg_Ikana_Dharma', 'ovl_Bg_Ikana_Dharma', 0x80BEC240, ((0x80BECAB0, 0x80BECBDF),)),
('decomp/ovl_En_Akindonuts', 'ovl_En_Akindonuts', 0x80BECBE0, ((0x80BF02D0, 0x80BF0D8F),)),
('decomp/ovl_Eff_Stk', 'ovl_Eff_Stk', 0x80BF0D90, ((0x80BF10C0, 0x80BF114F),)),
('decomp/ovl_En_Ig', 'ovl_En_Ig', 0x80BF1150, ((0x80BF3260, 0x80BF391F),)),
('decomp/ovl_En_Rg', 'ovl_En_Rg', 0x80BF3920, ((0x80BF5740, 0x80BF5C1F),)),
('decomp/ovl_En_Osk', 'ovl_En_Osk', 0x80BF5C20, ((0x80BF6F80, 0x80BF74DF),)),
('decomp/ovl_En_Sth2', 'ovl_En_Sth2', 0x80BF74E0, ((0x80BF7920, 0x80BFA0FF),)),
('decomp/ovl_En_Yb', 'ovl_En_Yb', 0x80BFA100, ((0x80BFB290, 0x80BFB47F),)),
('decomp/ovl_En_Rz', 'ovl_En_Rz', 0x80BFB480, ((0x80BFCCC0, 0x80BFCF9F),)),
('decomp/ovl_En_Scopecoin', 'ovl_En_Scopecoin', 0x80BFCFA0, ((0x80BFD260, 0x80BFD2DF),)),
('decomp/ovl_En_Bjt', 'ovl_En_Bjt', 0x80BFD2E0, ((0x80BFDEA0, 0x80BFE16F),)),
('decomp/ovl_En_Bomjima', 'ovl_En_Bomjima', 0x80BFE170, ((0x80C009F0, 0x80C00E9F),)),
('decomp/ovl_En_Bomjimb', 'ovl_En_Bomjimb', 0x80C00EA0, ((0x80C03170, 0x80C0352F),)),
('decomp/ovl_En_Bombers', 'ovl_En_Bombers', 0x80C03530, ((0x80C04750, 0x80C0492F),)),
('decomp/ovl_En_Bombers2', 'ovl_En_Bombers2', 0x80C04930, ((0x80C05880, 0x80C05A6F),)),
('decomp/ovl_En_Bombal', 'ovl_En_Bombal', 0x80C05A70, ((0x80C06440, 0x80C0650F),)),
('decomp/ovl_Obj_Moon_Stone', 'ovl_Obj_Moon_Stone', 0x80C06510, ((0x80C06A10, 0x80C06A9F),)),
('decomp/ovl_Obj_Mu_Pict', 'ovl_Obj_Mu_Pict', 0x80C06AA0, ((0x80C06FE0, 0x80C0710F),)),
('decomp/ovl_Bg_Ikninside', 'ovl_Bg_Ikninside', 0x80C07110, ((0x80C07680, 0x80C0773F),)),
('decomp/ovl_Eff_Zoraband', 'ovl_Eff_Zoraband', 0x80C07740, ((0x80C07AC0, 0x80C07B1F),)),
('decomp/ovl_Obj_Kepn_Koya', 'ovl_Obj_Kepn_Koya', 0x80C07B20, ((0x80C07C20, 0x80C07C7F),)),
('decomp/ovl_Obj_Usiyane', 'ovl_Obj_Usiyane', 0x80C07C80, ((0x80C08640, 0x80C0875F),)),
('decomp/ovl_En_Nnh', 'ovl_En_Nnh', 0x80C08760, ((0x80C089E0, 0x80C08A7F),)),
('decomp/ovl_Obj_Kzsaku', 'ovl_Obj_Kzsaku', 0x80C08A80, ((0x80C08DD0, 0x80C08E3F),)),
('decomp/ovl_Obj_Milk_Bin', 'ovl_Obj_Milk_Bin', 0x80C08E40, ((0x80C09030, 0x80C090CF),)),
('decomp/ovl_En_Kitan', 'ovl_En_Kitan', 0x80C090D0, ((0x80C09D30, 0x80C09ECF),)),
('decomp/ovl_Bg_Astr_Bombwall', 'ovl_Bg_Astr_Bombwall', 0x80C09ED0, ((0x80C0A600, 0x80C0A73F),)),
('decomp/ovl_Bg_Iknin_Susceil', 'ovl_Bg_Iknin_Susceil', 0x80C0A740, ((0x80C0B0C0, 0x80C0B28F),)),
('decomp/ovl_En_Bsb', 'ovl_En_Bsb', 0x80C0B290, ((0x80C0F8D0, 0x80C0FFCF),)),
('decomp/ovl_En_Recepgirl', 'ovl_En_Recepgirl', 0x80C0FFD0, ((0x80C10690, 0x80C1076F),)),
('decomp/ovl_En_Thiefbird', 'ovl_En_Thiefbird', 0x80C10770, ((0x80C135A0, 0x80C1392F),)),
('decomp/ovl_En_Jgame_Tsn', 'ovl_En_Jgame_Tsn', 0x80C13930, ((0x80C15010, 0x80C152EF),)),
('decomp/ovl_Obj_Jgame_Light', 'ovl_Obj_Jgame_Light', 0x80C152F0, ((0x80C15BA0, 0x80C161DF),)),
('decomp/ovl_Obj_Yado', 'ovl_Obj_Yado', 0x80C161E0, ((0x80C16400, 0x80C1647F),)),
('decomp/ovl_Demo_Syoten', 'ovl_Demo_Syoten', 0x80C16480, ((0x80C177B0, 0x80C17A0F),)),
('decomp/ovl_Demo_Moonend', 'ovl_Demo_Moonend', 0x80C17A10, ((0x80C18070, 0x80C1811F),)),
('decomp/ovl_Bg_Lbfshot', 'ovl_Bg_Lbfshot', 0x80C18120, ((0x80C181E0, 0x80C1823F),)),
('decomp/ovl_Bg_Last_Bwall', 'ovl_Bg_Last_Bwall', 0x80C18240, ((0x80C189A0, 0x80C18B8F),)),
('decomp/ovl_En_And', 'ovl_En_And', 0x80C18B90, ((0x80C19160, 0x80C1929F),)),
('decomp/ovl_En_Invadepoh_Demo', 'ovl_En_Invadepoh_Demo', 0x80C192A0, ((0x80C1AA40, 0x80C1ADBF),)),
('decomp/ovl_Obj_Danpeilift', 'ovl_Obj_Danpeilift', 0x80C1ADC0, ((0x80C1B520, 0x80C1B63F),)),
('decomp/ovl_En_Fall2', 'ovl_En_Fall2', 0x80C1B640, ((0x80C1BBE0, 0x80C1BD8F),)),
('decomp/ovl_Dm_Al', 'ovl_Dm_Al', 0x80C1BD90, ((0x80C1C250, 0x80C1C40F),)),
('decomp/ovl_Dm_An', 'ovl_Dm_An', 0x80C1C410, ((0x80C1D1A0, 0x80C1D40F),)),
('decomp/ovl_Dm_Ah', 'ovl_Dm_Ah', 0x80C1D410, ((0x80C1DDC0, 0x80C1DECF),)),
('decomp/ovl_Dm_Nb', 'ovl_Dm_Nb', 0x80C1DED0, ((0x80C1E1E0, 0x80C1E28F),)),
('decomp/ovl_En_Drs', 'ovl_En_Drs', 0x80C1E290, ((0x80C1E5C0, 0x80C1E68F),)),
('decomp/ovl_En_Ending_Hero', 'ovl_En_Ending_Hero', 0x80C1E690, ((0x80C1E950, 0x80C1E9DF),)),
('decomp/ovl_Dm_Bal', 'ovl_Dm_Bal', 0x80C1E9E0, ((0x80C1F150, 0x80C1F3CF),)),
('decomp/ovl_En_Paper', 'ovl_En_Paper', 0x80C1F3D0, ((0x80C1FC40, 0x80C1FCEF),)),
('decomp/ovl_En_Hint_Skb', 'ovl_En_Hint_Skb', 0x80C1FCF0, ((0x80C21C60, 0x80C2234F),)),
('decomp/ovl_Dm_Tag', 'ovl_Dm_Tag', 0x80C22350, ((0x80C22BD0, 0x80C22D3F),)),
('decomp/ovl_En_Bh', 'ovl_En_Bh', 0x80C22D40, ((0x80C231C0, 0x80C2322F),)),
('decomp/ovl_En_Ending_Hero2', 'ovl_En_Ending_Hero2', 0x80C23230, ((0x80C23400, 0x80C2345F),)),
('decomp/ovl_En_Ending_Hero3', 'ovl_En_Ending_Hero3', 0x80C23460, ((0x80C23630, 0x80C2368F),)),
('decomp/ovl_En_Ending_Hero4', 'ovl_En_Ending_Hero4', 0x80C23690, ((0x80C23860, 0x80C238BF),)),
('decomp/ovl_En_Ending_Hero5', 'ovl_En_Ending_Hero5', 0x80C238C0, ((0x80C23BD0, 0x80C23C8F),)),
('decomp/ovl_En_Ending_Hero6', 'ovl_En_Ending_Hero6', 0x80C23C90, ((0x80C241E0, 0x80C2435F),)),
('decomp/ovl_Dm_Gm', 'ovl_Dm_Gm', 0x80C24360, ((0x80C250F0, 0x80C2535F),)),
('decomp/ovl_Obj_Swprize', 'ovl_Obj_Swprize', 0x80C25360, ((0x80C257D0, 0x80C2589F),)),
('decomp/ovl_En_Invisible_Ruppe', 'ovl_En_Invisible_Ruppe', 0x80C258A0, ((0x80C25B30, 0x80C25BBF),)),
('decomp/ovl_Obj_Ending', 'ovl_Obj_Ending', 0x80C25BC0, ((0x80C25CC0, 0x80C25D3F),)),
('decomp/ovl_En_Rsn', 'ovl_En_Rsn', 0x80C25D40, ((0x80C25FF0, 0x80C2609F),)),
}

237
functions.py Normal file
View File

@ -0,0 +1,237 @@
known_funcs = {
0x80080060:("func_80080060","UNK_RET","void"),
0x80080150:("func_80080150","void","UNK_PTR, UNK_PTR"),
0x80080180:("func_80080180","void","UNK_TYPE*, UNK_TYPE, UNK_TYPE"),
0x8008019C:("func_8008019C","UNK_RET","void"),
0x800801EC:("func_800801EC","UNK_RET","void"),
0x80080250:("func_80080250","UNK_RET","void"),
0x80080300:("func_80080300","UNK_RET","UNK_TYPE"),
0x8008038C:("func_8008038C","UNK_RET","void"),
0x80080514:("func_80080514","void","UNK_TYPE"),
0x800805E0:("func_800805E0","UNK_RET","UNK_TYPE"),
0x80080C04:("func_80080C04","UNK_RET","UNK_PTR, UNK_FUN_ARG, UNK_PTR, UNK_TYPE, UNK_TYPE, UNK_PTR, UNK_TYPE"),
0x80080D0C:("func_80080D0C","UNK_RET","void"),
0x80080E00:("func_80080E00","UNK_RET","void"),
0x80081754:("func_80081754","UNK_RET","UNK_PTR, struct s80085320*, UNK_TYPE, UNK_TYPE"),
0x80081820:("func_80081820","void","void"),
0x80081828:("func_80081828","void","void"),
0x80081830:("func_80081830","void","void"),
0x8008189C:("func_8008189C","void","void"),
0x800818D0:("func_800818D0","void","void"),
0x800818F4:("func_800818F4","void","void"),
0x800819F0:("func_800819F0","UNK_RET","UNK_PTR, void(*)(UNK_TYPE, UNK_TYPE), UNK_TYPE, UNK_TYPE"),
0x80081AD4:("func_80081AD4","UNK_RET","UNK_PTR"),
0x80081BCC:("func_80081BCC","UNK_RET","UNK_PTR, UNK_TYPE(*)(UNK_TYPE, UNK_TYPE), UNK_TYPE"),
0x80081CA4:("func_80081CA4","UNK_RET","UNK_PTR"),
0x8008439C:("func_8008439C","UNK_RET","UNK_TYPE, UNK_TYPE"),
0x800847CC:("func_800847CC","UNK_RET","UNK_PTR, ..."), # printf?
0x8008481C:("func_8008481C","UNK_RET","UNK_TYPE, UNK_TYPE, UNK_PTR, UNK_PTR"),
0x80085320:("func_80085320","void","struct s80085320*, UNK_PTR, UNK_PTR, UNK_TYPE, UNK_TYPE, UNK_PTR"),
0x800853F8:("func_800853F8","UNK_RET","struct s80085320*"),
0x80085468:("func_80085468","UNK_TYPE","struct s80085320*"),
0x800854E0:("func_800854E0","UNK_TYPE","UNK_ARGS"),
0x80085538:("func_80085538","UNK_RET","struct s80085320*"),
0x80087830:("func_80087830","UNK_TYPE","UNK_TYPE, UNK_TYPE, UNK_TYPE"),
0x80087854:("func_80087854","UNK_TYPE","u8*, UNK_TYPE, UNK_PTR"),
0x800878A4:("func_800878A4","UNK_TYPE","u8*, UNK_TYPE, UNK_TYPE, UNK_TYPE"),
0x80087B00:("__osSetCause","void","u32 value"),
0x80087B10:("osSendMesg","s32","OSMesgQueue* mq, OSMesg msg, s32 flags"),
0x80087E00:("func_80087E00","void","u32"),
0x80087E10:("osStopThread","void","OSThread* t"),
0x80087ED0:("osRecvMesg","s32","OSMesgQueue* mq, OSMesg* msg, s32 flags"),
0x80088010:("osSetIntMask","OSIntMask","OSIntMask im"),
0x800880B0:("osGetIntMask","OSIntMask","void"),
0x80088350:("__sinf","float","float x"), # multiple names? __sinf/fsin/sinf
0x80088510:("sins","short","unsigned short x"),
0x80088580:("_VirtualToPhysicalTask","OSTask*","OSTask* intp"), # Note: not exported
0x8008868C:("osSpTaskLoad","void","OSTask* intp"),
0x800887F4:("osSpTaskStartGo","void","OSTask* tp"),
0x80088840:("__ull_rshift","long long","unsigned long long left, long long right"),
0x8008886C:("__ull_rem","unsigned long long","unsigned long long left, unsigned long long right"),
0x800888A8:("__ull_div","unsigned long long","unsigned long long left, unsigned long long right"),
0x800888E4:("__ll_lshift","long long","long long left, long long right"),
0x80088910:("__ll_rem","long long","long long left, unsigned long long right"),
0x8008894C:("__ll_div","long long","long long left, long long right"),
0x800889A8:("__ll_mul","long long","long long left, long long right"),
0x800889D8:("__ull_divremi","void","unsigned long long* quotient, unsigned long long* remainder, unsigned long long dividend, unsigned short divisor"),
0x80088A38:("__ll_mod","long long","long long left, long long right"),
0x80088AD4:("__ll_rshift","long long","long long left, long long right"),
0x80088B00:("__osExceptionPreamble","UNK_RET","UNK_ARGS"),
0x80088B10:("__osException","UNK_RET","UNK_ARGS"),
0x8008905C:("send_mesg","UNK_RET","UNK_ARGS"),
0x80089110:("handle_CpU","UNK_RET","UNK_ARGS"),
0x80089144:("__osEnqueueAndYield","UNK_RET","OSThread**"),
0x80089244:("__osEnqueueThread","UNK_RET","UNK_PTR, OSThread*"),
0x8008928C:("__osPopThread","OSThread*","OSThread**"),
0x800892A4:("__osDispatchThread","UNK_RET","void"), # TODO is this really void?
0x80089420:("__osCleanupThread","UNK_RET","UNK_ARGS"),
0x80089430:("__osDequeueThread","UNK_RET","OSThread**, OSThread*"),
0x80089470:("osDestroyThread","void","OSThread* t"),
0x80089630:("_blkclr","UNK_RET","u8*, u32"), # multiple names? bzero/_bzero/blkclr/_blkclr
0x80089AA0:("__osSiCreateAccessQueue","void","void"),
0x80089AF0:("__osSiGetAccess","void","void"),
0x80089B34:("__osSiRelAccess","void","void"),
0x80089B60:("osContInit","s32","OSMesgQueue* mq, u8* bitpattern, OSContStatus* data"),
0x80089CBC:("__osContGetInitData","void","u8* pattern, OSContStatus* data"),
0x80089D68:("__osPackRequestData","void","u8 cmd"),
0x80089E40:("osCreateThread","void","OSThread* t, OSId id, void (*entry)(void*), void* arg, void* sp, OSPri p"),
0x80089F90:("osContStartReadData","s32","OSMesgQueue* mq"),
0x8008A014:("osContGetReadData","void","OSContPad* data"),
0x8008A540:("osVirtualToPhysical","u32","void* virtualAddress"),
0x8008A5C0:("__osGetSR","u32","void"),
0x8008A5D0:("__osSetSR","void","u32 value"),
0x8008A5E0:("osWritebackDCache","void","void *vaddr, s32 nbytes"),
0x8008A660:("func_8008A660","void","void"),
0x8008A6FC:("func_8008A6FC","void","void"),
0x8008A9A8:("func_8008A9A8","void","void"),
0x8008AA50:("guPerspectiveF","void","float* mf[4], u16* perspNorm, float fovy, float aspect, float near, float far, float scale"),
0x8008AC80:("guPerspective","void","Mtx* m, u16* perspNorm, float fovy, float aspect, float near, float far, float scale"),
0x8008ACE0:("__osSpRawStartDma","s32","s32 direction, u32 devAddr, void* dramAddr, u32 size"),
0x8008AD70:("__osSiRawStartDma","s32","s32 direction, void* dramAddr"),
0x8008AE70:("func_8008AE70","UNK_RET","UNK_TYPE"),
0x8008AEE0:("func_8008AEE0","UNK_TYPE","UNK_TYPE, UNK_PTR"),
0x8008AF30:("osGetThreadId","OSId","OSThread* t"),
0x8008AF50:("osSpTaskYield","void","void"),
0x8008B650:("func_8008B650","UNK_RET","UNK_PTR"),
0x8008B6B0:("__osGetConfig","u32 ","void "),
0x8008B6C0:("__osSetConfig","void ","u32 value"),
0x8008BE70:("osStopTimer","int","OSTimer* t"),
0x8008BF60:("__osProbeTLB","u32","void*"),
0x8008C020:("osCreatePiManager","void","OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgCnt"),
0x8008C190:("__osPiCreateAccessQueue","void","void"),
0x8008C1E0:("__osPiGetAccess","void","void"),
0x8008C224:("__osPiRelAccess","void","void"),
0x8008D2C0:("osGetCount","u32","void"),
0x8008D350:("func_8008D350","UNK_TYPE","void"),
0x8008D640:("osSetEventMesg","void","OSEvent e, OSMesgQueue* mq, OSMesg m"),
0x8008D700:("sqrtf","UNK_RET","UNK_ARGS"),
0x8008D730:("osContStartQuery","s32","OSMesgQueue* mq"),
0x8008D7AC:("osContGetQuery","void","OSContStatus* data"),
0x8008E050:("_Printf","int","void* (*pfn)(void*), void* arg, const unsigned char* fmt, va_list ap"),
0x8008E698:("func_8008E698","UNK_RET","UNK_ARGS"), # this does not have a name? (maybe not exported idk) (_Putfld?)
0x8008EDE0:("osUnmapTLBAll","void","void"),
0x8008EE30:("osPiStartDma","s32","OSIoMesg* mb, s32 priority, s32 direction, u32 devAddr, void* dramAddr, u32 size, OSMesgQueue* mq"),
0x8008F1A0:("strchr","unsigned char*","const unsigned char* s, int c"),
0x8008F1E0:("strlen","size_t","const unsigned char* s"), # unsigned int == size_t
0x8008F208:("memcpy","void*","void* s1, const void* s2, size_t n"), # unsigned int == size_t
0x8008F240:("osCreateMesgQueue","void","OSMesgQueue* mq, OSMesg* msg, s32 msgCount"),
0x8008F270:("osInvalICache","void","void *vaddr, s32 nbytes"),
0x8008F2F0:("osInvalDCache","void","void *vaddr, s32 nbytes"),
0x8008F3A0:("__osTimerServicesInit","void","void"),
0x8008F42C:("__osTimerInterrupt","void","void"),
0x8008F5A4:("__osSetTimerIntr","void","OSTime tim"),
0x8008F644:("__osInsertTimer","OSTime","OSTimer* t"),
0x8008FA00:("__osSpDeviceBusy","int","void"),
0x8008FA30:("__osSiDeviceBusy","int","void"),
0x8008FAB0:("osJamMesg","s32","OSMesgQueue* mq, OSMesg msg, s32 flags"),
0x8008FC00:("osSetThreadPri","void","OSThread* t, OSPri p"),
0x8008FCE0:("osGetThreadPri","OSPri","OSThread* t"),
0x8008FE60:("func_8008FE60","UNK_RET","UNK_PTR"),
0x800902A0:("osSpTaskYielded","void","void"),
0x80090300:("memcmp","UNK_RET","UNK_ARGS"), # multiple names? memcmp/bcmp/_bcmp
0x80090420:("osGetTime","OSTime","void"),
0x80090680:("__osSetGlobalIntMask","UNK_RET","UNK_ARGS"),
0x80091280:("__osSetCompare","void","u32 value"),
0x80091290:("__osGetCompare","u32","void"),
0x800912A0:("osDpGetStatus","u32","void"),
0x800912B0:("osDpSetStatus","void","u32 data"),
0x800912C0:("_bcopy","void","const void* src, void* dst, size_t n"), # multiple names? bcopy/_bcopy
0x800915D0:("__osResetGlobalIntMask","UNK_RET","UNK_ARGS"),
0x800918A0:("guOrthoF","void","float* mf[4], float l, float r, float b, float t, float n, float f, float scale"),
0x800919F4:("guOrtho","void","Mtx* m, float l, float r, float b, float t, float n, float f, float scale"),
0x80091A60:("__osDisableInt","u32","void"),
0x80091AD0:("__osRestoreInt","void","u32"),
0x80091AF0:("__osViInit","void","void"),
0x80091C10:("__osViSwapContext","void","void"),
0x80091F10:("osPiGetCmdQueue","OSMesgQueue*","void"),
0x80091f40:("__cosf","float","float x"), # multiple names? __cosf/fcos/cosf
0x80092100:("func_80092100","UNK_RET","UNK_TYPE"),
0x80092260:("coss","short","unsigned short x"),
0x80092290:("osSetTime","void","OSTime ticks"),
0x80092920:("func_80092920","struct s80092920*","void"),
0x80092C80:("osContSetCh","s32","u8 ch"),
0x80092CE0:("__osSetFpcCsr","void","u32 value"),
0x80092CF0:("__osGetFpcCsr","u32","void"),
0x80093BA0:("osAiGetLength","u32","void"),
0x80093C00:("osMapTLBRdb","void","void"),
0x80093C60:("osYieldThread","void","void"),
0x80093D90:("__osGetCause","u32","void"),
0x80094150:("osSetTimer","int","OSTimer* t, OSTime value, OSTime interval, OSMesgQueue* mq, OSMesg msg"),
0x800942E0:("_Ldtob","void","_Pft* px, unsigned char code"),
0x80094770:("func_80094770","UNK_RET","UNK_ARGS"), # this does not have a name? (maybe not exported idk) (_Ldunscale?)
0x80094828:("func_80094828","UNK_RET","UNK_ARGS"), # this does not have a name? (maybe not exported idk) (_Genld?)
0x80094DF0:("ldiv","ldiv_t","long numer, long denom"),
0x80094E74:("lldiv","lldiv_t","long long numer, long long denom"),
0x80094F80:("_Litob","void","_Pft* px, unsigned char code"),
0x80095220:("__osSiRawReadIo","s32","u32 devAddr, u32* data"),
0x80095270:("__osSpGetStatus","u32","void"),
0x80095280:("__osSpSetStatus","void","u32 data"),
0x800952A0:("osCreateViManager","void","OSPri pri"),
0x800955F0:("__osGetCurrFaultedThread","OSThread*","void"),
0x800955B0:("__osViGetCurrentContext","__OSViContext*","void"),
0x800955C0:("osWritebackDCacheAll","void","void"),
0x80095740:("guMtxF2L","void","float* mf[4], Mtx* m"),
0x800957B0:("osStartThread","void","OSThread* t"),
0x80095900:("func_80095900","void","f32"),
0x80095950:("func_80095950","UNK_RET","f32"),
0x80095A60:("__d_to_ll","long long","double d"),
0x80095A7C:("__f_to_ll","long long","float f"),
0x80095A98:("__d_to_ull","unsigned long long","double d"),
0x80095B38:("__f_to_ull","unsigned long long","float f"),
0x80095BD4:("__ll_to_d","double","long long l"),
0x80095BEC:("__ll_to_f","float","long long l"),
0x80095C04:("__ull_to_d","double","unsigned long long l"),
0x80095C38:("__ull_to_f","float","unsigned long long l"),
0x80096510:("__osSpSetPc","s32","u32 data"),
0x80096820:("func_80096820","UNK_RET","UNK_TYPE"),
0x800968B0:("func_800968B0","u32","const u8*, const u8*"),
0x80097540:("osViModeNtscHpf1","UNK_RET","UNK_ARGS"),
0x80097eb0:("osViModeNtscHpn1","UNK_RET","UNK_ARGS"),
0x80097fc0:("osViModeNtscLan1","UNK_RET","UNK_ARGS"),
0x80098010:("osViModeMpalLan1","UNK_RET","UNK_ARGS"),
0x800991a0:("__osRcpImTable","UNK_RET","UNK_ARGS"),
0x80099450:("__libm_qnan_f","UNK_RET","UNK_ARGS"),
0x800A5AC0:("func_800A5AC0","UNK_RET","void*, UNK_TYPE"), # guessing this is void* bc it's a thread entry point
0x800A5B6C:("func_800A5B6C","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800A5B98:("func_800A5B98","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800A5C28:("func_800A5C28","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800A5C60:("func_800A5C60","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800A5CB8:("func_800A5CB8","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800B3BA4:("func_800B3BA4","UNK_RET","UNK_PTR, UNK_TYPE, UNK_PTR, UNK_TYPE"),
0x800B3FC0:("func_800B3FC0","UNK_TYPE","UNK_TYPE"),
0x800B675C:("func_800B675C","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800B84D0:("func_800B84D0","UNK_TYPE","struct s800A5AC0*, UNK_TYPE"),
0x800B863C:("func_800B863C","UNK_RET","struct s800A5AC0*, UNK_TYPE"),
0x800B867C:("func_800B867C","UNK_TYPE","struct s800A5AC0*"),
0x800BDFC0:("func_800BDFC0","UNK_RET","UNK_TYPE, UNK_TYPE, UNK_TYPE, struct s800A5AC0*"),
0x800C6024:("func_800C6024","UNK_TYPE","UNK_TYPE"),
0x800C6248:("func_800C6248","UNK_TYPE","UNK_TYPE, UNK_TYPE"),
0x800CAAD0:("func_800CAAD0","UNK_RET","UNK_TYPE, UNK_TYPE, UNK_TYPE"),
0x800CAC0C:("func_800CAC0C","UNK_RET","UNK_TYPE, UNK_TYPE, UNK_TYPE"),
0x800CACA0:("func_800CACA0","UNK_RET","UNK_TYPE, UNK_TYPE, UNK_TYPE"),
0x800CAD2C:("func_800CAD2C","UNK_TYPE","UNK_TYPE, UNK_TYPE, UNK_TYPE"),
0x800CAE88:("func_800CAE88","UNK_RET","UNK_TYPE"),
0x800CAF24:("func_800CAF24","UNK_RET","UNK_TYPE"),
0x800CAF38:("func_800CAF38","UNK_RET","UNK_TYPE"),
0x800E11EC:("func_800E11EC","UNK_RET","UNK_TYPE, UNK_PTR"),
0x800E1374:("func_800E1374","UNK_RET","UNK_TYPE, UNK_PTR, struct s800A5AC0*, UNK_PTR"),
0x800E2928:("func_800E2928","UNK_RET","UNK_TYPE, UNK_TYPE, UNK_PTR"),
0x800E7DF8:("func_800E7DF8","UNK_RET","struct s800A5AC0*, UNK_PTR"),
0x800FFADC:("func_800FFADC","UNK_RET","struct s800A5AC0*, UNK_PTR"),
0x80138C88:("func_80138C88","UNK_RET","UNK_PTR, UNK_PTR, UNK_PTR"),
0x80139188:("func_80139188","UNK_TYPE","UNK_PTR, UNK_PTR"),
0x80139894:("func_80139894","UNK_RET","UNK_PTR, UNK_TYPE, UNK_TYPE, UNK_TYPE, UNK_TYPE, UNK_TYPE, UNK_TYPE, f32, f32, f32"),
0x80174BF0:("func_80174BF0","UNK_RET","UNK_TYPE"),
0x8018349C:("func_8018349C","UNK_RET","UNK_TYPE, UNK_TYPE"),
# ovl_En_Test
#0x80862B70:("func_80862B70","void","void* a0"),
#0x80862CBC:("func_80862CBC","UNK_RET","UNK_ARGS"),
#0x80862EDC:("func_80862EDC","UNK_RET","UNK_ARGS"),
#0x80863048:("func_80863048","UNK_RET","UNK_ARGS"),
#0x80863188:("func_80863188","UNK_RET","UNK_ARGS"),
#0x80863310:("func_80863310","UNK_RET","UNK_ARGS"),
#0x8086333C:("func_8086333C","UNK_RET","UNK_ARGS"),
#0x808634B8:("func_808634B8","UNK_RET","UNK_ARGS"),
#0x808636A8:("func_808636A8","UNK_RET","UNK_ARGS"),
}

27
include/PR/ultratypes.h Normal file
View File

@ -0,0 +1,27 @@
#ifndef _ULTRATYPES_H_
#define _ULTRATYPES_H_
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef unsigned long long u64;
typedef signed char s8;
typedef short s16;
typedef long s32;
typedef long long s64;
typedef volatile unsigned char vu8;
typedef volatile unsigned short vu16;
typedef volatile unsigned long vu32;
typedef volatile unsigned long long vu64;
typedef volatile signed char vs8;
typedef volatile short vs16;
typedef volatile long vs32;
typedef volatile long long vs64;
typedef float f32;
typedef double f64;
#define NULL ((void*)0)
#endif

4
include/assert.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef _ASSERT_H_
#define _ASSERT_H_
#endif

4
include/bstring.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef _BSTRING_H_
#define _BSTRING_H_
#endif

19489
include/functions.h Normal file

File diff suppressed because it is too large Load Diff

8
include/global.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#include "structs.h"
#include "functions.h"
#include "variables.h"
#endif

227
include/os.h Normal file
View File

@ -0,0 +1,227 @@
#ifndef _OS_H_
#define _OS_H_
#include <PR/ultratypes.h>
typedef s32 OSPri;
typedef s32 OSId;
typedef union {
/* 0 */ struct {
/* 0 */ f32 f_odd;
/* 4 */ f32 f_even;
} f;
/* 0 */ f64 d;
} __OSfp;
typedef struct {
/* 0 */ u64 at;
/* 8 */ u64 v0;
/* 16 */ u64 v1;
/* 24 */ u64 a0;
/* 32 */ u64 a1;
/* 40 */ u64 a2;
/* 48 */ u64 a3;
/* 56 */ u64 t0;
/* 64 */ u64 t1;
/* 72 */ u64 t2;
/* 80 */ u64 t3;
/* 88 */ u64 t4;
/* 96 */ u64 t5;
/* 104 */ u64 t6;
/* 112 */ u64 t7;
/* 120 */ u64 s0;
/* 128 */ u64 s1;
/* 136 */ u64 s2;
/* 144 */ u64 s3;
/* 152 */ u64 s4;
/* 160 */ u64 s5;
/* 168 */ u64 s6;
/* 176 */ u64 s7;
/* 184 */ u64 t8;
/* 192 */ u64 t9;
/* 200 */ u64 gp;
/* 208 */ u64 sp;
/* 216 */ u64 s8;
/* 224 */ u64 ra;
/* 232 */ u64 lo;
/* 240 */ u64 hi;
/* 248 */ u32 sr;
/* 252 */ u32 pc;
/* 256 */ u32 cause;
/* 260 */ u32 badvaddr;
/* 264 */ u32 rcp;
/* 268 */ u32 fpcsr;
/* 272 */ __OSfp fp0;
/* 280 */ __OSfp fp2;
/* 288 */ __OSfp fp4;
/* 296 */ __OSfp fp6;
/* 304 */ __OSfp fp8;
/* 312 */ __OSfp fp10;
/* 320 */ __OSfp fp12;
/* 328 */ __OSfp fp14;
/* 336 */ __OSfp fp16;
/* 344 */ __OSfp fp18;
/* 352 */ __OSfp fp20;
/* 360 */ __OSfp fp22;
/* 368 */ __OSfp fp24;
/* 376 */ __OSfp fp26;
/* 384 */ __OSfp fp28;
/* 392 */ __OSfp fp30;
} __OSThreadContext;
typedef struct OSThread_s {
/* 0 */ struct OSThread_s* next;
/* 4 */ OSPri priority;
/* 8 */ struct OSThread_s** queue;
/* 12 */ struct OSThread_s* tlnext;
/* 16 */ u16 state;
/* 18 */ u16 flags;
/* 20 */ OSId id;
/* 24 */ int fp;
/* 32 */ __OSThreadContext context;
} OSThread;
typedef u32 OSEvent;
typedef u32 OSIntMask;
typedef u32 OSPageMask;
typedef void* OSMesg;
typedef struct {
/* 0 */ OSThread* mtqueue;
/* 4 */ OSThread* fullqueue;
/* 8 */ s32 validCount;
/* 12 */ s32 first;
/* 16 */ s32 msgCount;
/* 20 */ OSMesg* msg;
} OSMesgQueue;
typedef struct {
/* 0 */ u16 type;
/* 2 */ u8 pri;
/* 3 */ u8 status;
/* 4 */ OSMesgQueue* retQueue;
} OSIoMesgHdr;
typedef struct {
/* 0 */ OSIoMesgHdr hdr;
/* 8 */ void* dramAddr;
/* 12 */ u32 devAddr;
/* 16 */ u32 size;
} OSIoMesg;
typedef struct {
/* 0 */ s32 active;
/* 4 */ OSThread* thread;
/* 8 */ OSMesgQueue* cmdQueue;
/* 12 */ OSMesgQueue* evtQueue;
/* 16 */ OSMesgQueue* acsQueue;
/* 20 */ s32 (*dma)(... /* ECOFF does not store param types */);
} OSDevMgr;
typedef struct {
/* 0 */ u32 ctrl;
/* 4 */ u32 width;
/* 8 */ u32 burst;
/* 12 */ u32 vSync;
/* 16 */ u32 hSync;
/* 20 */ u32 leap;
/* 24 */ u32 hStart;
/* 28 */ u32 xScale;
/* 32 */ u32 vCurrent;
} OSViCommonRegs;
typedef struct {
/* 0 */ u32 origin;
/* 4 */ u32 yScale;
/* 8 */ u32 vStart;
/* 12 */ u32 vBurst;
/* 16 */ u32 vIntr;
} OSViFieldRegs;
typedef struct {
/* 0 */ u8 type;
/* 4 */ OSViCommonRegs comRegs;
/* 40 */ OSViFieldRegs fldRegs[2];
} OSViMode;
typedef u64 OSTime;
typedef struct OSTimer_s {
/* 0 */ struct OSTimer_s* next;
/* 4 */ struct OSTimer_s* prev;
/* 8 */ OSTime interval;
/* 16 */ OSTime value;
/* 24 */ OSMesgQueue* mq;
/* 28 */ OSMesg msg;
} OSTimer;
typedef struct {
/* 0 */ u16 type;
/* 2 */ u8 status;
/* 3 */ u8 errno;
} OSContStatus;
typedef struct {
/* 0 */ u16 button;
/* 2 */ s8 stick_x;
/* 3 */ s8 stick_y;
/* 4 */ u8 errno;
} OSContPad;
typedef struct {
/* 0 */ void* address;
/* 4 */ u8 databuffer[32];
/* 36 */ u8 addressCrc;
/* 37 */ u8 dataCrc;
/* 38 */ u8 errno;
} OSContRamIo;
typedef struct {
/* 0 */ int status;
/* 4 */ OSMesgQueue* queue;
/* 8 */ int channel;
/* 12 */ u8 id[32];
/* 44 */ u8 backup_id[32];
/* 76 */ u8 label[32];
/* 108 */ int pack_size;
/* 112 */ int version;
/* 116 */ int dir_size;
/* 120 */ int inode_start_page;
} OSPfs;
typedef struct {
/* 0 */ u32 file_size;
/* 4 */ u16 company_code;
/* 6 */ u16 game_code;
/* 8 */ unsigned char ext_name[4];
/* 12 */ unsigned char game_name[16];
} OSPfsState;
typedef struct {
/* 0 */ u16* histo_base;
/* 4 */ u32 histo_size;
/* 8 */ u32* text_start;
/* 12 */ u32* text_end;
} OSProf;
#endif

4
include/os_internal.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef _OS_INTERNAL_H_
#define _OS_INTERNAL_H_
#endif

28
include/osint.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef _OSINT_H_
#define _OSINT_H_
// TODO should be in libultra/os
#include <stdarg.h>
#include <os.h>
#include <os_internal.h>
#include <ultraerror.h>
#include <ultralog.h>
#include <sptask.h>
typedef struct {
/* 0 */ OSMesgQueue* messageQueue;
/* 4 */ OSMesg message;
} __OSEventState;
typedef struct {
/* 0 */ OSThread* next;
/* 4 */ OSPri priority;
} __OSThreadTail;
#include <variables.h> // TODO all variables should be moved to the file that logically defines them
// maybe put externs here?
#include <functions.h>
#endif

4
include/rmon.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef _RMON_H_
#define _RMON_H_
#endif

33
include/sptask.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef _SPTASK_H_
#define _SPTASK_H_
#include <PR/ultratypes.h>
typedef struct {
/* 0 */ u32 type;
/* 4 */ u32 flags;
/* 8 */ u64* ucode_boot;
/* 12 */ u32 ucode_boot_size;
/* 16 */ u64* ucode;
/* 20 */ u32 ucode_size;
/* 24 */ u64* ucode_data;
/* 28 */ u32 ucode_data_size;
/* 32 */ u64* dram_stack;
/* 36 */ u32 dram_stack_size;
/* 40 */ u64* output_buff;
/* 44 */ u64* output_buff_size;
/* 48 */ u64* data_ptr;
/* 52 */ u32 data_size;
/* 56 */ u64* yield_data_ptr;
/* 60 */ u32 yield_data_size;
} OSTask_t;
typedef union {
/* 0 */ OSTask_t t;
/* 0 */ long long force_structure_alignment;
} OSTask;
typedef u32 OSYieldResult;
#endif

6
include/stdarg.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef _STDARG_H_
#define _STDARG_H_
typedef unsigned char* va_list;
#endif

7
include/string.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef _STRING_H_
#define _STRING_H_
#define NULL 0
typedef unsigned int size_t;
#endif

142
include/structs.h Normal file
View File

@ -0,0 +1,142 @@
#ifndef _STRUCTS_H_
#define _STRUCTS_H_
#include <PR/ultratypes.h>
#include <unk.h>
struct s80085320 {
/* 00 */ struct s80085320* next;
/* 04 */ struct s80085320* prev;
/* 08 */ UNK_TYPE* unk8;
/* 12 */ UNK_TYPE* unk12;
/* 16 */ UNK_TYPE unk16;
/* 20 */ UNK_TYPE unk20;
/* 24 */ UNK_TYPE* unk24;
};
struct s8008A6FC {
/* 00 */ UNK_TYPE unk0;
/* 04 */ UNK_TYPE unk4;
/* 08 */ UNK_TYPE unk8;
/* 12 */ UNK_TYPE unk12;
};
struct s80092920 {
/* 00 */ struct s80092920* unk0;
/* 04 */ u8 unk4;
/* 05 */ u8 unk5;
/* 06 */ u8 unk6;
/* 07 */ u8 unk7;
/* 08 */ u8 unk8;
/* 09 */ u8 unk9;
/* 10 */ u8 unk10; // pad?
/* 11 */ u8 unk11; // pad?
/* 12 */ UNK_TYPE unk12;
/* 16 */ UNK_TYPE unk16;
};
struct s800A5AC0 {
/* 000 */ u8 pad0[28];
/* 028 */ u16 unk28;
/* 030 */ u8 pad1[116];
/* 146 */ u16 unk146;
/* 148 */ u8 pad2[34];
/* 182 */ u8 unk182;
/* 183 */ u8 pad4[5];
/* 188 */ u16 unk188; // or char
/* 190 */ u16 unk190;
/* 192 */ u8 pad5[86];
/* 278 */ u16 unk278;
/* 280 */ u8 pad6[44];
/* 324 */ void(*unk324)(struct s800A5AC0*, UNK_TYPE);
/* 328 */ UNK_TYPE unk328;
};
typedef struct s800BF9A0_s {
/* 000 */ u8 pad0[8];
/* 008 */ UNK_TYPE unk8;
/* 012 */ UNK_TYPE unk12;
/* 016 */ UNK_TYPE unk16;
/* 020 */ u8 pad1[10];
/* 030 */ s8 unk30;
/* 031 */ u8 pad2[1];
} s800BF9A0_s;
typedef struct s800CAAD0_s {
/* 000 */ UNK_TYPE unk0;
/* 004 */ UNK_TYPE unk4;
/* 008 */ UNK_TYPE unk8;
/* 012 */ u8 pad0[92];
/* 104 */ UNK_TYPE unk104;
/* 108 */ UNK_TYPE unk108;
/* 112 */ UNK_TYPE unk112;
/* 116 */ u16 unk116;
/* 118 */ u16 unk118;
/* 120 */ u16 unk120;
/* 122 */ u8 pad1[2];
/* 124 */ f32 unk124;
/* 128 */ f32 unk128;
/* 132 */ f32 unk132;
/* 136 */ UNK_TYPE unk136;
/* 140 */ UNK_TYPE unk140;
/* 144 */ UNK_TYPE unk144;
/* 148 */ u16 unk148;
/* 150 */ u16 unk150;
/* 152 */ u16 unk152;
/* 154 */ u8 pad2[2];
/* 156 */ f32 unk156;
/* 160 */ f32 unk160;
/* 164 */ f32 unk164;
} s800CAAD0;
// TODO everything past here should be placed in an appropiate libultra header
typedef long Mtx_t[4][4];
typedef union {
/* 0 */ Mtx_t m;
/* 0 */ long long force_structure_alignment;
} Mtx;
typedef struct {
/* 0 */ int quot;
/* 4 */ int rem;
} div_t;
typedef struct {
/* 0 */ long quot;
/* 4 */ long rem;
} ldiv_t;
typedef struct {
/* 0 */ long long quot;
/* 8 */ long long rem;
} lldiv_t;
typedef unsigned int size_t;
typedef double ldouble;
typedef struct {
/* 0 */ union {
/* 0 */ long long ll;
/* 0 */ ldouble ld;
} v;
/* 8 */ unsigned char* s;
/* 12 */ int n0;
/* 16 */ int nz0;
/* 20 */ int n1;
/* 24 */ int nz1;
/* 28 */ int n2;
/* 32 */ int nz2;
/* 36 */ int prec;
/* 40 */ int width;
/* 44 */ size_t nchar;
/* 48 */ unsigned int flags;
/* 52 */ unsigned char qual;
} _Pft;
#endif

7
include/ultra64.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef _ULTRA64_H_
#define _ULTRA64_H_
#include <PR/ultratypes.h>
#include "unk.h"
#endif

6
include/ultraerror.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef _ULTRAERROR_H_
#define _ULTRAERROR_H_
typedef void (*OSErrorHandler)(... /* ECOFF does not store param types */);
#endif

28
include/ultralog.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef _ULTRALOG_H_
#define _ULTRALOG_H_
#include <PR/ultratypes.h>
typedef struct {
/* 0 */ u32 magic;
/* 4 */ u32 len;
/* 8 */ u32* base;
/* 12 */ s32 startCount;
/* 16 */ s32 writeOffset;
} OSLog;
typedef struct {
/* 0 */ u32 magic;
/* 4 */ u32 timeStamp;
/* 8 */ u16 argCount;
/* 10 */ u16 eventID;
} OSLogItem;
typedef struct {
/* 0 */ u32 magic;
/* 4 */ u32 version;
} OSLogFileHdr;
#endif

13
include/unk.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef _UNK_H_
#define _UNK_H_
#include <PR/ultratypes.h>
#define UNK_TYPE s32
#define UNK_PTR void*
#define UNK_RET void
#define UNK_FUN_ARG void(*)(void)
#define UNK_FUN_PTR(name) void(*name)(void)
#define UNK_ARGS void
#endif

14303
include/variables.h Normal file

File diff suppressed because it is too large Load Diff

28
include/viint.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef _VIINT_H_
#define _VIINT_H_
// TODO should be in libultra/io
#include <PR/ultratypes.h>
#include <os.h>
typedef struct {
/* 0 */ f32 factor;
/* 4 */ u16 offset;
/* 8 */ u32 scale;
} __OSViScale;
typedef struct {
/* 0 */ u16 state;
/* 2 */ u16 retraceCount;
/* 4 */ void* framep;
/* 8 */ OSViMode* modep;
/* 12 */ u32 control;
/* 16 */ OSMesgQueue* msgq;
/* 20 */ OSMesg msg;
/* 24 */ __OSViScale x;
/* 36 */ __OSViScale y;
} __OSViContext;
#endif

1561
ldscript.txt Normal file

File diff suppressed because it is too large Load Diff

93
objects.py Normal file
View File

@ -0,0 +1,93 @@
known_objects = {
0x80087b00:"setcause",
0x80087b10:"sendmesg",
0x80087e10:"stopthread",
0x80087ed0:"recvmesg",
0x80088010:"setintmask",
0x800880b0:"getintmask",
0x80088110:"",
0x80088350:"sinf",
0x80088510:"sins",
0x80088580:"sptask",
0x80088840:"ll",
0x80088b00:"exceptasm",
0x80089430:"thread",
0x80089470:"destroythread",
0x80089630:"bzero",
0x80089AA0:"siacs",
0x80089B60:"controller",
0x80089e40:"createthread",
0x80089F90:"contreaddata",
0x8008A540:"virtualtophysical",
0x8008A5C0:"getsr",
0x8008A5D0:"setsr",
0x8008A5E0:"writebackdcache",
0x8008AA50:"perspective",
0x8008AD70:"sirawdma",
0x8008af30:"getthreadid",
0x8008af50:"sptaskyield",
0x8008AF70:"",
0x8008B6B0:"getconfig",
0x8008B6C0:"setconfig",
0x8008BE70:"stoptimer",
0x8008BF60:"probetlb",
0x8008C020:"pimgr",
0x8008C190:"piacs",
0x8008D2C0:"getcount",
0x8008D640:"seteventmesg",
0x8008D700:"sqrtf",
0x8008D730:"contquery",
0x8008D7D0:"",
0x8008E050:"xprintf",
0x8008EDE0:"unmaptlball",
0x8008EE30:"pidma",
0x8008F1A0:"string",
0x8008F240:"createmesgqueue",
0x8008F270:"invalicache",
0x8008F2F0:"invaldcache",
0x8008F3A0:"timerintr",
0x8008FA30:"si",
0x8008fab0:"jammesg",
0x8008fc00:"setthreadpri",
0x8008fce0:"getthreadpri",
0x800902A0:"sptaskyielded",
0x80090300:"memcmp",
0x80090420:"gettime",
0x80090680:"setglobalintmask",
0x80091280:"setcompare",
0x80091290:"getcompare",
0x800912a0:"dpgetstat",
0x800912b0:"dpsetstat",
0x800912c0:"bcopy",
0x800915D0:"resetglobalintmask",
0x800918A0:"ortho",
0x80091A60:"interrupt",
0x80091AF0:"vi",
0x80091C10:"viswapcontext",
0x80091F10:"pigetcmdq",
0x80091f40:"cosf",
0x80092260:"coss",
0x80092290:"settime",
0x80092C80:"contsetch",
0x80092ce0:"setfpccsr",
0x80092cf0:"getfpccsr",
0x80093ba0:"aigetlen",
0x80093c00:"maptlbrdb",
0x80093c60:"yieldthread",
0x80093d90:"getcause",
0x80094150:"settimer",
0x800942E0:"xldtob",
0x80094DF0:"ldiv",
0x80094f80:"xlitob",
0x80095270:"spgetstat",
0x80095280:"spsetstat",
0x80095220:"sirawread",
0x800952A0:"vimgr",
0x800955B0:"vigetcurrcontext",
0x800955C0:"writebackdcacheall",
0x800955F0:"getcurrfaultthread",
0x800957b0:"startthread",
0x80095900:"",
0x80095a60:"llcvt",
0x80096510:"spsetpc",
}

485
print_mdebug.py Normal file
View File

@ -0,0 +1,485 @@
'''
Resources:
http://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf
https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/include/coff/sym.h
https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/include/coff/symconst.h
https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/gas/ecoff.c
https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/bfd/ecoff.c
https://github.com/pathscale/absoft/blob/master/svn/trunk/ekopath-gcc/ekopath-gcc-4.2.0/gcc/mips-tdump.c
'''
import os
import struct
import collections
import sys
OFFSET = 0 # TODO why are the offsets in the symbolic header off by some amount?
indent_level = 0
is_comment = False
symbol_type_list = [
'stNil', 'stGlobal', 'stStatic', 'stParam', 'stLocal', 'stLabel', 'stProc', 'stBlock',
'stEnd', 'stMember', 'stTypedef', 'stFile', 'INVALID', 'INVALID', 'stStaticProc', 'stConstant',
'stStaParam', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID',
'INVALID', 'INVALID', 'stStruct', 'stUnion', 'stEnum', 'INVALID', 'INVALID', 'INVALID',
'INVALID', 'INVALID', 'stIndirect']
storage_class_list = ['scNil', 'scText', 'scData', 'scBss', 'scRegister', 'scAbs', 'scUndefined', 'reserved',
'scBits', 'scDbx', 'scRegImage', 'scInfo', 'scUserStruct', 'scSData', 'scSBss', 'scRData',
'scVar', 'scCommon', 'scSCommon', 'scVarRegister', 'scVariant', 'scUndefined', 'scInit']
basic_type_c_list = ['nil', 'addr', 'signed char', 'unsigned char', 'short', 'unsigned short', 'int', 'unsigned int',
'long', 'unsigned long', 'float', 'double', 'struct', 'union', 'enum', 'typedef',
'range', 'set', 'complex', 'double complex', 'indirect', 'fixed decimal', 'float decimal', 'string',
'bit', 'picture', 'void', 'long long', 'unsigned long long', 'INVALID', 'long', 'unsigned long',
'long long', 'unsigned long long', 'addr', 'int64', 'unsigned int64']
def increase_indent():
global indent_level
indent_level += 1
def decrease_indent():
global indent_level
indent_level -= 1
def set_is_comment(set_to):
global is_comment
old = is_comment
is_comment = set_to
return old
def get_indent():
global indent_level
global is_comment
ret = '//' if is_comment else ''
for i in range(indent_level):
ret += ' '
return ret
def read_uint32_be(file_data, offset):
return struct.unpack('>I', file_data[offset:offset+4])[0]
def read_uint16_be(file_data, offset):
return struct.unpack('>H', file_data[offset:offset+2])[0]
def read_uint8_be(file_data, offset):
return struct.unpack('>B', file_data[offset:offset+1])[0]
def read_elf_header(file_data, offset):
Header = collections.namedtuple('ElfHeader',
'''e_magic e_class e_data e_version e_osabi e_abiversion e_pad
e_type e_machine e_version2 e_entry e_phoff e_shoff e_flags
e_ehsize e_phentsize e_phnum e_shentsize e_shnum e_shstrndx''')
return Header._make(struct.unpack('>I5B7s2H5I6H', file_data[offset:offset+52]))
def read_elf_section_header(file_data, offset):
Header = collections.namedtuple('SectionHeader',
'''sh_name sh_type sh_flags sh_addr sh_offset sh_size sh_link
sh_info sh_addralign sh_entsize''')
return Header._make(struct.unpack('>10I', file_data[offset:offset+40]))
def read_symbolic_header(file_data, offset):
Header = collections.namedtuple('SymbolicHeader',
'''magic vstamp ilineMax cbLine cbLineOffset idnMax cbDnOffset
ipdMax cbPdOffset isymMax cbSymOffset ioptMax cbOptOffset
iauxMax cbAuxOffset issMax cbSsOffset issExtMax cbSsExtOffset
ifdMax cbFdOffset crfd cbRfdOffset iextMax cbExtOffset''')
return Header._make(struct.unpack('>2H23I', file_data[offset:offset+96]))
# TODO find a better solution for the bitfield
def read_file_descriptor(file_data, offset):
if 'init' not in read_file_descriptor.__dict__:
read_file_descriptor.cache = {}
read_file_descriptor.header = collections.namedtuple('FileDescriptor',
'''adr rss issBase cbSs isymBase csym ilineBase cline ioptBase
copt ipdFirst cpd iauxBase caux rfdBase crfd XXX_bitfield
cbLineOffset cbLine''')
read_file_descriptor.init = True
if offset in read_file_descriptor.cache:
return read_file_descriptor.cache[offset]
read_file_descriptor.cache[offset] = read_file_descriptor.header._make(
struct.unpack('>I2iI6iHh4iI2I', file_data[offset:offset+72]))
return read_file_descriptor.cache[offset]
def read_procedure_descriptor(file_data, offset):
Header = collections.namedtuple('ProcedureDescriptor',
'''adr isym iline regmask regoffset iopt fregmask fregoffset
frameoffset framereg pcreg lnLow lnHigh cbLineOffset''')
return Header._make(struct.unpack('>I8i2h2iI', file_data[offset:offset+52]))
def read_symbol(file_data, offset):
if 'init' not in read_symbol.__dict__:
read_symbol.cache = {}
read_symbol.header = collections.namedtuple('Symbol', '''iss value st sc index''')
read_symbol.init = True
if offset in read_symbol.cache:
return read_symbol.cache[offset]
(word0, word1, word2) = struct.unpack('>iII', file_data[offset:offset+12])
read_symbol.cache[offset] = read_symbol.header._make((
word0, word1, (word2 >> 26) & 0x3F, (word2 >> 21) & 0x1F, word2 & 0xFFFFF))
return read_symbol.cache[offset]
def read_auxiliary_symbol(file_data, offset):
if 'init' not in read_auxiliary_symbol.__dict__:
read_auxiliary_symbol.cache = {}
read_auxiliary_symbol.header = collections.namedtuple('AuxSymbol',
'''ti rndx dnLow dnHigh isym iss width count''')
read_auxiliary_symbol.type_info = collections.namedtuple('TypeInfo',
'''fBitfield continued bt tq4 tq5 tq0 tq1 tq2 tq3''')
read_auxiliary_symbol.rel_sym = collections.namedtuple('RelativeSymbol', '''rfd index''')
read_auxiliary_symbol.init = True
if offset in read_auxiliary_symbol.cache:
return read_auxiliary_symbol.cache[offset]
word0 = struct.unpack('>I', file_data[offset:offset+4])[0]
read_auxiliary_symbol.cache[offset] = read_auxiliary_symbol.header._make((
read_auxiliary_symbol.type_info._make(((word0 >> 31) & 1, (word0 >> 30) & 1, (word0 >> 24) & 0x3F, (word0 >> 20) & 0xF, (word0 >> 16) & 0xF, (word0 >> 12) & 0xF, (word0 >> 8) & 0xF, (word0 >> 4) & 0xF, word0 & 0xF)),
read_auxiliary_symbol.rel_sym._make(((word0 >> 20) & 0xFFF, word0 & 0xFFFFF)),
word0, word0, word0, word0, word0, word0))
return read_auxiliary_symbol.cache[offset]
def read_string(file_data, offset):
current_offset = 0
current_string = b''
while True:
char = struct.unpack('c', file_data[offset+current_offset:offset+current_offset+1])[0]
if char == b'\0':
return current_string.decode('ascii')
else:
current_string += char
current_offset += 1
def get_symbol_name_from_aux(file_data, fd, symbolic_header, aux_num, search_for_typedef):
aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + aux_num)*4)
fd_num = aux.rndx.rfd
next_aux = aux_num+1
if fd_num == 4095:
aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4)
fd_num = aux2.isym
next_aux = next_aux+1;
fd2 = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + fd_num*72)
sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd2.isymBase + aux.rndx.index)*12)
ret = ''
#print('%r' % (aux,));
#print('%r' % (aux2,));
#print('%r' % (sym,));
if sym.st == 26 or sym.st == 27: #stStruct, stunion
ret = get_struct_or_union_string(file_data, fd2, symbolic_header, fd2.isymBase + aux.rndx.index, search_for_typedef)
elif sym.st == 28: #stEnum:
ret = get_enum_string(file_data, fd2, symbolic_header, fd2.isymBase + aux.rndx.index)
else:
ret = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd2.issBase + sym.iss)
return (ret, next_aux)
def get_type_string(file_data, fd, symbolic_header, aux_num, name, search_for_typedef):
ret = ''
aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + aux_num)*4)
#print('');
#print('%r' % (aux,));
next_aux = aux_num+1
has_bitfield = aux.ti.fBitfield == 1
bitwidth = 0
if has_bitfield:
bit_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4)
bitwidth = bit_aux.isym
next_aux = next_aux+1
if aux.ti.bt == 12: # btStruct
(ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef)
elif aux.ti.bt == 13: # btUnion
(ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef)
elif aux.ti.bt == 15: # btTypedef
(ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef)
elif aux.ti.bt == 14: # btEnum
(ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef)
else:
ret = basic_type_c_list[aux.ti.bt]
tq_list = (aux.ti.tq0, aux.ti.tq1, aux.ti.tq2, aux.ti.tq3, aux.ti.tq4, aux.ti.tq5)
# TODO this is very naive and probably does not work in a large amount of cases
last_was_proc = False # if we see a tqProc, assume the next will be a tqPtr
for tq in tq_list:
if tq == 0: # tqNil
break;
elif tq == 1: # tqPtr
if last_was_proc:
last_was_proc = False
continue
ret += '*'
elif tq == 2: # tqProc
last_was_proc = True
name = '(*%s)(... /* ECOFF does not store param types */)' % name
elif tq == 3: # tqArray
next_aux += 2 # todo what does this skip over? (Apparantly the type of the index, so always int for C)
array_low_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4)
array_high_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux+1)*4)
stride_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux+2)*4)
next_aux += 3
if array_high_aux.dnHigh == 0xFFFFFFFF:
name += '[]'
else:
name += '[%d]' % (array_high_aux.dnHigh + 1)
elif tq == 4: # tqFar
print('ERROR tqFar in get_type_name')
elif tq == 5: # tqVol
ret = 'volatile ' + ret
elif tq == 6: # tqConst
ret = 'const ' + ret
if has_bitfield:
name += ' : %d' % bitwidth
return ret + ' ' + name
def get_enum_string(file_data, fd, symbolic_header, enum_sym_num):
ret = ''
start_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + enum_sym_num*12)
if start_sym.st != 28:
print('ERROR unkown type in get_enum_string start:%d' % start_sym.st)
return ret
ret += 'enum {\n'
increase_indent()
sym_num = enum_sym_num + 1
while sym_num < fd.isymBase + start_sym.index:
sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
if sym.st == 8: # stEnd
decrease_indent()
ret += get_indent()
ret += '}'
elif sym.st == 9: # stMember
name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)
ret += get_indent()
ret += '%s = %d,\n' % (name, sym.value)
else:
print('ERROR unkown type in get_enum_string:%d' % sym.st)
break
sym_num += 1
return ret
def get_struct_or_union_string(file_data, fd, symbolic_header, union_sym_num, search_for_typedef):
ret = ''
start_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + union_sym_num*12)
if search_for_typedef:
typedef_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd.isymBase + start_sym.index)*12)
if typedef_sym.st == 10: # stTypedef
return read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + typedef_sym.iss)
else:
name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss)
if name != '':
return name
if start_sym.st == 26: # stStruct
ret += 'struct {\n'
increase_indent()
elif start_sym.st == 27: # stUnion
ret += 'union {\n'
increase_indent()
else:
print('ERROR unkown type in get_struct_or_union_string start:%d' % start_sym.st)
return ret
sym_num = union_sym_num + 1
while sym_num < fd.isymBase + start_sym.index:
sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
if sym.st == 8: # stEnd
decrease_indent()
ret += get_indent()
ret += '}'
elif sym.st == 9: # stMember
name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)
ret += get_indent()
ret += '/* %d */ %s;\n' % (sym.value / 8, get_type_string(file_data, fd, symbolic_header, sym.index, name, True))
elif sym.st == 26 or sym.st == 27: #stStruct, stUnion
sym_num = fd.isymBase + sym.index
continue
elif sym.st == 34: # stIndirect
# TODO what even is a stIndirect?
sym_num += 1
else:
print('ERROR unkown type in get_struct_or_union_string:%d' % sym.st)
break
sym_num += 1
return ret
def print_typedef_symbols(file_data, fd, symbolic_header, typedef_sym_num):
typedef_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + typedef_sym_num*12)
if typedef_sym.st != 10: # stTypedef
print('ERROR expected stTypedef symbol in print_typedef_symbols, found:%d' % typedef_sym.st)
return
name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + typedef_sym.iss)
print('typedef %s;' % get_type_string(file_data, fd, symbolic_header, typedef_sym.index, name, False))
def print_procedure(file_data, fd, symbolic_header, proc_sym_num):
proc_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + proc_sym_num*12)
proc_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + proc_sym.iss)
print('%s(' % get_type_string(file_data, fd, symbolic_header, proc_sym.index+1, proc_name, True), end='')
sym_num = proc_sym_num+1
param_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
first = True
while param_sym.st == 3: # stParam
param_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + param_sym.iss)
print('%s%s' % ('' if first else ', ',
get_type_string(file_data, fd, symbolic_header, param_sym.index, param_name, True)),
end='')
sym_num += 1
param_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
first = False
print(');')
comment_old = set_is_comment(True)
while sym_num < fd.isymBase + fd.csym:
sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
sym_num += 1
if sym.st == 7: # stBlock
print('%s{' % get_indent())
increase_indent()
elif sym.st == 8: # stEnd
if proc_name == read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss):
set_is_comment(comment_old)
return sym_num
decrease_indent()
print('%s}' % get_indent())
elif sym.st == 4: # stLocal
local_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)
is_reg = sym.sc == 4 # scRegister
print('%s%s%s;' % (get_indent(),
'register ' if is_reg else '',
get_type_string(file_data, fd, symbolic_header, sym.index, local_name, True)))
elif sym.st == 2: # stStatic
static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)
print('%sstatic %s;' % (get_indent(),get_type_string(file_data, fd, symbolic_header, sym.index, static_name, True)))
elif sym.st == 5: # stLabel
static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)
print('%sLabel: %s @ %d;' % (get_indent(), static_name, sym.value))
elif sym.st == 6: # stProc
# multiple name for function?
sym_num = print_procedure(file_data, fd, symbolic_header, sym_num-1)
elif sym.st == 26 or sym.st == 27: #stStruct, stUnion
sym_num = fd.isymBase + sym.index
elif sym.st == 34: # stIndirect
# TODO what even is a stIndirect?
sym_num += 1
else:
print('ERROR unkown st in print_procedure: %d' % sym.st)
set_is_comment(comment_old)
return sym_num
def print_symbols(file_data, fd, symbolic_header):
sym_num = fd.isymBase
while sym_num < fd.isymBase + fd.csym:
root_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
if root_sym.st == 11: # stFile
file_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + root_sym.iss)
print('// begin file %s\n' % file_name)
sym_num += 1
leaf_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
while leaf_sym.st != 8: # stEnd
if leaf_sym.st == 26 or leaf_sym.st == 27 or leaf_sym.st == 28: # stStruct, stUnion, stEnum
sym_num = fd.isymBase + leaf_sym.index
print('')
elif leaf_sym.st == 10: # stTypedef
print_typedef_symbols(file_data, fd, symbolic_header, sym_num)
sym_num += 1
print('')
elif leaf_sym.st == 6 or leaf_sym.st == 14: # stProc, stStaticProc
# TODO how do stProc and stStaticProc differ? stStaticProc isn't exported?
sym_num = print_procedure(file_data, fd, symbolic_header, sym_num)
print('')
elif leaf_sym.st == 2: # stStatic
static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss)
if leaf_sym.sc == 2 or leaf_sym.sc == 3: # scData, scBss
print('static %s;\n' % get_type_string(file_data, fd, symbolic_header, leaf_sym.index, static_name, True))
else:
# TODO what do 'Load time only' symbols do?
print('// static %s; - Load time only\n' % static_name)
sym_num += 1
else:
print('ERROR unkown st in leaf_sym in print_symbols: %d' % leaf_sym.st)
sym_num += 1
leaf_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
sym_num = fd.isymBase + root_sym.index
print('// end file %s' % file_name)
else:
print('ERROR expected st of stFile as only root type in print_symbols:%d' % root_sym.st)
return
def main():
global OFFSET
if len(sys.argv) < 2:
return # TODO print usage
filename = sys.argv[1]
try:
with open(filename, 'rb') as f:
file_data = f.read()
except IOError:
print('failed to read file ' + filename)
return
elf_header = read_elf_header(file_data, 0)
section_headers = []
debug_index = 0xFFFFFFFF
#print('%r' % (elf_header,))
for i in range(elf_header.e_shnum):
section_headers.append(read_elf_section_header(file_data, elf_header.e_shoff + i*40))
#print('%r' % (section_headers[i],))
if section_headers[i].sh_type == 0x70000005:
debug_index = i
if debug_index != 0xFFFFFFFF:
symbolic_header = read_symbolic_header(file_data, section_headers[debug_index].sh_offset)
file_descriptors = []
print('%r' % (symbolic_header,))
# Set offset by assuming that there are no optimization symbols so cbOptOffset points to the start of the symbolic header
OFFSET = symbolic_header.cbOptOffset - section_headers[debug_index].sh_offset
print('Using OFFSET of %d' % OFFSET)
#for sym_num in range(symbolic_header.isymMax):
#sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
#print('%d:%r' % (sym_num, (sym,)));
#for aux_num in range(symbolic_header.iauxMax):
#aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + aux_num*4)
#print('%d:%r' % (aux_num, (aux,)));
for file_num in range(symbolic_header.ifdMax):
fd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + file_num*72)
file_descriptors.append(fd)
for file_num in range(symbolic_header.ifdMax):
fd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + file_num*72)
print('%r' % (fd,))
print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + fd.rss))
print(' procedures:')
for proc_num in range(fd.ipdFirst, fd.ipdFirst + fd.cpd):
pd = read_procedure_descriptor(file_data, symbolic_header.cbPdOffset - OFFSET + proc_num*52)
print(' %r' % ((pd,)))
print(' symbols:')
for sym_num in range(fd.isymBase, fd.isymBase + fd.csym):
sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12)
print(' %r' % ((sym,)))
print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss))
print(' type:%s(%d)' % (symbol_type_list[sym.st], sym.st))
print(' storage class:%s(%d)' % (storage_class_list[sym.sc], sym.sc))
if sym.st == 3 or sym.st == 4 or sym.st == 9 or sym.st == 10 or sym.st == 28: # stParam, stLocal, stMember, stTypedef, stEnum
aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index)*4)
print(' %r' % ((aux,)))
offset = 0
if aux.ti.fBitfield == 1:
bitfield_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 1)*4)
print(' %r' % ((bitfield_aux,)))
offset = 1
if aux.ti.bt == 12 or aux.ti.bt == 13 or aux.ti.bt == 14 or aux.ti.bt == 15: # btStruct, btUnion, btEnum, btTypedef
aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 1 + offset)*4)
print(' %r' % ((aux2,)))
if aux2.rndx.rfd == 4095:
aux3 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 2 + offset)*4)
print(' %r' % ((aux3,)))
sym2 = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (file_descriptors[aux3.isym].isymBase + aux2.rndx.index)*12)
print(' %r' % (sym2,))
print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + file_descriptors[aux3.isym].issBase + sym2.iss))
if sym.st == 6: # stProc
# TODO what is the first aux symbol for?
aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index)*4)
type_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index+1)*4)
print(' %r' % ((aux,)))
print(' %r' % ((type_aux,)))
print(' pretty print:')
print_symbols(file_data, fd, symbolic_header)
main()

128
src/boot/boot_0x80080060.c Normal file
View File

@ -0,0 +1,128 @@
#include <ultra64.h>
#include <global.h>
UNK_RET func_80080060(void) {
func_80085320(&D_80099500, &D_80099AF0, &D_80099EF0, 0, -1, &D_80098190);
D_80000318 = func_8008D350();
func_800818F4();
func_8008A6FC();
func_8008EDE0();
D_80096B40 = func_80092920();
func_80085320(&D_80099AD0, &D_800996D0, &D_80099AD0_, 0, 256, &D_80098198);
osCreateThread(&D_80099520, 1, (void(*)(void*))func_80080514, 0, &D_80099AD0, 12);
func_800957B0(&D_80099520);
}
void func_80080150(UNK_PTR a0, UNK_PTR a1) {
if (a0 < a1) {
func_80089630(a0, (u32)a1 - (u32)a0);
}
}
void func_80080180(UNK_TYPE* a0, UNK_TYPE a1, UNK_TYPE a2) {
for (; a1 != 0; a1 -= 4) {
*a0++ = a2;
}
}
UNK_RET func_8008019C(void) {
func_80080180(&D_80000500, 0x25800, 0x00010001);
func_800805E0(0);
func_8008FE60(&D_80000500);
func_8008AE70(0);
}
UNK_RET func_800801EC(void) {
func_80080150((void*)0x80000400, &D_80000500);
func_80080150(&D_80025D00, (int*)func_80080060);
func_80080150(&D_80208EA0, (UNK_PTR)(0x80000000 + D_80000318));
}
UNK_RET func_80080250(void) {
UNK_PTR v0;
UNK_PTR v1;
UNK_PTR t7;
UNK_TYPE sp88;
UNK_TYPE sp84;
UNK_TYPE sp80;
UNK_TYPE sp76;
UNK_TYPE sp72;
UNK_TYPE sp68;
UNK_TYPE sp64;
UNK_TYPE sp60;
UNK_TYPE sp56;
UNK_TYPE sp52;
UNK_TYPE sp48;
UNK_TYPE sp44;
UNK_PTR sp40;
func_8008F240(&sp48, &sp44, 1);
v1 = &D_00B3C000;
t7 = &D_00C7A4E0;
sp40 = D_80096B50;
*(int*)sp40 = 0;
func_80080C04(&sp72, (UNK_FUN_ARG)func_800A5AC0, v1, (u32)t7 - (u32)v1, 0, &sp48, 0);
func_8008019C();
func_800801EC();
func_80087ED0(&sp48, 0, 1);
D_80096B50 = sp40;
func_80080150(&D_801E3FA0, &D_80208EA0);
}
UNK_RET func_80080300(UNK_TYPE a0) {
func_80085320(&D_8009A670, &D_8009A170, &D_8009A670_, 0, 256, &D_800981A0);
func_80081754(&D_80099EF0, &D_8009A670, 18, 1);
func_80080D0C();
func_80080250();
func_80174BF0(a0);
func_80080E00();
}
void func_8008038C(void) {
u32 i;
func_800952A0(254);
D_80096B2C = 66;
D_80096B30 = 1.0;
D_80096B34 = 1.0;
switch (osTvType) {
case 1:
D_8009B290 = 2;
for (i = 0; i < 20; i++) {
D_800980E0[i] = D_8009B240[i];
}
D_80096B34 = D_800981B0;
break;
case 2:
D_8009B290 = 30;
for (i = 0; i < 20; i++) {
D_80098010[i] = D_8009B240[i];
}
D_80096B34 = D_800981B0;
break;
case 0:
D_8009B290 = 44;
for (i = 0; i < 20; i++) {
D_80097FC0[i] = D_8009B240[i];
}
break;
}
D_80096B20 = 1;
}
void func_80080514(UNK_TYPE a0) {
func_8008038C();
func_8008C020(150, &D_8009B228, &D_8009B160, 50);
func_80085320(&D_8009B140, &D_8009A840, &D_8009B140_, 0, 1024, &D_800981A8);
func_80089E40(&D_8009A690, 3, func_80080300, a0, &D_8009B140, 12);
func_800957B0(&D_8009A690);
func_8008FC00(0, 0);
while(1);
}

View File

@ -0,0 +1,55 @@
#include <ultra64.h>
#include <global.h>
UNK_RET func_800805E0(UNK_TYPE a0) {
if (a0 != 0) {
switch (osTvType) {
case 2:
func_8008B650(&D_80098010);
break;
case 0:
func_8008B650(&D_80097590);
break;
case 1:
default:
func_8008B650(&D_80097FC0);
break;
}
if (D_80096B2C != 0) {
func_80092100(D_80096B2C);
}
if (D_80096B34 != 1) {
func_80095900(1);
}
} else {
func_8008B650(&D_8009B240);
if (D_80096B28 != 0) {
func_80087E00(D_80096B28);
}
if (D_80096B2C != 0) {
func_80092100(D_80096B2C);
}
if (D_80096B30 != 1) {
func_80095950(D_80096B30);
}
if (D_80096B34 != 1) {
func_80095900(D_80096B34);
}
}
*D_80096B24 = a0;
}
UNK_RET func_80080748(void) {
if (*D_80096B24 != 0) {
func_8008AE70(1);
} else {
func_8008AE70(0);
}
}

View File

@ -0,0 +1,25 @@
#include <ultra64.h>
#include <global.h>
void func_80081820(void) {}
void func_80081828(void) {}
void func_80081830(void) {
func_8008481C(80, 200, &D_80098280, (UNK_PTR)(*(u32*)0xA4040010));
func_8008481C(40, 184, &D_80098290, &D_800994D0);
func_8008481C(56, 192, &D_800982A4, &D_800994DC);
}
void func_8008189C(void) {
func_800819F0(&D_8009BE38, (void(*)(UNK_TYPE, UNK_TYPE))func_80081830, 0, 0);
}
void func_800818D0(void) {
func_80081AD4(&D_8009BE38);
}
void func_800818F4(void) {
D_8009BE30 = *(u32*)0xA02FB1F4;
D_8009BE34 = *(u32*)0xA02FE1C0;
}

104
src/boot/boot_0x80085320.c Normal file
View File

@ -0,0 +1,104 @@
#include <ultra64.h>
#include <global.h>
void func_80085320(struct s80085320* a0, UNK_PTR a1, UNK_PTR a2, UNK_TYPE a3, UNK_TYPE sp16, UNK_PTR sp20) {
UNK_TYPE* i;
struct s80085320* v0;
if (a0 == NULL) {
g_s80085320_ListHead = NULL;
return;
}
a0->unk8 = a1;
a0->unk12 = a2;
a0->unk16 = a3;
a0->unk20 = sp16;
a0->unk24 = sp20;
v0 = g_s80085320_ListHead;
while (v0 != NULL) {
if (v0 == a0) return;
v0 = v0->next;
}
a0->prev = g_s80085320_ListTail;
a0->next = NULL;
if (g_s80085320_ListTail != NULL) {
g_s80085320_ListTail->next = a0;
}
g_s80085320_ListTail = a0;
if (g_s80085320_ListHead == NULL) {
g_s80085320_ListHead = a0;
}
if (a0->unk20 != -1) {
for (i = a0->unk8; i < a0->unk12; i++) {
*i = a0->unk16;
}
}
}
UNK_RET func_800853F8(struct s80085320* a0) {
if (a0->prev == NULL) {
if (g_s80085320_ListHead == a0) {
g_s80085320_ListHead = a0->next;
}
} else {
a0->prev->next = a0->next;
}
if (a0->next == NULL) {
if (g_s80085320_ListTail == a0) {
g_s80085320_ListTail = a0->prev;
}
}
}
UNK_TYPE func_80085468(struct s80085320* a0) {
UNK_TYPE* v1 = a0->unk8;
UNK_TYPE* a1 = a0->unk12;
UNK_TYPE* v0 = v1;
u32 x; // ptr_diff
while (v0 < a1) {
if (*v0++ != a0->unk16) break;
a1 = (UNK_TYPE*)((u32)v0 - (u32)v1);
}
x = v0 - v1;
if (x == 0) {
return 2;
}
if ((x < a0->unk20) && (a0->unk20 != -1)) {
return 1;
}
return 0;
}
UNK_TYPE func_800854E0(UNK_ARGS) {
struct s80085320* s0 = g_s80085320_ListHead;
UNK_TYPE ret = 0;
while (s0 != NULL) {
if (func_80085468(s0) != 0) {
ret = 1;
}
s0 = s0->next;
}
return ret;
}
UNK_RET func_80085538(struct s80085320* a0) {
if (a0 == NULL) {
func_800854E0();
} else {
func_80085468(a0);
}
}

View File

@ -0,0 +1,26 @@
#include <ultra64.h>
#include <global.h>
UNK_TYPE func_80087830(UNK_TYPE a0, UNK_TYPE a1, UNK_TYPE a2) {
return func_8008F208(a0, a1) + a2;
}
UNK_TYPE func_80087854(u8* a0, UNK_TYPE a1, UNK_PTR a2) {
UNK_TYPE v0 = func_8008E050(func_80087830, a0, a1, a2);
if (v0 >= 0) {
a0[v0] = 0;
}
return v0;
}
UNK_TYPE func_800878A4(u8* a0, UNK_TYPE a1, UNK_TYPE a2, UNK_TYPE a3) {
UNK_TYPE v0 = func_8008E050(func_80087830, a0, a1, &a2);
if (v0 >= 0) {
a0[v0] = 0;
}
return v0;
}

View File

@ -0,0 +1,30 @@
#include <ultra64.h>
#include <global.h>
UNK_RET func_80087900(UNK_PTR a0, UNK_TYPE a1, UNK_PTR a2) {
func_8008E050((UNK_TYPE(*)(UNK_TYPE, UNK_TYPE, UNK_TYPE))(*(u32*)a0), a0, a1, a2);
}
UNK_RET func_80087934(UNK_PTR a0, UNK_TYPE a1, UNK_PTR a2, UNK_TYPE a3) {
func_80087900(a0, a1, &a2);
}
UNK_RET func_80087960(u64 a0) {
}
UNK_RET func_800879CC(u32 a0) {
func_80087960(func_800888A8(func_800889A8(a0, 3), 64));
}
UNK_RET func_80087A1C(u32 a0) {
func_80087960(func_800888A8(func_800889A8(a0, 3000), 64));
}
UNK_RET func_80087A6C(u32 a0) {
func_80087960(func_800888A8(func_800889A8(a0, 0x02CB4178), 1000));
}
UNK_RET func_80087AC0(u32 a0) {
func_80087960(func_800889A8(a0, 0x02CB4178));
}

View File

@ -0,0 +1,6 @@
#include <ultra64.h>
#include <global.h>
void func_80087E00(u32 a0) {
D_8009817C = a0;
}

View File

@ -0,0 +1,64 @@
#include <ultra64.h>
#include <global.h>
void func_8008A660(void) {
D_8009D134 = 7;
D_8009D135 = *(u32*)0xA4600014;
D_8009D138 = *(u32*)0xA4600018;
D_8009D136 = *(u32*)0xA460001C;
D_8009D137 = *(u32*)0xA4600020;
D_8009D1AC = 7;
D_8009D1AD = *(u32*)0xA4600024;
D_8009D1B0 = *(u32*)0xA4600028;
D_8009D1AE = *(u32*)0xA460002C;
D_8009D1AF = *(u32*)0xA4600030;
}
u64 D_80097E50; // this has to be defined in this file for func_8008A6FC to match
void func_8008A6FC(void) {
UNK_TYPE sp44;
D_8009CF70 = 1;
func_8008A5D0(func_8008A5C0() | 0x20000000);
func_80092CE0(0x20000800);
func_80096820(0x04900000);
while (func_8008AEE0(0x1FC007FC, &sp44) != 0);
while (func_80095220(0x1FC007FC, sp44 | 8) != 0);
*(struct s8008A6FC*)0x80000000 = *((struct s8008A6FC*)__osExceptionPreamble);
*(struct s8008A6FC*)0x80000080 = *((struct s8008A6FC*)__osExceptionPreamble);
*(struct s8008A6FC*)0x80000100 = *((struct s8008A6FC*)__osExceptionPreamble);
*(struct s8008A6FC*)0x80000180 = *((struct s8008A6FC*)__osExceptionPreamble);
func_8008A5E0(0x80000000, 400);
func_8008F270(0x80000000, 400);
func_8008A660();
func_8008EDE0();
func_80093C00();
D_80097E50 = func_800888A8(func_800889A8(D_80097E50, 3), 4);
if (D_8000030C == 0) {
func_80089630(&D_8000031C, 64);
}
if (osTvType == 0) {
D_80097E58 = 0x02F5B2D2;
} else if (osTvType == 2) {
D_80097E58 = 0x02E6025C;
} else {
D_80097E58 = 0x02E6D354;
}
if((func_80093D90() & 0x1000) != 0) {
while(1);
}
*(u32*)0xA4500008 = 1;
*(u32*)0xA4500010 = 16383;
*(u32*)0xA4500014 = 15;
}
void func_8008A9A8(void) {}

View File

@ -0,0 +1,19 @@
#include <ultra64.h>
#include <global.h>
s32 __osSpRawStartDma(s32 direction, u32 devAddr , void* dramAddr, u32 size) {
if (__osSpDeviceBusy() != 0) {
return -1;
}
*(vu32*)0xA4040000 = devAddr;
*(vu32*)0xA4040004 = osVirtualToPhysical(dramAddr);
if (direction == 0) {
*(vu32*)0xA404000C = size - 1;
} else {
*(vu32*)0xA4040008 = size - 1;
}
return 0;
}

View File

@ -0,0 +1,30 @@
#include <ultra64.h>
#include <global.h>
UNK_TYPE func_8008D350(void) {
u32* sp12;
u32 sp8;
u32 sp4;
u32 sp0;
sp8 = 0x400000;
do {
sp12 = (u32*)(sp8 + 0xA0000000);
sp4 = *(u32*)(0xA0000000 + sp8);
sp0 = *(u32*)(0xA00FFFFC + sp8);
*(u32*)(0xA0000000 + sp8) = *(u32*)(0xA0000000 + sp8) ^ 0xFFFFFFFF;
sp12[0x000FFFFC/4] = sp12[0x000FFFFC/4] ^ 0xFFFFFFFF;
if ((sp12[0] != (sp4 ^ 0xFFFFFFFF)) ||
(sp12[0x000FFFFC/4] != (sp0 ^ 0xFFFFFFFF))) {
return sp8;
}
*sp12 = sp4;
sp12[0x000FFFFC/4] = sp0;
sp8 = sp8 + 0x100000;
} while(sp8 < 0x800000);
return sp8;
}

View File

@ -0,0 +1,61 @@
#include <ultra64.h>
#include <global.h>
struct s80092920* func_80092920(void) {
u32 v0;
u32 temp;
u32 temp2;
u32 temp3;
u32 temp4;
UNK_TYPE func_ret;
func_8008C1E0();
if (D_800980D0 == 0) {
func_8008C224();
return &D_8009E610;
}
D_800980D0_ = 0;
D_8009E610.unk4 = 0;
D_8009E610.unk12 = 0xB0000000;
D_8009E610.unk9 = 0;
D_8009E610.unk16 = 0;
func_80089630(&D_8009E624, 96);
while ((*(vu32*)0xA4600010) & 0x3);
temp = *(vu32*)0xA4600014;
temp2 = *(vu32*)0xA460001C;
temp3 = *(vu32*)0xA4600020;
temp4 = *(vu32*)0xA4600018;
*(vu32*)0xA4600014 = 255;
*(vu32*)0xA460001C = 0;
*(vu32*)0xA4600020 = 3;
*(vu32*)0xA4600018 = 255;
v0 = *(u32*)(D_8009E610.unk12 | 0xA0000000);
D_8009E610.unk6 = (v0 >> 16) & 0xF;
D_8009E610.unk7 = (v0 >> 20) & 0xF;
D_8009E610.unk8 = v0 >> 8;
D_8009E610.unk5 = v0;
*(vu32*)0xA4600014 = temp;
*(vu32*)0xA460001C = temp2;
*(vu32*)0xA4600020 = temp3;
*(vu32*)0xA4600018 = temp4;
func_ret = func_80091A60();
D_8009E610.unk0 = D_80097E8C;
D_80097E8C = &D_8009E610;
func_80091AD0(func_ret);
func_8008C224();
return &D_8009E610;
}

View File

@ -0,0 +1,14 @@
#include <ultra64.h>
#include <global.h>
void func_80095900(f32 f12) {
u32 oldInt;
oldInt = __osDisableInt();
*((f32*)__osViNext + 36 / 4) = f12;
*(u16*)__osViNext |= 0x4;
__osRestoreInt(oldInt);
}

View File

@ -0,0 +1,15 @@
#include <ultra64.h>
#include <global.h>
u32 func_800968B0(const u8* a0, const u8* a1) {
u8 v0;
u8 v1;
do {
v0 = *a0++;
v1 = *a1++;
if (v0 != v1) {
return v0 - v1;
}
} while (v0 != 0);
return 0;
}

View File

@ -0,0 +1,52 @@
#include <ultra64.h>
#include <global.h>
UNK_RET func_800A5AC0(void* a0, UNK_TYPE a1) {
struct s800A5AC0* s0 = (struct s800A5AC0*)a0;
s0->unk278 = ((s0->unk28 >> 8) & 0xFF) | 0x300;
s0->unk28 = (s0->unk28 & 0xFF) - 9;
func_800FFADC(s0, &D_801ADEAC);
func_800B3BA4(&s0->unk188, 0, (void*)&func_800B3FC0, 0x41400000);
func_800E1374(a1, &s0->unk328, s0, &D_801ADE80);
func_800E7DF8(s0, &s0->unk328);
s0->unk182 = 255;
s0->unk324 = func_800A5B98;
}
UNK_RET func_800A5B6C(struct s800A5AC0* a0, UNK_TYPE a1) {
func_800E11EC(a1, &a0->unk328);
}
UNK_RET func_800A5B98(struct s800A5AC0* a0, UNK_TYPE a1) {
s16 v0;
s32 v1;
if (func_800B84D0(a0, a1) != 0) {
a0->unk324 = func_800A5C28;
} else {
v0 = a0->unk146 - a0->unk190;
if (v0 < 0) {
v1 = -v0;
} else {
v1 = v0;
}
if ((v1 < 10240) || ((a0->unk28 == 1) && (v1 > 22528))) {
func_800B863C(a0, a1);
}
}
}
UNK_RET func_800A5C28(struct s800A5AC0* a0, UNK_TYPE a1 /* unused */ ) {
if (func_800B867C(a0) != 0) {
a0->unk324 = func_800A5B98;
}
}
UNK_RET func_800A5C60(struct s800A5AC0* a0, UNK_TYPE a1) {
(a0->unk324)(a0, a1);
func_800B675C(a0, 0x42340000);
func_800E2928(a1, a1 + 0x18884, &a0->unk328);
}
UNK_RET func_800A5CB8(struct s800A5AC0* a0, UNK_TYPE a1) {
func_800BDFC0(a1, D_801ADEB0[a0->unk28], a1, a0);
}

View File

@ -0,0 +1,32 @@
#include <ultra64.h>
#include <global.h>
UNK_RET func_800BF9A0(UNK_TYPE a0, UNK_TYPE a1) {
s32 i;
s800BF9A0_s* s0;
func_8008439C(-2, 0);
func_800847CC(&D_801DCBB0, D_801B4610);
func_800847CC(&D_801DCBC4);
for (i = 0, s0 = D_801AEFD0; i < D_801B4610; i++, s0++) {
if (s0->unk16 == 0) continue;
func_800847CC(&D_801DCBE4, i, s0->unk16, s0->unk16 + (s0->unk12 - s0->unk8), s0->unk30, &D_801DCBFC);
}
}
UNK_TYPE func_800BFA78(UNK_TYPE a0, UNK_TYPE a1) {
}
UNK_RET func_800BFAE8(UNK_ARGS) {
D_801B4610 = 690;
func_800819F0(&D_801ED930, func_800BF9A0, 0, 0);
func_80081BCC(&D_801ED940, func_800BFA78, 0);
}
UNK_RET func_800BFB40(UNK_ARGS) {
func_80081AD4(&D_801ED930);
func_80081CA4(&D_801ED940);
D_801B4610 = 0;
}

View File

@ -0,0 +1,99 @@
#include <ultra64.h>
#include <global.h>
UNK_RET func_800CAAD0(UNK_TYPE a0, UNK_TYPE a1, UNK_TYPE a2) {
UNK_TYPE sp208;
UNK_TYPE sp144;
UNK_TYPE sp80;
UNK_TYPE sp68;
UNK_TYPE sp56;
UNK_TYPE sp36;
s800CAAD0* v1;
if (func_800C6024(a1) == 0) return;
v1 = (s800CAAD0*)(a0 + a1 * 100);
func_80139894(&sp208, v1->unk104, v1->unk108, v1->unk112, v1->unk116, v1->unk118,
v1->unk120, v1->unk124, v1->unk128, v1->unk132);
if (func_80139188(&sp208, &sp144) == 2) return;
func_80139894(&sp80, v1->unk136, v1->unk140, v1->unk144, v1->unk148, v1->unk150,
v1->unk152, v1->unk156, v1->unk160, v1->unk164);
func_80138C88(&sp144, (UNK_PTR)(a2 + 36), &sp36);
func_80138C88(&sp80, &sp56, &sp68);
v1->unk0 = *(UNK_TYPE*)((u8*)sp36 + 0);
v1->unk4 = *(UNK_TYPE*)((u8*)sp36 + 4);
v1->unk8 = *(UNK_TYPE*)((u8*)sp36 + 8);
}
UNK_RET func_800CAC0C(UNK_TYPE a0, UNK_TYPE a1, UNK_TYPE a2) {
UNK_TYPE v0;
s16 v1;
if (func_800C6024(a0) == 0) return;
v0 = a0 + a1 * 100;
v1 = *(s16*)(v0 + 150) - *(s16*)(v0 + 118);
if (*(s16*)a2 == 0) {
*(s16*)(a2 + 2772) += v1;
}
*(s16*)(a2 + 190) += v1;
*(s16*)(a2 + 50) += v1;
}
UNK_RET func_800CACA0(UNK_TYPE a0, UNK_TYPE a1, UNK_TYPE a2) {
UNK_TYPE sp28;
if (func_800C6024(a2) == 0) return;
sp28 = func_800C6248(a0, a2);
if (sp28 == 0) return;
func_800CAE88(sp28);
if ((*(u32*)(a1 + 4) & 0x04000000) == 0x0400) {
func_800CAF24(sp28);
}
if ((*(u32*)(a1 + 4) & 0x20000) == 0x20000) {
func_800CAF38(sp28);
}
}
UNK_TYPE func_800CAD2C(UNK_TYPE a0, UNK_TYPE a1, UNK_TYPE a2) {
UNK_TYPE v1;
UNK_TYPE sp36 = 0;
if (func_800C6024(a1) == 0) return;
if (((*(u16*)(a0 + a1*2 + 5084) & 0x2) != 0) ||
((*(u16*)(a0 + a1*2 + 5084) & 0x1) == 0)) {
return 0;
}
v1 = func_800C6248(a0, a1);
if (v1 == 0) {
return 0;
}
if ((*(u32*)(v1 + 340) & 0x1) != 0) {
func_800CAAD0(a0, a1, a2);
sp36 = 1;
}
if ((*(u32*)(v1 + 340) & 0x2) != 0) {
func_800CAC0C(a0, a1, a2);
sp36 = 1;
}
return sp36;
}

View File

@ -0,0 +1,32 @@
#include <osint.h>
#include "controller.h"
#include "siint.h"
s32 osContStartQuery(OSMesgQueue* mq)
{
s32 ret;
__osSiGetAccess();
if (__osContLastCmd != 0) {
__osPackRequestData(0);
__osSiRawStartDma(1, &__osContPifRam);
osRecvMesg(mq, NULL, 1);
}
ret = __osSiRawStartDma(0, &__osContPifRam);
__osContLastCmd = 0;
__osSiRelAccess();
return ret;
}
void osContGetQuery(OSContStatus* data)
{
u8 pattern;
__osContGetInitData(&pattern, data);
}

View File

@ -0,0 +1,60 @@
#ifndef _CONTROLLER_H_
#define _CONTROLLER_H_
typedef struct {
/* 0 */ u32 ramarray[15];
/* 60 */ u32 pifstatus;
} OSPifRam;
typedef struct {
/* 0 */ u8 dummy;
/* 1 */ u8 txsize;
/* 2 */ u8 rxsize;
/* 3 */ u8 cmd;
/* 4 */ u16 button;
/* 6 */ s8 stick_x;
/* 7 */ s8 stick_y;
} __OSContReadFormat;
typedef struct {
/* 0 */ u8 dummy;
/* 1 */ u8 txsize;
/* 2 */ u8 rxsize;
/* 3 */ u8 cmd;
/* 4 */ u8 typeh;
/* 5 */ u8 typel;
/* 6 */ u8 status;
/* 7 */ u8 dummy1;
} __OSContRequesFormat;
typedef struct {
/* 0 */ u8 dummy;
/* 1 */ u8 txsize;
/* 2 */ u8 rxsize;
/* 3 */ u8 cmd;
/* 4 */ u16 address;
/* 6 */ u8 data[32];
/* 38 */ u8 datacrc;
} __OSContRamReadFormat;
typedef struct {
/* 0 */ u16 company_code;
/* 2 */ u16 game_code;
/* 4 */ u8 start_page;
/* 5 */ u8 status;
/* 6 */ u16 data_sum;
/* 8 */ unsigned char ext_name[4];
/* 12 */ unsigned char game_name[16];
/* 28 */ s32 reserved;
} __OSDir;
typedef struct {
/* 0 */ u8 inode_page[256];
} __OSInode;
#endif

4
src/libultra/io/siint.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef _SIINT_H_
#define _SIINT_H_
#endif

View File

@ -0,0 +1,12 @@
#include <osint.h>
#include <assert.h>
s32 __osSiRawReadIo(u32 devAddr, u32* data) {
if (__osSiDeviceBusy() != 0) {
return -1;
}
*(u32*)(devAddr | 0xA0000000) = (u32)data;
return 0;
}

View File

@ -0,0 +1,6 @@
#include <osint.h>
#include <assert.h>
u32 __osSpGetStatus() {
return *(vu32*)0xA4040010;
}

View File

@ -0,0 +1,6 @@
#include <osint.h>
#include <assert.h>
void __osSpSetStatus(u32 data) {
*(vu32*)0xA4040010 = data;
}

66
src/libultra/io/sptask.c Normal file
View File

@ -0,0 +1,66 @@
#include <bstring.h>
#include <sptask.h>
#include <osint.h>
OSTask* _VirtualToPhysicalTask(OSTask* intp)
{
OSTask* tp = &tmp_task;
_bcopy((void*)intp, (void*)tp, sizeof(OSTask));
if (tp->t.ucode) {
tp->t.ucode = (u64*)osVirtualToPhysical(tp->t.ucode);
}
if (tp->t.ucode_data) {
tp->t.ucode_data = (u64*)osVirtualToPhysical(tp->t.ucode_data);
}
if (tp->t.dram_stack) {
tp->t.dram_stack = (u64*)osVirtualToPhysical(tp->t.dram_stack);
}
if (tp->t.output_buff) {
tp->t.output_buff = (u64*)osVirtualToPhysical(tp->t.output_buff);
}
if (tp->t.output_buff_size) {
tp->t.output_buff_size = (u64*)osVirtualToPhysical(tp->t.output_buff_size);
}
if (tp->t.data_ptr) {
tp->t.data_ptr = (u64*)osVirtualToPhysical(tp->t.data_ptr);
}
if (tp->t.yield_data_ptr) {
tp->t.yield_data_ptr = (u64*)osVirtualToPhysical(tp->t.yield_data_ptr);
}
return &tmp_task;
}
void osSpTaskLoad(OSTask* intp)
{
OSTask* tp;
tp = _VirtualToPhysicalTask(intp);
if ((tp->t.flags & 0x1) != 0) {
tp->t.ucode_data = tp->t.yield_data_ptr;
tp->t.ucode_data_size = tp->t.yield_data_size;
intp->t.flags = intp->t.flags & 0xFFFFFFFE;
if ((tp->t.flags & 0x4) != 0) {
tp->t.ucode = *(u64**)(((u32)intp->t.yield_data_ptr + 3068) | 0xA0000000);
}
}
osWritebackDCache((void*)tp, sizeof(OSTask));
__osSpSetStatus(11008);
while (__osSpSetPc(0x04001000) == -1);
while (__osSpRawStartDma(1, 0x04000FC0, (void*)tp, sizeof(OSTask)) == -1);
while (__osSpDeviceBusy());
while (__osSpRawStartDma(1, 0x04001000, (void*)tp->t.ucode_boot, tp->t.ucode_boot_size) == -1);
}
void osSpTaskStartGo(OSTask* tp)
{
while (__osSpDeviceBusy());
__osSpSetStatus(293);
}

View File

@ -0,0 +1,7 @@
#include <osint.h>
#include <viint.h>
#include <assert.h>
__OSViContext* __osViGetCurrentContext(void) {
return __osViCurr;
}

View File

@ -0,0 +1,39 @@
#include <string.h>
unsigned char* strchr(const unsigned char* s, int c)
{
const unsigned char ch = c;
while ( *s != ch) {
if (*s == '\0') {
return NULL;
}
s++;
}
return (unsigned char*)s;
}
size_t strlen(const unsigned char* s)
{
const unsigned char* sc = s;
while (*sc != '\0') sc++;
return (size_t)(sc - s);
}
void* memcpy(void* s1, const void* s2, size_t n)
{
unsigned char* su1 = (unsigned char*)s1;
const unsigned char* su2 = (const unsigned char*)s2;
while (n > 0) {
*su1 = *su2;
su1++;
su2++;
n--;
}
return s1;
}

View File

@ -0,0 +1,29 @@
#include <PR/ultratypes.h>
#include <osint.h>
void osCreateThread(OSThread* t, OSId id, void(*entry)(void*), void* arg, void* sp, OSPri p) {
register u32 saveMask;
OSIntMask mask;
t->id = id;
t->priority = p;
t->next = NULL;
t->queue = NULL;
t->context.pc = (u32)entry;
t->context.a0 = (u64)arg;
t->context.sp = (u64)sp - 16;
t->context.ra = (u64)__osCleanupThread;
mask = 0x3FFF01;
t->context.sr = 0xFF03;
t->context.rcp = (mask & 0x3F0000) >> 16;
t->context.fpcsr = 0x01000800;
t->fp = 0;
t->state = 1;
t->flags = 0;
saveMask = __osDisableInt();
t->tlnext = __osActiveQueue;
__osActiveQueue = t;
__osRestoreInt(saveMask);
}

View File

@ -0,0 +1,36 @@
#include <osint.h>
void osDestroyThread(OSThread* t)
{
register u32 saveMask;
register OSThread* pred;
register OSThread* succ;
saveMask = __osDisableInt();
if (t == NULL) {
t = __osRunningThread;
} else if (t->state != 1) {
__osDequeueThread(t->queue, t);
}
if (__osActiveQueue == t) {
__osActiveQueue = __osActiveQueue->tlnext;
} else {
pred = __osActiveQueue;
while (pred->priority != -1) {
succ = pred->tlnext;
if (succ == t) {
pred->tlnext = t->tlnext;
break;
}
pred = succ;
}
}
if (t == __osRunningThread) {
__osDispatchThread();
}
__osRestoreInt(saveMask);
}

View File

@ -0,0 +1,5 @@
#include <osint.h>
OSThread* __osGetCurrFaultedThread(void) {
return __osFaultedThread;
}

View File

@ -0,0 +1,8 @@
#include <osint.h>
OSId osGetThreadId(OSThread* t) {
if (t == NULL) {
t = __osRunningThread;
}
return t->id;
}

29
src/libultra/os/jammesg.c Normal file
View File

@ -0,0 +1,29 @@
#include <osint.h>
s32 osJamMesg(OSMesgQueue* mq, OSMesg msg, s32 flag) {
register u32 saveMask;
saveMask = __osDisableInt();
while (mq->validCount >= mq->msgCount) {
if (flag == 1) {
__osRunningThread->state = 8;
__osEnqueueAndYield(&mq->fullqueue);
} else {
__osRestoreInt(saveMask);
return -1;
}
}
mq->first = (mq->first + mq->msgCount - 1) % mq->msgCount;
mq->msg[mq->first] = msg;
mq->validCount++;
if (mq->mtqueue->next != NULL) {
osStartThread(__osPopThread(&mq->mtqueue));
}
__osRestoreInt(saveMask);
return 0;
}

View File

@ -0,0 +1,32 @@
#include <osint.h>
s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flags) {
register u32 saveMask;
saveMask = __osDisableInt();
while (mq->validCount == 0)
{
if (flags == 0)
{
__osRestoreInt(saveMask);
return -1;
}
__osRunningThread->state = 8;
__osEnqueueAndYield(&mq->mtqueue);
}
if (msg != NULL) {
*msg = mq->msg[mq->first];
}
mq->first = (mq->first + 1) % mq->msgCount;
mq->validCount--;
if (mq->fullqueue->next != NULL) {
osStartThread(__osPopThread(&mq->fullqueue));
}
__osRestoreInt(saveMask);
return 0;
}

View File

@ -0,0 +1,30 @@
#include <osint.h>
s32 osSendMesg(OSMesgQueue* mq, OSMesg msg, s32 flags) {
register u32 saveMask;
register s32 last;
saveMask = __osDisableInt();
while (mq->validCount >= mq->msgCount) {
if (flags == 1) {
__osRunningThread->state = 8;
__osEnqueueAndYield(&mq->fullqueue);
} else {
__osRestoreInt(saveMask);
return -1;
}
}
last = (mq->first + mq->validCount) % mq->msgCount;
mq->msg[last] = msg;
mq->validCount++;
if (mq->mtqueue->next != NULL) {
osStartThread(__osPopThread(&mq->mtqueue));
}
__osRestoreInt(saveMask);
return 0;
}

View File

@ -0,0 +1,22 @@
#include <osint.h>
void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg m) {
register u32 saveMask;
__OSEventState* es;
saveMask = __osDisableInt();
es = &__osEventStateTab[e];
es->messageQueue = mq;
es->message = m;
if (e == 14) {
if (__osShutdown != 0 && D_80097F10 == 0) {
osSendMesg(mq, m, 0);
}
D_80097F10 = 1;
}
__osRestoreInt(saveMask);
}

View File

@ -0,0 +1,35 @@
#include <osint.h>
void osStartThread(OSThread* t) {
register u32 saveMask;
saveMask = __osDisableInt();
switch (t->state) {
case 8:
t->state = 2;
__osEnqueueThread(&__osRunQueue, t);
break;
case 1:
if ((t->queue == NULL) || (t->queue == &__osRunQueue)) {
t->state = 2;
__osEnqueueThread(&__osRunQueue, t);
} else {
t->state = 8;
__osEnqueueThread(t->queue, t);
__osEnqueueThread(&__osRunQueue, __osPopThread(t->queue));
}
break;
}
if (__osRunningThread == NULL) {
__osDispatchThread();
} else {
if (__osRunningThread->priority < __osRunQueue->priority) {
__osRunningThread->state = 2;
__osEnqueueAndYield(&__osRunQueue);
}
}
__osRestoreInt(saveMask);
}

View File

@ -0,0 +1,29 @@
#include <osint.h>
void osStopThread(OSThread* t) {
register u32 saveMask;
register u16 state;
saveMask = __osDisableInt();
if (t == NULL) {
state = 4;
} else {
state = t->state;
}
switch (state)
{
case 4:
__osRunningThread->state = 1;
__osEnqueueAndYield(NULL);
break;
case 2:
case 8:
t->state = 1;
__osDequeueThread(t->queue, t);
break;
}
__osRestoreInt(saveMask);
}

View File

@ -0,0 +1,35 @@
#include <PR/ultratypes.h>
#include <rmon.h>
#include <osint.h>
#include <viint.h>
int osStopTimer(OSTimer* t)
{
register u32 savedMask;
OSTimer* timep;
if (t->next == NULL) {
return -1;
}
savedMask = __osDisableInt();
timep = t->next;
if (timep != __osTimerList) {
timep->value += t->value;
}
t->prev->next = t->next;
t->next->prev = t->prev;
t->next = NULL;
t->prev = NULL;
if (__osTimerList->next == __osTimerList) {
__osSetCompare(0);
}
__osRestoreInt(savedMask);
return 0;
}

19
src/libultra/os/thread.c Normal file
View File

@ -0,0 +1,19 @@
#include <PR/ultratypes.h>
#include <osint.h>
void __osDequeueThread(OSThread** queue, OSThread* t)
{
register OSThread* pred;
register OSThread* succ;
pred = (OSThread*)queue; //! This seems questionable, but the function matches...
succ = pred->next;
while (succ != NULL) {
if (succ == t) {
pred->next = t->next;
return;
}
pred = succ;
succ = pred->next;
}
}

View File

@ -0,0 +1,12 @@
#include <PR/ultratypes.h>
#include <osint.h>
u32 osVirtualToPhysical(void* virtualAddress) {
if (((u32)virtualAddress >= 0x80000000) && ((u32)virtualAddress < 0xA0000000)) {
return (u32)virtualAddress & 0x1FFFFFFF;
} else if (((u32)virtualAddress >= 0xA0000000) && ((u32)virtualAddress < 0xC0000000)) {
return (u32)virtualAddress & 0x1FFFFFFF;
} else {
return __osProbeTLB(virtualAddress);
}
}

164
src/olv_En_Test.c.ignore Normal file
View File

@ -0,0 +1,164 @@
#include <ultra64.h>
#include <global.h>
typedef struct s80862B70_s {
/* 0 */ u32 unk0;
/* 4 */ u32 unk4;
/* 8 */ f32 unk8;
/* 12 */ f32 unk12;
/* 16 */ f32 unk16;
/* 20 */ f32 unk20;
/* 24 */ f32 unk24;
/* 28 */ f32 unk28;
/* 32 */ f32 unk32;
/* 36 */ f32 unk36;
/* 40 */ f32 unk40;
/* 44 */ f32 unk44;
/* 48 */ u16 unk48;
/* 50 */ u16 unk50;
/* 52 */ u16 unk52;
/* 54 */ u16 unk54;
/* 56 */ u16 unk56;
/* 58 */ u16 unk58;
} s80862B70;
static const f32 D_808637D0 = 1.0;
void func_80862B70(void* a0) {
u32 i;
s80862B70* s;
f32 f = D_808637D0;
for (i = 0; i < 20; ++i) {
s = &((s80862B70*)a0)[i];
s->unk0 = 0;
s->unk4 = 0;
s->unk8 = 0.0;
s->unk12 = 0.0;
s->unk16 = 0.0;
s->unk20 = 0.0;
s->unk24 = 0.0;
s->unk28 = 0.0;
s->unk32 = 0.0;
s->unk36 = 0.0;
s->unk40 = 0.0;
s->unk44 = f;
s->unk48 = 0;
s->unk50 = 0;
s->unk52 = 0;
s->unk54 = 0;
s->unk56 = 0;
s->unk58 = 0;
}
}
UNK_RET func_80862CBC(UNK_ARGS) {
}
UNK_RET func_80862EDC(UNK_ARGS) {
}
UNK_RET func_80863048(UNK_ARGS) {
}
typedef struct s80863188_t {
u8 pad0[28];
/* 28 */ s16 unk28;
u8 pad1[6];
/* 36 */ UNK_TYPE unk36;
/* 40 */ f32 unk40;
/* 44 */ UNK_TYPE unk44;
/* 48 */ UNK_TYPE unk48;
/* 52 */ u16 unk52;
u8 pad2[74];
/* 128 */ UNK_TYPE unk128;
u8 pad3[4];
/* 136 */ f32 unk136;
u8 pad8[48];
/* 188 */ UNK_TYPE unk188;
u8 pad9[132];
/* 324 */ UNK_TYPE unk324;
u8 pad4[12];
/* 340 */ f32 unk340;
u8 pad5[28];
/* 372 */ UNK_TYPE unk372;
/* 376 */ UNK_TYPE unk376;
u8 pad6[68];
/* 448 */ UNK_TYPE unk448;
u8 pad10[69];
/* 521 */ u8 unk521;
/* 522 */ u8 unk522;
u8 pad7[1];
/* 524 */ UNK_TYPE unk524;
} s80863188;
// En_Test Init
UNK_RET func_80863188(UNK_TYPE a0, UNK_TYPE a1) {
s80863188* actor = (s80863188*)a0;
UNK_TYPE sp56;
UNK_TYPE sp52;
UNK_TYPE* sp48;
UNK_TYPE sp40;
UNK_TYPE sp20;
UNK_TYPE* sp16;
f32 f0;
actor->unk521 = 0;
actor->unk372 = 0;
if (actor->unk28 > 0) {
func_800B67E0(a0, ((f32)actor->unk28)/D_808637E8);
actor->unk522 = 0;
} else {
actor->unk40 = actor->unk40 + 10.0f;
actor->unk128 = 0;
sp40 = a1 + 2096;
func_800C40B4(sp40, &actor->unk128, &sp52, &actor->unk36);
f0 = actor->unk136;
if ((actor->unk128 == 0) || (f0 != -32000)) {
func_800B670C(a0);
return;
}
actor->unk40 = f0;
sp16 = &sp56;
sp48 = &actor->unk188;
func_800C0094(actor->unk128, actor->unk36, f0, actor->unk44);
func_8018219C(&sp56, sp48, 1, sp48);
actor->unk52 = sp48[1];
actor->unk522 = func_800C9BB8(sp40, actor->unk128, sp52, sp48);
}
sp16 = &actor->unk448;
sp48 = &actor->unk324;
sp20 = 0;
func_80183430(&actor->unk324, D_0406EB70, D_0406BB0C, &actor->unk376);
func_801834A8(sp48, D_0406BB0C);
actor->unk340 = 9.0;
func_80862B70((void*)actor->unk524);
}
// En_Test Dest
UNK_RET func_80863310(UNK_TYPE a0, UNK_TYPE a1) {
func_8018349C(a0+324, a0);
}
// En_Test Main
UNK_RET func_8086333C(UNK_ARGS) {
}
UNK_RET func_808634B8(UNK_ARGS) {
}
// En_Test Draw
UNK_RET func_808636A8(UNK_ARGS) {
}

39
src/test.c Normal file
View File

@ -0,0 +1,39 @@
#include <string.h>
unsigned char* strchr(const unsigned char* s, int c)
{
const unsigned char ch = c;
while ( *s != ch) {
if (*s == '\0') {
return NULL;
}
s++;
}
return (unsigned char*)s;
}
size_t strlen(const unsigned char* s)
{
const unsigned char* sc = s;
while (*sc != '\0') sc++;
return (size_t)(sc - s);
}
void* memcpy(void* s1, const void* s2, size_t n)
{
unsigned char* su1 = (unsigned char*)s1;
const unsigned char* su2 = (const unsigned char*)s2;
while (n > 0) {
*su1 = *su2;
su1++;
su2++;
n--;
}
return s1;
}

3975
textures.csv Normal file

File diff suppressed because it is too large Load Diff

14291
undef.txt Normal file

File diff suppressed because it is too large Load Diff

127
variables.py Normal file
View File

@ -0,0 +1,127 @@
known_vars = {
0x00B3C000:("","UNK_TYPE",False), # this seems low
0x00C7A4E0:("","UNK_TYPE",False), # this seems low
0x80000300:("osTvType","UNK_TYPE",False), # this seems low, but maybe it's set on boot?
0x8000030C:("","UNK_TYPE",False), # this seems low
0x80000318:("","UNK_TYPE",False), # this seems low
0x8000031C:("","UNK_TYPE",False), # this seems low
0x80000500:("","UNK_TYPE",False), # this seems low
0x80025D00:("","UNK_TYPE",False),
0x80096B20:("","u8",False),
0x80096B24:("","u8*",False),
0x80096B28:("","u32",False),
0x80096B2C:("","u32",False),
0x80096B30:("","f32",False),
0x80096B34:("","f32",False),
0x80096B40:("","struct s80092920*",False),
0x80096B50:("","UNK_PTR",False),
0x80096C40:("g_s80085320_ListHead","struct s80085320*",False), # TODO rename?
0x80096C44:("g_s80085320_ListTail","struct s80085320*",False), # TODO rename?
0x80097590:("","UNK_TYPE",False),
0x80097E10:("__osThreadTail","OSThread*",False),
0x80097E18:("__osRunQueue","OSThread*",False),
0x80097E1C:("__osActiveQueue","OSThread*",False),
0x80097E20:("__osRunningThread","OSThread*",False),
0x80097E24:("__osFaultedThread","OSThread*",False),
0x80097E30:("__osSiAccessQueueEnabled","UNK_TYPE",False),
0x80097E50:("osClockRate","u64",False),
# 0x80097E54:("osClockRate","u64",False),
0x80097E58:("","UNK_TYPE",False),
0x80097E5C:("__osShutdown","UNK_TYPE",False),
0x80097E60:("__OSGlobalIntMask","UNK_TYPE",False),
0x80097E70:("__osPiDevMgr","UNK_TYPE",False),
0x80097E8C:("","struct s80092920*",False),
0x80097EA0:("__osPiAccessQueueEnabled","UNK_TYPE",False),
0x80097F10:("","UNK_TYPE",False),
0x80097F70:("__osTimerList","OSTimer*",False),
0x80097FC0:("","u32*",False),
0x80098010:("","u32*",False),
0x800980C0:("__osViCurr","__OSViContext*",False),
0x800980C4:("__osViNext","UNK_TYPE",False), # some struct pointer used in func_80095900
0x800980D0:("","UNK_PTR",False),
0x800980E0:("","u32*",False),
0x80098130:("","UNK_TYPE",False), # ldigs in https:github.com/vocho/openqnx/blob/cc95df3543a1c481d4f8ad387e29f0d1ff0c87fe/trunk/lib/c/stdio/xlitob.c
0x80098144:("","UNK_TYPE",False), # udigs in https:github.com/vocho/openqnx/blob/cc95df3543a1c481d4f8ad387e29f0d1ff0c87fe/trunk/lib/c/stdio/xlitob.c
0x80098160:("__osViDevMgr","UNK_TYPE",False),
0x8009817C:("","UNK_TYPE",False),
0x80098190:("","UNK_TYPE",False),
0x80098198:("","UNK_TYPE",False),
0x800981A0:("","UNK_TYPE",False),
0x800981A8:("","UNK_TYPE",False),
0x800981B0:("","float",False),
0x80098280:("","UNK_TYPE",False),
0x80098290:("","UNK_TYPE",False),
0x800982A4:("","UNK_TYPE",False),
0x80099270:("__osHwIntTable","UNK_TYPE",False),
0x80099290:("leoDiskStack","UNK_TYPE",False),
0x800994D0:("","UNK_TYPE",False),
0x800994DC:("","UNK_TYPE",False),
0x80099500:("","struct s80085320",False),
0x80099520:("","OSThread",False),
0x800996D0:("","UNK_TYPE",False),
0x80099AD0:("","struct s80085320",False),
0x80099AF0:("","UNK_TYPE",False),
0x80099EF0:("","UNK_TYPE",False),
0x8009A170:("","UNK_TYPE",False),
0x8009A670:("","struct s80085320",False),
0x8009A690:("","UNK_TYPE",False),
0x8009A840:("","UNK_TYPE",False),
0x8009B140:("","struct s80085320",False),
0x8009B160:("","UNK_TYPE",False),
0x8009B228:("","UNK_TYPE",False),
0x8009B240:("","u32*",False),
0x8009B290:("","u8",False),
0x8009BE30:("","UNK_TYPE",False),
0x8009BE34:("","UNK_TYPE",False),
0x8009BE38:("","UNK_TYPE",False),
0x8009CD70:("tmp_task","OSTask",False), # static OSTask tmp_task in ../io/sptask.c
0x8009CEB8:("__osSiAccessQueue","UNK_TYPE",False),
0x8009CED0:("__osContPifRam","UNK_TYPE",False),
0x8009CF10:("__osContLastCmd","u8",False),
0x8009CF11:("__osMaxControllers","UNK_TYPE",False),
0x8009CF70:("","UNK_TYPE",False),
0x8009CF80:("__osThreadSave","UNK_TYPE",False),
0x8009D134:("","u8",False),
0x8009D135:("","u8",False),
0x8009D136:("","u8",False),
0x8009D137:("","u8",False),
0x8009D138:("","u8",False),
0x8009D1AC:("","u8",False),
0x8009D1AD:("","u8",False),
0x8009D1AE:("","u8",False),
0x8009D1AF:("","u8",False),
0x8009D1B0:("","u8",False),
0x8009E3F8:("__osPiAccessQueue","UNK_TYPE",False),
0x8009E510:("__osEventStateTab","__OSEventState",True), # TODO better array representation TODO size
0x8009E5B0:("__osCurrentTime","UNK_TYPE",False),
# 0x8009E5B4:("__osCurrentTime","UNK_TYPE",False),
0x8009E5B8:("__osBaseCounter","UNK_TYPE",False),
0x8009E5BC:("__osViIntrCount","UNK_TYPE",False),
0x8009E5C0:("__osTimerCounter","UNK_TYPE",False),
0x8009E610:("","struct s80092920",False),
0x8009E624:("","UNK_TYPE",False),
0x801ADE80:("","UNK_TYPE",False),
0x801ADEAC:("","UNK_TYPE",False),
0x801ADEB0:("D_801ADEB0","int",True), # TODO better array representation
0x801AEFD0:("","s800BF9A0_s*",False),
0x801B4610:("","UNK_TYPE",False),
0x801DCBB0:("","UNK_TYPE",False),
0x801DCBC4:("","UNK_TYPE",False),
0x801DCBE4:("","UNK_TYPE",False),
0x801DCBFC:("","UNK_TYPE",False),
0x801E3FA0:("","UNK_TYPE",False),
0x801ED930:("","UNK_TYPE",False),
0x801ED940:("","UNK_TYPE",False),
0x80208EA0:("","UNK_TYPE",False),
# En_Test
0x808637D0:("","f32",False)
}
# these are extra variables needed for one reason or another, they should probably be deleted if possible
extra_vars = (
("D_800980D0_","UNK_PTR"), # needed to match?
("D_80099AD0_","UNK_TYPE"), # needed to match?
("D_8009A670_","UNK_TYPE"), # needed to match?
("D_8009B140_","UNK_TYPE"), # needed to match?
)