Upload disassembly

This commit is contained in:
Luciano Ciccariello 2022-01-01 17:45:41 +00:00
commit fcf1f0773a
34 changed files with 2945 additions and 0 deletions

14
.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
main.exe
DRA.BIN
*.ld
*auto.*.txt
__pycache__
asm/*/*.s
asm/*/data/*.s
asm/*/nonmatchings/*.s
asm/*/nonmatchings/*/*.s
asm/*/nonmatchings/*/*/*.s
assets/
build/

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "tools/n64splat"]
path = tools/n64splat
url = git@github.com:ethteck/n64splat.git
[submodule "tools/asm-differ"]
path = tools/asm-differ
url = git@github.com:simonlindholm/asm-differ.git

114
Makefile Normal file
View File

@ -0,0 +1,114 @@
# Binaries
MAIN := main
DRA := dra
# Compilers
GCC_MODERN := $(CROSS)gcc
GCC_272 := ./bin/cc1
CROSS := mipsel-linux-gnu-
AS := $(CROSS)as
CC := $(GCC_272)
LD := $(CROSS)ld
CPP := cpp
OBJCOPY := $(CROSS)objcopy
AS_FLAGS += -Iinclude -march=r3000 -mtune=r3000 -no-pad-sections
CC_FLAGS += -mips1 -mcpu=3000 -quiet -G0 -Wall -fno-builtin -mno-abicalls -fsigned-char -O2
CPP_FLAGS := -Iinclude -undef -Wall -lang-c -fno-builtin -gstabs
CPP_FLAGS += -Dmips -D__GNUC__=2 -D__OPTIMIZE__ -D__mips__ -D__mips -Dpsx -D__psx__ -D__psx -D_PSYQ -D__EXTENSIONS__ -D_MIPSEL -D_LANGUAGE_C -DLANGUAGE_C
# Directories
ASM_DIR := asm
SRC_DIR := src
BUILD_DIR := build
CONFIG_DIR := config
TOOLS_DIR := tools
# Files
MAIN_ASM_DIRS := $(ASM_DIR)/$(MAIN) $(ASM_DIR)/$(MAIN)/psxsdk $(ASM_DIR)/$(MAIN)/data
MAIN_SRC_DIRS := $(SRC_DIR)/$(MAIN) $(SRC_DIR)/$(MAIN)/psxsdk
MAIN_S_FILES := $(foreach dir,$(MAIN_ASM_DIRS),$(wildcard $(dir)/*.s)) \
$(foreach dir,$(MAIN_ASM_DIRS),$(wildcard $(dir)/**/*.s))
MAIN_C_FILES := $(foreach dir,$(MAIN_SRC_DIRS),$(wildcard $(dir)/*.c)) \
$(foreach dir,$(MAIN_SRC_DIRS),$(wildcard $(dir)/**/*.c))
MAIN_O_FILES := $(foreach file,$(MAIN_S_FILES),$(BUILD_DIR)/$(file).o) \
$(foreach file,$(MAIN_C_FILES),$(BUILD_DIR)/$(file).o)
MAIN_TARGET := $(BUILD_DIR)/$(MAIN)
DRA_ASM_DIRS := $(ASM_DIR)/$(DRA) $(ASM_DIR)/$(DRA)/data
DRA_SRC_DIRS := $(SRC_DIR)/$(DRA)
DRA_S_FILES := $(foreach dir,$(DRA_ASM_DIRS),$(wildcard $(dir)/*.s)) \
$(foreach dir,$(DRA_ASM_DIRS),$(wildcard $(dir)/**/*.s))
DRA_C_FILES := $(foreach dir,$(DRA_SRC_DIRS),$(wildcard $(dir)/*.c)) \
$(foreach dir,$(DRA_SRC_DIRS),$(wildcard $(dir)/**/*.c))
DRA_O_FILES := $(foreach file,$(DRA_S_FILES),$(BUILD_DIR)/$(file).o) \
$(foreach file,$(DRA_C_FILES),$(BUILD_DIR)/$(file).o)
DRA_TARGET := $(BUILD_DIR)/$(DRA)
DRABIN_TARGET := $(BUILD_DIR)/DRA.BIN
# Tooling
PYTHON := python3
SPLAT_DIR := $(TOOLS_DIR)/n64splat
SPLAT := $(PYTHON) $(SPLAT_DIR)/split.py
all: main dra
clean:
rm -rf $(BUILD_DIR)
main: main_dirs $(MAIN_TARGET).exe
sha1sum --check $(MAIN).sha
main_dirs:
$(foreach dir,$(MAIN_ASM_DIRS) $(MAIN_SRC_DIRS),$(shell mkdir -p $(BUILD_DIR)/$(dir)))
$(MAIN_TARGET).exe: $(MAIN_TARGET).elf
$(OBJCOPY) --dump-section .header=$(MAIN_TARGET).header $<
$(OBJCOPY) -O binary $< $(MAIN_TARGET).bin
cat $(MAIN_TARGET).header $(MAIN_TARGET).bin > $@
$(MAIN_TARGET).elf: $(MAIN_O_FILES)
$(LD) -o $@ \
-Map $(MAIN_TARGET).map \
-T $(MAIN).ld \
-T $(CONFIG_DIR)/undefined_syms_auto.$(MAIN).txt \
--no-check-sections \
-nostdlib \
-s
dra: dra_dirs $(DRABIN_TARGET)
sha1sum --check $(DRA).sha
dra_dirs:
$(foreach dir,$(DRA_ASM_DIRS) $(DRA_SRC_DIRS),$(shell mkdir -p $(BUILD_DIR)/$(dir)))
$(DRABIN_TARGET): $(DRA_TARGET).elf
$(OBJCOPY) -O binary $< $@
$(DRA_TARGET).elf: $(DRA_O_FILES)
$(LD) -o $@ \
-Map $(DRA_TARGET).map \
-T dra.ld \
-T $(CONFIG_DIR)/undefined_syms_auto.$(DRA).txt \
-T $(CONFIG_DIR)/undefined_funcs_auto.$(DRA).txt \
--no-check-sections \
-nostdlib \
-s
extract: extract_main extract_dra
extract_main: $(SPLAT_DIR)
$(SPLAT) --basedir . $(CONFIG_DIR)/splat.$(MAIN).yaml
extract_dra: $(SPLAT_DIR)
$(SPLAT) --basedir . $(CONFIG_DIR)/splat.$(DRA).yaml
$(SPLAT_DIR):
git submodule init $(SPLAT_DIR)
git submodule update $(SPLAT_DIR)
pip3 install -r $(SPLAT_DIR)/requirements.txt
$(BUILD_DIR)/%.s.o: %.s
$(AS) $(AS_FLAGS) -o $@ $<
$(BUILD_DIR)/%.bin.o: %.bin
$(LD) -r -b binary -o $@ $<
$(BUILD_DIR)/%.c.o: $(BUILD_DIR)/%.c.s
$(AS) $(AS_FLAGS) -o $@ $<
$(BUILD_DIR)/%.c.s: %.c
$(CPP) $(CPP_FLAGS) $< | $(CC) $(CC_FLAGS) -o $@
SHELL = /bin/bash -e -o pipefail
.PHONY: all, clean
.PHONY: main, main_dirs, dra, dra_dirs
.PHONY: extract, extract_main, extract_dra

30
README.md Normal file
View File

@ -0,0 +1,30 @@
# Castlevania: Symphony of the Night disassembly
Recompilable code that creates 1:1 binaries for the commercial videogame Castlevania: Symphony of the Night. This repository aims to create a full disassembly in C.
## Game revision
| SHA-1 checksum | File name | Version
|--------------------------------------------|-----------|---------
| `54828d4e44ea9575f2a0917ff63def42a304abff` | main.exe | SLUS-00067
| `2eac5f7162e77416166c2511c787995488f01c37` | DRA.BIN | SLUS-00067
## Build
1. You need `gcc-mipsel-linux-gnu` that you can easily install on any Debian-based Linux distribution. On Windows it is highly recommended to just use Ubuntu with WSL
1. Place your `main.exe` from the file `SLUS_000.67` and `DRA.BIN` in the root directory
1. Run `make extract` to generate the assembly files
1. Run `make all` to compile the binaries into the `build/` directory
Please double-check if the [MD5 matches](#game-revision).
## To do
The project is very barebone at the moment and there is a massive room of improvement, mostly in the infrastructure:
* I am not sure which GCC version is the most suitable and the C compiled code might be different from the original assembly
* There are no utilities to make a diff between the original executable and the current one
* There is no CI/CD pipeline to track the decompilation progress
* It is not known which PS1 SDK version has been used for the game
* The game executable `DRA.BIN` is not yet disassembled
* The zone overlays (`ST/{ZONE}/{ZONE}.BIN`) are not yet disassembled

18
asm/main/psxsdk/libapi1.s Normal file
View File

@ -0,0 +1,18 @@
.include "main.inc"
syscalldef InitHeap 0xA0 0x39
syscalldef Load 0xA0 0x42
syscalldef Exec 0xA0 0x43
syscalldef GPU_cw 0xA0 0x49
syscalldef _bu_init 0xA0 0x70
syscalldef open 0xB0 0x32
syscalldef lseek 0xB0 0x33
syscalldef read 0xB0 0x34
syscalldef write 0xB0 0x35
syscalldef close 0xB0 0x36
syscalldef format 0xB0 0x41
syscalldef firstfile 0xB0 0x42
syscalldef nextfile 0xB0 0x43
syscalldef erase 0xB0 0x45
syscalldef Krom2RawAdd 0xB0 0x51
syscalldef ChangeClearPAD 0xB0 0x5B

View File

@ -0,0 +1,3 @@
.include "main.inc"
syscalldef DeliverEvent 0xB0 0x07

15
asm/main/psxsdk/libc.s Normal file
View File

@ -0,0 +1,15 @@
.include "main.inc"
syscalldef exit 0xb0 0x38
syscalldef puts 0xb0 0x3f
syscalldef setjmp 0xa0 0x13
syscalldef strcat 0xa0 0x15
syscalldef strcpy 0xa0 0x19
syscalldef strlen 0xa0 0x1b
syscalldef memcpy 0xa0 0x2a
syscalldef memset 0xa0 0x2b
syscalldef rand 0xa0 0x2f
syscalldef srand 0xa0 0x30
syscalldef malloc 0xa0 0x33
syscalldef free 0xa0 0x34
syscalldef printf 0xa0 0x3f

31
asm/main/psxsdk/libcard.s Normal file
View File

@ -0,0 +1,31 @@
.include "main.inc"
# assembler directives
.set noat # allow manual use of $at
.set noreorder # don't insert nops after branches
.section .text, "ax"
syscalldef _card_info 0xA0 0xAB
syscalldef _card_load 0xA0 0xAC
syscalldef InitCARD 0xB0 0x4A
syscalldef StartCARD 0xB0 0x4B
glabel _card_clear
/* 724C 80016A4C E8FFBD27 */ addiu $sp, $sp, -0x18
/* 7250 80016A50 1000B0AF */ sw $s0, 0x10($sp)
/* 7254 80016A54 1400BFAF */ sw $ra, 0x14($sp)
/* 7258 80016A58 A55A000C */ jal _new_card
/* 725C 80016A5C 21808000 */ addu $s0, $a0, $zero
/* 7260 80016A60 21200002 */ addu $a0, $s0, $zero
/* 7264 80016A64 3F000534 */ ori $a1, $zero, 0x3f
/* 7268 80016A68 A15A000C */ jal _card_write
/* 726C 80016A6C 21300000 */ addu $a2, $zero, $zero
/* 7270 80016A70 1400BF8F */ lw $ra, 0x14($sp)
/* 7274 80016A74 1000B08F */ lw $s0, 0x10($sp)
/* 7278 80016A78 1800BD27 */ addiu $sp, $sp, 0x18
/* 727C 80016A7C 0800E003 */ jr $ra
/* 7280 80016A80 00000000 */ nop
syscalldef _card_write 0xB0 0x4E
syscalldef _new_card 0xB0 0x50

BIN
bin/cc1 Executable file

Binary file not shown.

1
checksum.md5 Normal file
View File

@ -0,0 +1 @@
d70de80ac9b04a8ba4c62a7c646173fe *main.exe

27
config/splat.dra.yaml Normal file
View File

@ -0,0 +1,27 @@
options:
platform: psx
basename: dra
base_path: .
target_path: DRA.BIN
asm_path: asm/dra
asset_path: assets/dra
src_path: src/dra
compiler: GCC
symbol_addrs_path: config/sym.dra.txt
undefined_syms_path: config/undefined_syms.dra.txt
undefined_funcs_auto_path: config/undefined_funcs_auto.dra.txt
undefined_syms_auto_path: config/undefined_syms_auto.dra.txt
find_file_boundaries: yes
enable_ld_alignment_hack: yes
use_legacy_include_asm: no
segments:
- name: dra
type: code
start: 0x00000000
vram: 0x800A0000
subalign: 4
subsegments:
- [0x0, data]
- [0x42398, c]
- [0x962AC, data]
- [0x119870]

40
config/splat.main.yaml Normal file
View File

@ -0,0 +1,40 @@
options:
platform: psx
basename: main
base_path: .
target_path: main.exe
asm_path: asm/main
asset_path: assets/main
src_path: src/main
compiler: GCC
symbol_addrs_path: config/sym.main.txt
undefined_syms_path: config/undefined_syms.main.txt
undefined_funcs_auto_path: config/undefined_funcs_auto.main.txt
undefined_syms_auto_path: config/undefined_syms_auto.main.txt
find_file_boundaries: yes
enable_ld_alignment_hack: yes
use_legacy_include_asm: no
segments:
- [0x800, header]
- name: main
type: code
start: 0x00000800
vram: 0x80010000
subalign: 4
subsegments:
- [0x800, rodata]
- [0x15F4, asm]
- [0x5938, hasm, psxsdk/libapi1]
- [0x5A38, asm]
- [0x5E60, c, psxsdk/libetc]
- [0x5E78, asm]
- [0x6864, hasm, psxsdk/libc]
- [0x6934, c, psxsdk/fprintf]
- [0x7190, asm]
- [0x720C, hasm, psxsdk/libcard]
- [0x72A4, asm]
- [0x9C14, hasm, psxsdk/libapi2]
- [0x9C24, c, psxsdk/libapi]
- [0x9C54, asm]
- [0x1BCE0, data]
- [0x89800]

561
config/sym.dra.txt Normal file
View File

@ -0,0 +1,561 @@
aDraBin1 = 0x80010040;
aFMapBin1 = 0x8001004C;
a0123456789abcd = 0x8001005C;
jpt_80011B20 = 0x80010074;
aClip3d3dDD = 0x80010120;
aOfs3d3d = 0x80010138;
aTwDDDD = 0x80010148;
aDtdD = 0x80010160;
aDfeD = 0x8001016C;
aDisp3d3dDD = 0x80010178;
aScreen3d3dDD = 0x80010194;
aIsinterD = 0x800101B0;
aIsrgb24D = 0x800101BC;
aIdSysCV1831995 = 0x800101C8;
aSBadRect = 0x800102B0;
str = 0x800102D4;
aLoadimage = 0x800102E0;
aStoreimage = 0x800102EC;
aMoveimage = 0x800102F8;
aVsyncTimeout = 0x800103C4;
aIdIntrCV173199 = 0x800103D4;
a0123456789abcd_0 = 0x8001046C;
a0123456789abcd_1 = 0x80010480;
jpt_800163F4 = 0x80010494;
aNone = 0x80010560;
aCdlreads = 0x80010568;
aCdlseekp = 0x80010574;
aCdlseekl = 0x80010580;
aCdlgettd = 0x8001058C;
aCdlgettn = 0x80010598;
aCdlgetlocp = 0x800105A4;
aCdlgetlocl = 0x800105B0;
aCdldemute = 0x800105DC;
aCdlmute = 0x800105E8;
aCdlreset = 0x800105F0;
aCdlpause = 0x800105FC;
aCdlstop = 0x80010608;
aCdlstandby = 0x80010610;
aCdlreadn = 0x8001061C;
aCdlbackword = 0x80010628;
aCdlforward = 0x80010634;
aCdlplay = 0x80010640;
aCdlsetloc = 0x80010648;
aCdlnop = 0x80010654;
aCdlsync = 0x8001065C;
aDiskerror_0 = 0x80010664;
aDataend = 0x80010670;
aAcknowledge = 0x80010678;
aComplete = 0x80010684;
aDataready = 0x80010690;
aNointr = 0x8001069C;
aCdTimeout = 0x800106A4;
aDiskerror = 0x800106D0;
aCdromUnknownIn = 0x800106F8;
jpt_80019DE8 = 0x80010718;
aCdSync = 0x8001072C;
aCdReady = 0x80010734;
aCdCw = 0x80010758;
aIdBiosCV177199 = 0x80010760;
aCdInit = 0x80010794;
aCdDatasync = 0x800107AC;
aSDirWasNotFoun = 0x800107D4;
aCd001 = 0x80010870;
aCdreadSectorEr = 0x800109A4;
aCdreadShellOpe = 0x800109BC;
aCdreadRetry = 0x800109D4;
jpt_8001DE24 = 0x80010A60;
jpt_8001EECC = 0x80010C48;
jpt_8001EFB8 = 0x80010CA8;
jpt_80020818 = 0x80010CD4;
aWaitReset = 0x80010CFC;
aWaitWrdyHL = 0x80010D0C;
aWaitDmafClearW = 0x80010D20;
aSpuTimeOutWait = 0x80010D34;
jpt_8002A518 = 0x80010D74;
jpt_8002A5E8 = 0x80010D94;
jpt_8002ADFC = 0x80010DB4;
jpt_8002AEC4 = 0x80010DD4;
__main = 0x80010DF4;
start = 0x80010DFC;
stup1 = 0x80010E20;
stup0 = 0x80010E9C;
main = 0x80010EB8;
SetDumpFnt = 0x8001134C;
FntLoad = 0x8001138C;
FntOpen = 0x8001142C;
FntFlush = 0x800116E4;
DumpClut = 0x80011EA0;
AddPrim = 0x80011F18;
setSemiTrans = 0x80011FCC;
setShadeTex = 0x80011FF4;
setPolyGT3 = 0x80012058;
setPolyG4 = 0x80012094;
setPolyGT4 = 0x800120A8;
setSprt8 = 0x800120BC;
setSprt16 = 0x800120D0;
setSprt = 0x800120E4;
setTile = 0x80012134;
setLineG2 = 0x80012170;
ResetGraph = 0x80012434;
SetGraphReverse = 0x80012604;
SetGraphQueue = 0x8001277C;
GsGetWorkBase = 0x80012818;
GsGetWorkBase_0 = 0x80012828;
DrawSyncCallback = 0x80012838;
SetDispMask = 0x80012894;
DrawSync = 0x8001290C;
debugLog = 0x80012978;
ClearImage = 0x80012A90;
LoadImage = 0x80012B24;
StoreImage = 0x80012B88;
MoveImage = 0x80012BEC;
ClearOTag = 0x80012C90;
ClearOTagR = 0x80012D3C;
DrawOTag = 0x80012E1C;
PutDrawEnv = 0x80012E8C;
PutDispEnv = 0x80012FE4;
InitHeap = 0x80015138;
Load = 0x80015148;
Exec = 0x80015158;
GPU_cw = 0x80015168;
_bu_init = 0x80015178;
open = 0x80015188;
lseek = 0x80015198;
read = 0x800151A8;
write = 0x800151B8;
close = 0x800151C8;
format = 0x800151D8;
firstfile = 0x800151E8;
nextfile = 0x800151F8;
erase = 0x80015208;
Krom2RawAdd = 0x80015218;
ChangeClearPAD = 0x80015228;
StopPAD = 0x800152D8;
PAD_init2 = 0x800152E8;
PAD_dr = 0x800152F8;
VSync = 0x80015308;
VSyncWait = 0x80015450;
ChangeClearRCnt = 0x800154EC;
ResetCallback = 0x800154FC;
InterruptCallback = 0x8001552C;
DMACallback = 0x8001555C;
VSyncCallback = 0x8001558C;
VSyncCallbacks = 0x800155C0;
StopCallback = 0x800155F0;
RestartCallback = 0x80015620;
CheckCallback = 0x80015650;
GetIntrMask = 0x80015660;
SetIntrMask = 0x80015678;
_96_remove = 0x80015C0C;
ReturnFromException = 0x80015C1C;
ResetEntryInt = 0x80015C2C;
HookEntryInt = 0x80015C3C;
EnterCriticalSection = 0x80015C4C;
ExitCriticalSection = 0x80015C5C;
GsGetWorkBase_1 = 0x80016054;
exit = 0x80016064;
puts = 0x80016074;
setjmp = 0x80016084;
strcat = 0x80016094;
strcpy = 0x800160A4;
strlen = 0x800160B4;
memcpy = 0x800160C4;
memset = 0x800160D4;
rand = 0x800160E4;
srand = 0x800160F4;
malloc = 0x80016104;
free = 0x80016114;
printf = 0x80016124;
fprintf = 0x80016134;
memchr = 0x80016990;
_card_info = 0x80016A0C;
_card_load = 0x80016A1C;
InitCARD = 0x80016A2C;
StartCARD = 0x80016A3C;
_card_clear = 0x80016A4C;
_card_write = 0x80016A84;
_new_card = 0x80016A94;
rsin = 0x80016C9C;
sin_1 = 0x80016CD8;
SetFogNear = 0x80016E08;
CompMatrix = 0x800172BC;
SetMulMatrix = 0x800176F4;
ReadColorMatrix = 0x80017C88;
TransMatrix = 0x80017CDC;
SetRotMatrix = 0x80017E3C;
SetLightMatrix = 0x80017E6C;
SetColorMatrix = 0x80017E9C;
SetTransMatrix = 0x80017ECC;
SetVertex0 = 0x80017EEC;
SetVertex1 = 0x80017EFC;
SetVertex2 = 0x80017F0C;
SetVertexTri = 0x80017F1C;
SetRGBfifo = 0x80017F3C;
SetIR123 = 0x80017F50;
SetIR0 = 0x80017F64;
SetSZfifo3 = 0x80017F70;
SetSZfifo4 = 0x80017F84;
SetSXSYfifo = 0x80017F9C;
SetRii = 0x80017FB0;
SetMAC123 = 0x80017FC4;
SetData32 = 0x80017FD8;
SetDQA = 0x80017FE4;
SetDQB = 0x80017FF0;
SetBackColor = 0x80017FFC;
SetFarColor = 0x8001801C;
SetGeomOffset = 0x8001803C;
SetGeomScreen = 0x8001805C;
LocalLight = 0x8001806C;
DpqColor = 0x80018090;
NormalColor = 0x800180AC;
NormalColor3 = 0x800180C8;
NormalColorDpq = 0x80018104;
NormalColorDpq3 = 0x80018128;
NormalColorCol = 0x80018170;
NormalColorCol3 = 0x80018190;
ColorDpq = 0x800181D4;
ColorCol = 0x800181FC;
AverageSZ3 = 0x80018220;
AverageSZ4 = 0x80018230;
RotTransPers = 0x8001824C;
RotTransPers3 = 0x8001827C;
RotTrans = 0x800182DC;
NormalClip = 0x8001830C;
RotTransPers4 = 0x8001833C;
RotAverage3 = 0x800183BC;
RotAverage4 = 0x8001841C;
RotAverageNclip3 = 0x8001849C;
RotAverageNclip4 = 0x8001852C;
RotAverageNclipColorCol3 = 0x800185DC;
RotMatrix = 0x800186AC;
RotMatrixYXZ = 0x8001893C;
RotMatrixX = 0x80018BCC;
RotMatrixY = 0x80018D6C;
RotMatrixZ = 0x80018F0C;
FlushCache = 0x800192CC;
CdInit = 0x8001930C;
DeliverEvent = 0x80019414;
strcmp = 0x8001BC64;
strncmp = 0x8001BC74;
StClearRing = 0x8001C320;
StSetStream = 0x8001C4C8;
SsVoKeyOff = 0x8001F7AC;
SsVoKeyOn = 0x8001F7E8;
_SsInit = 0x80020328;
SsInitHot = 0x80020410;
SsVabClose = 0x800211D0;
SsVabFakeBody = 0x800212AC;
_SsVmSetProgVol = 0x80025840;
_SsVmGetProgVol = 0x800258B0;
_SsVmSetProgPan = 0x80025900;
_SsVmSetProgVol_0 = 0x80025908;
_SsVmGetProgPan = 0x80025970;
_SsVmGetProgVol_0 = 0x80025978;
_SsVmSetProgPan_0 = 0x800259C8;
_SsVmGetProgPan_0 = 0x80025A38;
SsUtKeyOnV = 0x800264A0;
SsUtKeyOffV = 0x800267E8;
SsUtPitchBend = 0x80026954;
SsUtGetDetVVol = 0x80026DD8;
SsUtSetDetVVol = 0x80026E14;
SsUtGetDetVVol_0 = 0x80026E2C;
SsUtSetDetVVol_0 = 0x80026E68;
SsUtGetVVol = 0x80026E78;
SsUtGetVVol_0 = 0x80026ECC;
SsUtSetVVol = 0x80026F24;
SsUtSetVVol_0 = 0x80026F78;
OpenEvent = 0x800271C8;
EnableEvent = 0x800271D8;
CloseEvent = 0x800283A4;
DisableEvent = 0x800283B4;
SpuInitMalloc = 0x800283C4;
SpuMalloc = 0x80028418;
SpuMallocWithStartAddr = 0x80028D40;
_spu_setReverbAttr = 0x80029810;
SpuClearReverbWorkArea = 0x80029CE0;
WaitEvent = 0x80029E7C;
TestEvent = 0x8002AD5C;
g_InterruptMask = 0x8002D348;
_vsync_rcnt = 0x8002D374;
aThisFunctionIs = 0x8002E1EA;
g_CurrentPlayableCharacter = 0x8003C9A0;
g_CurrentRoomTileLayout = 0x80073084;
g_CurrentRoomHSize = 0x800730A4;
g_CurrentRoomVSize = 0x800730A8;
g_CurrentRoomLeft = 0x800730B0;
g_CurrentRoomTop = 0x800730B4;
g_CurrentRoomRight = 0x800730B8;
g_CurrentRoomBottom = 0x800730BC;
g_CurrentRoomWidth = 0x800730C8;
g_CurrentRoomHeight = 0x800730CC;
playerX = 0x800973F0;
playerY = 0x800973F4;
player_hp = 0x80097BA0;
player_hp_max = 0x80097BA4;
player_heart = 0x80097BA8;
player_heart_max = 0x80097BAC;
player_mp = 0x80097BB0;
player_mp_max = 0x80097BB4;
player_stat_str = 0x80097BB8;
player_stat_con = 0x80097BBC;
player_stat_int = 0x80097BC0;
player_stat_lck = 0x80097BC4;
player_level = 0x80097BE8;
player_exp = 0x80097BEC;
player_gold = 0x80097BF0;
player_kill_count = 0x80097BF4;
player_equip_right_hand = 0x80097BF8;
player_equip_left_hand = 0x80097BFC;
player_equip_head = 0x80097C00;
player_equip_body = 0x80097C04;
player_equip_cloak = 0x80097C08;
player_equip_ring1 = 0x80097C0C;
player_equip_ring2 = 0x80097C10;
m_ptr_menu_text_kills = 0x800A8284;
rect = 0x800ACD98;
aPbav = 0x800B107C;
aPbav_0 = 0x800B407C;
aPbav_2 = 0x800B607C;
aPbav_1 = 0x800B807C;
aPqes_1 = 0x800BA07C;
aPqes = 0x800BC37D;
aPqes_0 = 0x800BCAC3;
aO = 0x800DB3B4;
aDr03x = 0x800DB44C;
aGt403x = 0x800DB458;
aG403x = 0x800DB464;
aGt303x = 0x800DB470;
aLine03x = 0x800DB47C;
aSp1603x = 0x800DB488;
aSp03x = 0x800DB494;
aTile03x = 0x800DB4A0;
aEnv03x = 0x800DB4AC;
aEff03x = 0x800DB4B8;
aRed = 0x800DB4C4;
aGreen = 0x800DB4C8;
aBlue = 0x800DB4D0;
aHalfOn = 0x800DB4D8;
aHalfOff = 0x800DB4E4;
aRgb02x02x02x = 0x800DB4F0;
a0104x04x = 0x800DB504;
a2304x04x = 0x800DB514;
jpt_800E4A64 = 0x800DB530;
jpt_800E55C4 = 0x800DB560;
a02x02x = 0x800DB720;
aMemoryCardLoad = 0x800DB730;
aEnding = 0x800DB744;
aIwaLoad = 0x800DB74C;
aIgaLoad = 0x800DB758;
aHagiLoad = 0x800DB764;
aLoadCBinSBin = 0x800DB770;
aAlucard = 0x800DB784;
aRichter = 0x800DB790;
jpt_800E63C4 = 0x800DB7A0;
jpt_800E7034 = 0x800DB7E8;
jpt_800E7484 = 0x800DB808;
jpt_800E7B18 = 0x800DB828;
aSimCBinFTitle1 = 0x800DBB38;
aSimCSoundDataS_0 = 0x800DBD14;
aSimCSoundDataS_1 = 0x800DBD50;
jpt_800E7C28 = 0x800DBD70;
jpt_800E7E3C = 0x800DBD88;
aSimCBin = 0x800DBDE0;
aSimCSoundDataS = 0x800DBDF4;
aSimCBinW0000Bi = 0x800DBE14;
aSimCBinW1000Bi = 0x800DBE2C;
aSimCBinF0000Bi = 0x800DBE44;
aSimCBinF1000Bi = 0x800DBE5C;
aSimCBinTt000Bi = 0x800DBE74;
aSimCBinFt000Bi = 0x800DBE8C;
aSimCBinMo000Bi = 0x800DBEA4;
aOErrS = 0x800DBEBC;
aRErr = 0x800DBEC8;
aClErr = 0x800DBED0;
aTrErr = 0x800DBED8;
aBu1d1d = 0x800DBEE0;
aBu1d1dS = 0x800DBEEC;
jpt_800E98E4 = 0x800DBEF8;
jpt_800E9934 = 0x800DBF10;
jpt_800E9A48 = 0x800DBF28;
aBaslus00067dra = 0x800DC194;
jpt_800EA8C0 = 0x800DC1A8;
jpt_800EB120 = 0x800DC1E8;
aOver08x04x = 0x800DC228;
jpt_800EE2FC = 0x800DC238;
jpt_800EF590 = 0x800DC290;
aSimCBinDemoKey = 0x800DC490;
aSimCBinDk000Bi = 0x800DC4A8;
aDemonstration = 0x800DC4C8;
aDemoKeyIn04x04 = 0x800DC4D8;
aDemoOverflow = 0x800DC4F0;
jpt_800F0658 = 0x800DC500;
jpt_800F096C = 0x800DC514;
jpt_800F288C = 0x800DC534;
jpt_800F3684 = 0x800DC55C;
jpt_800F3758 = 0x800DC57C;
jpt_800F3C14 = 0x800DC59C;
jpt_800F42A0 = 0x800DC5B4;
aWindowColorSet = 0x800DC5FC;
jpt_800F8150 = 0x800DC68C;
jpt_800F93A0 = 0x800DC6AC;
jpt_800FA060 = 0x800DC71C;
jpt_800FBCC4 = 0x800DC75C;
jpt_800FC36C = 0x800DCB7C;
jpt_800FC5B8 = 0x800DCB94;
jpt_800FD6E0 = 0x800DCBAC;
jpt_800FD7E0 = 0x800DCBC4;
jpt_800FDB40 = 0x800DCBDC;
aXXVQ = 0x800DCBF4;
aAxearmor = 0x800DCC00;
jpt_80102810 = 0x800DCC0C;
jpt_80102918 = 0x800DCC2C;
jpt_80102D9C = 0x800DCC54;
aMemoryCard = 0x800DCC80;
aMemoryCardIs = 0x800DCCAC;
aCannot = 0x800DCCCC;
aNoGame = 0x800DCCE8;
aMemoryCard_0 = 0x800DCD24;
aYes = 0x800DCDB0;
aNo = 0x800DCDB8;
jpt_80103F08 = 0x800DCDC0;
aGold = 0x800DD0A8;
aNz0 = 0x800DD0B0;
aFNz0 = 0x800DD0B4;
aTop = 0x800DD0BC;
aTop_0 = 0x800DD0C0;
aFTop = 0x800DD0C4;
aTogi = 0x800DD0CC;
aAre = 0x800DD0D4;
aFAre = 0x800DD0D8;
aMizu = 0x800DD0E0;
aNo4 = 0x800DD0E8;
aFNo4 = 0x800DD0EC;
aCen = 0x800DD0F4;
aFCen = 0x800DD0F8;
aSiro1 = 0x800DD100;
aNp3 = 0x800DD108;
aFNp3 = 0x800DD10C;
aFNo0 = 0x800DD180;
aMpty = 0x800DEC54;
aUnequip = 0x800DF9EC;
a3pecial = 0x800DFA60;
aAmiliar = 0x800DFA74;
a2ichter = 0x800DFD38;
a7indow = 0x800DFDFC;
a2ight = 0x800DFE78;
aUtton = 0x800DFEC0;
m_menu_text_kills = 0x800DFEEC;
aHealHpBySheddi = 0x800E00B0;
aDarkMetamorpho = 0x800E00D4;
aCausesItemsToM = 0x800E042C;
aTransformIntoB = 0x800E05B4;
aSoulOfBat = 0x800E05C8;
jpt_8010812C = 0x800E0D38;
aDmaError = 0x800E0D54;
aSdHeaderError = 0x800E0D64;
aDiskError = 0x800E0D78;
aRetry = 0x800E0D84;
aRetryXa = 0x800E0D8C;
aCdShellOpenErr = 0x800E0D98;
aCheckingCd = 0x800E0DB0;
aErrorStep02x = 0x800E0DC0;
jpt_80108CFC = 0x800E0DD8;
aStep04x = 0x800E0E28;
aBatIStep04x = 0x800E0E34;
jpt_8010A86C = 0x800E0E48;
jpt_8010AA30 = 0x800E0E88;
jpt_8010AE88 = 0x800E0EC8;
jpt_8010B3B4 = 0x800E0EF0;
jpt_8010B658 = 0x800E0FC0;
jpt_8010F424 = 0x800E108C;
jpt_8010F48C = 0x800E12AC;
jpt_8010F75C = 0x800E12C4;
jpt_8010F958 = 0x800E12DC;
jpt_8010F9E8 = 0x800E12F4;
jpt_801109D0 = 0x800E1308;
jpt_80110C1C = 0x800E1320;
aPlPose02x = 0x800E1334;
jpt_80110E54 = 0x800E1348;
jpt_80111080 = 0x800E1360;
jpt_8011131C = 0x800E1380;
aCommandOk = 0x800E13A0;
a100swordSetOk = 0x800E13AC;
aCharal02x = 0x800E1400;
jpt_80112264 = 0x800E1410;
jpt_80112C9C = 0x800E1588;
jpt_80113328 = 0x800E1750;
jpt_80113938 = 0x800E18C8;
jpt_80113B10 = 0x800E18E0;
aDamKind04x = 0x800E18F4;
jpt_801140A8 = 0x800E1908;
jpt_801141F0 = 0x800E1948;
jpt_80114300 = 0x800E1990;
jpt_80114388 = 0x800E19B0;
jpt_80115DF0 = 0x800E19D0;
jpt_8011643C = 0x800E19E8;
jpt_801169F4 = 0x800E1A00;
jpt_80116CF8 = 0x800E1A20;
aErrorStep = 0x800E1A38;
jpt_80118D54 = 0x800E1A44;
aStrY02x = 0x800E1A74;
jpt_801195F4 = 0x800E1A84;
aAtariNuki = 0x800E1AA4;
jpt_8011AD40 = 0x800E1AB4;
jpt_8011AD94 = 0x800E1AD4;
jpt_8011C214 = 0x800E1AF4;
jpt_8011C490 = 0x800E1B44;
jpt_8011CB08 = 0x800E1B74;
jpt_8011DC74 = 0x800E1B94;
jpt_8011DD70 = 0x800E1BF4;
jpt_8011DDCC = 0x800E1C54;
jpt_8011E580 = 0x800E1CB4;
jpt_8011E648 = 0x800E1CE4;
jpt_8011E9D4 = 0x800E1D1C;
jpt_8011EADC = 0x800E1D4C;
jpt_80120C98 = 0x800E1D84;
jpt_80120FDC = 0x800E1DA4;
jpt_80122494 = 0x800E1DBC;
jpt_80124410 = 0x800E1DD4;
jpt_80126808 = 0x800E1E34;
aLightTimer02x = 0x800E1E48;
jpt_80126F54 = 0x800E1E5C;
jpt_80128C94 = 0x800E1E7C;
jpt_8012A918 = 0x800E1E90;
jpt_8012D4D8 = 0x800E1EB0;
jpt_8012EFE4 = 0x800E1EC8;
jpt_8012FA74 = 0x800E1EF0;
jpt_8012FAC0 = 0x800E1F18;
jpt_80130384 = 0x800E1F30;
jpt_801303DC = 0x800E1F58;
jpt_80130728 = 0x800E1F70;
jpt_80130788 = 0x800E1F98;
jpt_80130B00 = 0x800E1FB0;
jpt_80131014 = 0x800E1FD8;
jpt_801314B4 = 0x800E2000;
jpt_80132F94 = 0x800E2034;
jpt_801332C4 = 0x800E205C;
jpt_80133990 = 0x800E2074;
jpt_80133C10 = 0x800E208C;
jpt_80135058 = 0x800E20B4;
jpt_801353DC = 0x800E2354;
nullsub_8 = 0x800E2F34;
entrypoint_sotn = 0x800E3988;
nullsub_9 = 0x800E7384;
SetRoomForegroundLayer = 0x800ED774;
SetRoomBackgroundLayer = 0x800ED90C;
LoadRoomLayer = 0x800ED9F4;
CheckCollision = 0x800EF45C;
drawMenuChar = 0x800F678C;
drawMenuInt = 0x800F68F4;
setMenuBackgroundRect = 0x80107330;
CopyMapOverlayCallback = 0x801074BC;
nullsub_10 = 0x801362A4;
g_someValue = 0x8013792C;
g_OverlayCopySrcIndex = 0x80137F70;
g_OverlayCopyDstIndex = 0x80137F74;
g_OverlayCopySrc = 0x80137F80;
g_OverlayCopyDst = 0x80137F84;
g_OverlayBlockCount = 0x80137F8C;
g_OverlayLastBlockSize = 0x80137F90;
p = 0x80180014;

561
config/sym.main.txt Normal file
View File

@ -0,0 +1,561 @@
aDraBin1 = 0x80010040;
aFMapBin1 = 0x8001004C;
a0123456789abcd = 0x8001005C;
jpt_80011B20 = 0x80010074;
aClip3d3dDD = 0x80010120;
aOfs3d3d = 0x80010138;
aTwDDDD = 0x80010148;
aDtdD = 0x80010160;
aDfeD = 0x8001016C;
aDisp3d3dDD = 0x80010178;
aScreen3d3dDD = 0x80010194;
aIsinterD = 0x800101B0;
aIsrgb24D = 0x800101BC;
aIdSysCV1831995 = 0x800101C8;
aSBadRect = 0x800102B0;
str = 0x800102D4;
aLoadimage = 0x800102E0;
aStoreimage = 0x800102EC;
aMoveimage = 0x800102F8;
aVsyncTimeout = 0x800103C4;
aIdIntrCV173199 = 0x800103D4;
a0123456789abcd_0 = 0x8001046C;
a0123456789abcd_1 = 0x80010480;
jpt_800163F4 = 0x80010494;
aNone = 0x80010560;
aCdlreads = 0x80010568;
aCdlseekp = 0x80010574;
aCdlseekl = 0x80010580;
aCdlgettd = 0x8001058C;
aCdlgettn = 0x80010598;
aCdlgetlocp = 0x800105A4;
aCdlgetlocl = 0x800105B0;
aCdldemute = 0x800105DC;
aCdlmute = 0x800105E8;
aCdlreset = 0x800105F0;
aCdlpause = 0x800105FC;
aCdlstop = 0x80010608;
aCdlstandby = 0x80010610;
aCdlreadn = 0x8001061C;
aCdlbackword = 0x80010628;
aCdlforward = 0x80010634;
aCdlplay = 0x80010640;
aCdlsetloc = 0x80010648;
aCdlnop = 0x80010654;
aCdlsync = 0x8001065C;
aDiskerror_0 = 0x80010664;
aDataend = 0x80010670;
aAcknowledge = 0x80010678;
aComplete = 0x80010684;
aDataready = 0x80010690;
aNointr = 0x8001069C;
aCdTimeout = 0x800106A4;
aDiskerror = 0x800106D0;
aCdromUnknownIn = 0x800106F8;
jpt_80019DE8 = 0x80010718;
aCdSync = 0x8001072C;
aCdReady = 0x80010734;
aCdCw = 0x80010758;
aIdBiosCV177199 = 0x80010760;
aCdInit = 0x80010794;
aCdDatasync = 0x800107AC;
aSDirWasNotFoun = 0x800107D4;
aCd001 = 0x80010870;
aCdreadSectorEr = 0x800109A4;
aCdreadShellOpe = 0x800109BC;
aCdreadRetry = 0x800109D4;
jpt_8001DE24 = 0x80010A60;
jpt_8001EECC = 0x80010C48;
jpt_8001EFB8 = 0x80010CA8;
jpt_80020818 = 0x80010CD4;
aWaitReset = 0x80010CFC;
aWaitWrdyHL = 0x80010D0C;
aWaitDmafClearW = 0x80010D20;
aSpuTimeOutWait = 0x80010D34;
jpt_8002A518 = 0x80010D74;
jpt_8002A5E8 = 0x80010D94;
jpt_8002ADFC = 0x80010DB4;
jpt_8002AEC4 = 0x80010DD4;
__main = 0x80010DF4;
start = 0x80010DFC;
stup1 = 0x80010E20;
stup0 = 0x80010E9C;
main = 0x80010EB8;
SetDumpFnt = 0x8001134C;
FntLoad = 0x8001138C;
FntOpen = 0x8001142C;
FntFlush = 0x800116E4;
DumpClut = 0x80011EA0;
AddPrim = 0x80011F18;
setSemiTrans = 0x80011FCC;
setShadeTex = 0x80011FF4;
setPolyGT3 = 0x80012058;
setPolyG4 = 0x80012094;
setPolyGT4 = 0x800120A8;
setSprt8 = 0x800120BC;
setSprt16 = 0x800120D0;
setSprt = 0x800120E4;
setTile = 0x80012134;
setLineG2 = 0x80012170;
ResetGraph = 0x80012434;
SetGraphReverse = 0x80012604;
SetGraphQueue = 0x8001277C;
GsGetWorkBase = 0x80012818;
GsGetWorkBase_0 = 0x80012828;
DrawSyncCallback = 0x80012838;
SetDispMask = 0x80012894;
DrawSync = 0x8001290C;
debugLog = 0x80012978;
ClearImage = 0x80012A90;
LoadImage = 0x80012B24;
StoreImage = 0x80012B88;
MoveImage = 0x80012BEC;
ClearOTag = 0x80012C90;
ClearOTagR = 0x80012D3C;
DrawOTag = 0x80012E1C;
PutDrawEnv = 0x80012E8C;
PutDispEnv = 0x80012FE4;
InitHeap = 0x80015138;
Load = 0x80015148;
Exec = 0x80015158;
GPU_cw = 0x80015168;
_bu_init = 0x80015178;
open = 0x80015188;
lseek = 0x80015198;
read = 0x800151A8;
write = 0x800151B8;
close = 0x800151C8;
format = 0x800151D8;
firstfile = 0x800151E8;
nextfile = 0x800151F8;
erase = 0x80015208;
Krom2RawAdd = 0x80015218;
ChangeClearPAD = 0x80015228;
StopPAD = 0x800152D8;
PAD_init2 = 0x800152E8;
PAD_dr = 0x800152F8;
VSync = 0x80015308;
VSyncWait = 0x80015450;
ChangeClearRCnt = 0x800154EC;
ResetCallback = 0x800154FC;
InterruptCallback = 0x8001552C;
DMACallback = 0x8001555C;
VSyncCallback = 0x8001558C;
VSyncCallbacks = 0x800155C0;
StopCallback = 0x800155F0;
RestartCallback = 0x80015620;
CheckCallback = 0x80015650;
GetIntrMask = 0x80015660;
SetIntrMask = 0x80015678;
_96_remove = 0x80015C0C;
ReturnFromException = 0x80015C1C;
ResetEntryInt = 0x80015C2C;
HookEntryInt = 0x80015C3C;
EnterCriticalSection = 0x80015C4C;
ExitCriticalSection = 0x80015C5C;
GsGetWorkBase_1 = 0x80016054;
exit = 0x80016064;
puts = 0x80016074;
setjmp = 0x80016084;
strcat = 0x80016094;
strcpy = 0x800160A4;
strlen = 0x800160B4;
memcpy = 0x800160C4;
memset = 0x800160D4;
rand = 0x800160E4;
srand = 0x800160F4;
malloc = 0x80016104;
free = 0x80016114;
printf = 0x80016124;
fprintf = 0x80016134;
memchr = 0x80016990;
_card_info = 0x80016A0C;
_card_load = 0x80016A1C;
InitCARD = 0x80016A2C;
StartCARD = 0x80016A3C;
_card_clear = 0x80016A4C;
_card_write = 0x80016A84;
_new_card = 0x80016A94;
rsin = 0x80016C9C;
sin_1 = 0x80016CD8;
SetFogNear = 0x80016E08;
CompMatrix = 0x800172BC;
SetMulMatrix = 0x800176F4;
ReadColorMatrix = 0x80017C88;
TransMatrix = 0x80017CDC;
SetRotMatrix = 0x80017E3C;
SetLightMatrix = 0x80017E6C;
SetColorMatrix = 0x80017E9C;
SetTransMatrix = 0x80017ECC;
SetVertex0 = 0x80017EEC;
SetVertex1 = 0x80017EFC;
SetVertex2 = 0x80017F0C;
SetVertexTri = 0x80017F1C;
SetRGBfifo = 0x80017F3C;
SetIR123 = 0x80017F50;
SetIR0 = 0x80017F64;
SetSZfifo3 = 0x80017F70;
SetSZfifo4 = 0x80017F84;
SetSXSYfifo = 0x80017F9C;
SetRii = 0x80017FB0;
SetMAC123 = 0x80017FC4;
SetData32 = 0x80017FD8;
SetDQA = 0x80017FE4;
SetDQB = 0x80017FF0;
SetBackColor = 0x80017FFC;
SetFarColor = 0x8001801C;
SetGeomOffset = 0x8001803C;
SetGeomScreen = 0x8001805C;
LocalLight = 0x8001806C;
DpqColor = 0x80018090;
NormalColor = 0x800180AC;
NormalColor3 = 0x800180C8;
NormalColorDpq = 0x80018104;
NormalColorDpq3 = 0x80018128;
NormalColorCol = 0x80018170;
NormalColorCol3 = 0x80018190;
ColorDpq = 0x800181D4;
ColorCol = 0x800181FC;
AverageSZ3 = 0x80018220;
AverageSZ4 = 0x80018230;
RotTransPers = 0x8001824C;
RotTransPers3 = 0x8001827C;
RotTrans = 0x800182DC;
NormalClip = 0x8001830C;
RotTransPers4 = 0x8001833C;
RotAverage3 = 0x800183BC;
RotAverage4 = 0x8001841C;
RotAverageNclip3 = 0x8001849C;
RotAverageNclip4 = 0x8001852C;
RotAverageNclipColorCol3 = 0x800185DC;
RotMatrix = 0x800186AC;
RotMatrixYXZ = 0x8001893C;
RotMatrixX = 0x80018BCC;
RotMatrixY = 0x80018D6C;
RotMatrixZ = 0x80018F0C;
FlushCache = 0x800192CC;
CdInit = 0x8001930C;
DeliverEvent = 0x80019414;
strcmp = 0x8001BC64;
strncmp = 0x8001BC74;
StClearRing = 0x8001C320;
StSetStream = 0x8001C4C8;
SsVoKeyOff = 0x8001F7AC;
SsVoKeyOn = 0x8001F7E8;
_SsInit = 0x80020328;
SsInitHot = 0x80020410;
SsVabClose = 0x800211D0;
SsVabFakeBody = 0x800212AC;
_SsVmSetProgVol = 0x80025840;
_SsVmGetProgVol = 0x800258B0;
_SsVmSetProgPan = 0x80025900;
_SsVmSetProgVol_0 = 0x80025908;
_SsVmGetProgPan = 0x80025970;
_SsVmGetProgVol_0 = 0x80025978;
_SsVmSetProgPan_0 = 0x800259C8;
_SsVmGetProgPan_0 = 0x80025A38;
SsUtKeyOnV = 0x800264A0;
SsUtKeyOffV = 0x800267E8;
SsUtPitchBend = 0x80026954;
SsUtGetDetVVol = 0x80026DD8;
SsUtSetDetVVol = 0x80026E14;
SsUtGetDetVVol_0 = 0x80026E2C;
SsUtSetDetVVol_0 = 0x80026E68;
SsUtGetVVol = 0x80026E78;
SsUtGetVVol_0 = 0x80026ECC;
SsUtSetVVol = 0x80026F24;
SsUtSetVVol_0 = 0x80026F78;
OpenEvent = 0x800271C8;
EnableEvent = 0x800271D8;
CloseEvent = 0x800283A4;
DisableEvent = 0x800283B4;
SpuInitMalloc = 0x800283C4;
SpuMalloc = 0x80028418;
SpuMallocWithStartAddr = 0x80028D40;
_spu_setReverbAttr = 0x80029810;
SpuClearReverbWorkArea = 0x80029CE0;
WaitEvent = 0x80029E7C;
TestEvent = 0x8002AD5C;
g_InterruptMask = 0x8002D348;
_vsync_rcnt = 0x8002D374;
aThisFunctionIs = 0x8002E1EA;
g_CurrentPlayableCharacter = 0x8003C9A0;
g_CurrentRoomTileLayout = 0x80073084;
g_CurrentRoomHSize = 0x800730A4;
g_CurrentRoomVSize = 0x800730A8;
g_CurrentRoomLeft = 0x800730B0;
g_CurrentRoomTop = 0x800730B4;
g_CurrentRoomRight = 0x800730B8;
g_CurrentRoomBottom = 0x800730BC;
g_CurrentRoomWidth = 0x800730C8;
g_CurrentRoomHeight = 0x800730CC;
playerX = 0x800973F0;
playerY = 0x800973F4;
player_hp = 0x80097BA0;
player_hp_max = 0x80097BA4;
player_heart = 0x80097BA8;
player_heart_max = 0x80097BAC;
player_mp = 0x80097BB0;
player_mp_max = 0x80097BB4;
player_stat_str = 0x80097BB8;
player_stat_con = 0x80097BBC;
player_stat_int = 0x80097BC0;
player_stat_lck = 0x80097BC4;
player_level = 0x80097BE8;
player_exp = 0x80097BEC;
player_gold = 0x80097BF0;
player_kill_count = 0x80097BF4;
player_equip_right_hand = 0x80097BF8;
player_equip_left_hand = 0x80097BFC;
player_equip_head = 0x80097C00;
player_equip_body = 0x80097C04;
player_equip_cloak = 0x80097C08;
player_equip_ring1 = 0x80097C0C;
player_equip_ring2 = 0x80097C10;
m_ptr_menu_text_kills = 0x800A8284;
rect = 0x800ACD98;
aPbav = 0x800B107C;
aPbav_0 = 0x800B407C;
aPbav_2 = 0x800B607C;
aPbav_1 = 0x800B807C;
aPqes_1 = 0x800BA07C;
aPqes = 0x800BC37D;
aPqes_0 = 0x800BCAC3;
aO = 0x800DB3B4;
aDr03x = 0x800DB44C;
aGt403x = 0x800DB458;
aG403x = 0x800DB464;
aGt303x = 0x800DB470;
aLine03x = 0x800DB47C;
aSp1603x = 0x800DB488;
aSp03x = 0x800DB494;
aTile03x = 0x800DB4A0;
aEnv03x = 0x800DB4AC;
aEff03x = 0x800DB4B8;
aRed = 0x800DB4C4;
aGreen = 0x800DB4C8;
aBlue = 0x800DB4D0;
aHalfOn = 0x800DB4D8;
aHalfOff = 0x800DB4E4;
aRgb02x02x02x = 0x800DB4F0;
a0104x04x = 0x800DB504;
a2304x04x = 0x800DB514;
jpt_800E4A64 = 0x800DB530;
jpt_800E55C4 = 0x800DB560;
a02x02x = 0x800DB720;
aMemoryCardLoad = 0x800DB730;
aEnding = 0x800DB744;
aIwaLoad = 0x800DB74C;
aIgaLoad = 0x800DB758;
aHagiLoad = 0x800DB764;
aLoadCBinSBin = 0x800DB770;
aAlucard = 0x800DB784;
aRichter = 0x800DB790;
jpt_800E63C4 = 0x800DB7A0;
jpt_800E7034 = 0x800DB7E8;
jpt_800E7484 = 0x800DB808;
jpt_800E7B18 = 0x800DB828;
aSimCBinFTitle1 = 0x800DBB38;
aSimCSoundDataS_0 = 0x800DBD14;
aSimCSoundDataS_1 = 0x800DBD50;
jpt_800E7C28 = 0x800DBD70;
jpt_800E7E3C = 0x800DBD88;
aSimCBin = 0x800DBDE0;
aSimCSoundDataS = 0x800DBDF4;
aSimCBinW0000Bi = 0x800DBE14;
aSimCBinW1000Bi = 0x800DBE2C;
aSimCBinF0000Bi = 0x800DBE44;
aSimCBinF1000Bi = 0x800DBE5C;
aSimCBinTt000Bi = 0x800DBE74;
aSimCBinFt000Bi = 0x800DBE8C;
aSimCBinMo000Bi = 0x800DBEA4;
aOErrS = 0x800DBEBC;
aRErr = 0x800DBEC8;
aClErr = 0x800DBED0;
aTrErr = 0x800DBED8;
aBu1d1d = 0x800DBEE0;
aBu1d1dS = 0x800DBEEC;
jpt_800E98E4 = 0x800DBEF8;
jpt_800E9934 = 0x800DBF10;
jpt_800E9A48 = 0x800DBF28;
aBaslus00067dra = 0x800DC194;
jpt_800EA8C0 = 0x800DC1A8;
jpt_800EB120 = 0x800DC1E8;
aOver08x04x = 0x800DC228;
jpt_800EE2FC = 0x800DC238;
jpt_800EF590 = 0x800DC290;
aSimCBinDemoKey = 0x800DC490;
aSimCBinDk000Bi = 0x800DC4A8;
aDemonstration = 0x800DC4C8;
aDemoKeyIn04x04 = 0x800DC4D8;
aDemoOverflow = 0x800DC4F0;
jpt_800F0658 = 0x800DC500;
jpt_800F096C = 0x800DC514;
jpt_800F288C = 0x800DC534;
jpt_800F3684 = 0x800DC55C;
jpt_800F3758 = 0x800DC57C;
jpt_800F3C14 = 0x800DC59C;
jpt_800F42A0 = 0x800DC5B4;
aWindowColorSet = 0x800DC5FC;
jpt_800F8150 = 0x800DC68C;
jpt_800F93A0 = 0x800DC6AC;
jpt_800FA060 = 0x800DC71C;
jpt_800FBCC4 = 0x800DC75C;
jpt_800FC36C = 0x800DCB7C;
jpt_800FC5B8 = 0x800DCB94;
jpt_800FD6E0 = 0x800DCBAC;
jpt_800FD7E0 = 0x800DCBC4;
jpt_800FDB40 = 0x800DCBDC;
aXXVQ = 0x800DCBF4;
aAxearmor = 0x800DCC00;
jpt_80102810 = 0x800DCC0C;
jpt_80102918 = 0x800DCC2C;
jpt_80102D9C = 0x800DCC54;
aMemoryCard = 0x800DCC80;
aMemoryCardIs = 0x800DCCAC;
aCannot = 0x800DCCCC;
aNoGame = 0x800DCCE8;
aMemoryCard_0 = 0x800DCD24;
aYes = 0x800DCDB0;
aNo = 0x800DCDB8;
jpt_80103F08 = 0x800DCDC0;
aGold = 0x800DD0A8;
aNz0 = 0x800DD0B0;
aFNz0 = 0x800DD0B4;
aTop = 0x800DD0BC;
aTop_0 = 0x800DD0C0;
aFTop = 0x800DD0C4;
aTogi = 0x800DD0CC;
aAre = 0x800DD0D4;
aFAre = 0x800DD0D8;
aMizu = 0x800DD0E0;
aNo4 = 0x800DD0E8;
aFNo4 = 0x800DD0EC;
aCen = 0x800DD0F4;
aFCen = 0x800DD0F8;
aSiro1 = 0x800DD100;
aNp3 = 0x800DD108;
aFNp3 = 0x800DD10C;
aFNo0 = 0x800DD180;
aMpty = 0x800DEC54;
aUnequip = 0x800DF9EC;
a3pecial = 0x800DFA60;
aAmiliar = 0x800DFA74;
a2ichter = 0x800DFD38;
a7indow = 0x800DFDFC;
a2ight = 0x800DFE78;
aUtton = 0x800DFEC0;
m_menu_text_kills = 0x800DFEEC;
aHealHpBySheddi = 0x800E00B0;
aDarkMetamorpho = 0x800E00D4;
aCausesItemsToM = 0x800E042C;
aTransformIntoB = 0x800E05B4;
aSoulOfBat = 0x800E05C8;
jpt_8010812C = 0x800E0D38;
aDmaError = 0x800E0D54;
aSdHeaderError = 0x800E0D64;
aDiskError = 0x800E0D78;
aRetry = 0x800E0D84;
aRetryXa = 0x800E0D8C;
aCdShellOpenErr = 0x800E0D98;
aCheckingCd = 0x800E0DB0;
aErrorStep02x = 0x800E0DC0;
jpt_80108CFC = 0x800E0DD8;
aStep04x = 0x800E0E28;
aBatIStep04x = 0x800E0E34;
jpt_8010A86C = 0x800E0E48;
jpt_8010AA30 = 0x800E0E88;
jpt_8010AE88 = 0x800E0EC8;
jpt_8010B3B4 = 0x800E0EF0;
jpt_8010B658 = 0x800E0FC0;
jpt_8010F424 = 0x800E108C;
jpt_8010F48C = 0x800E12AC;
jpt_8010F75C = 0x800E12C4;
jpt_8010F958 = 0x800E12DC;
jpt_8010F9E8 = 0x800E12F4;
jpt_801109D0 = 0x800E1308;
jpt_80110C1C = 0x800E1320;
aPlPose02x = 0x800E1334;
jpt_80110E54 = 0x800E1348;
jpt_80111080 = 0x800E1360;
jpt_8011131C = 0x800E1380;
aCommandOk = 0x800E13A0;
a100swordSetOk = 0x800E13AC;
aCharal02x = 0x800E1400;
jpt_80112264 = 0x800E1410;
jpt_80112C9C = 0x800E1588;
jpt_80113328 = 0x800E1750;
jpt_80113938 = 0x800E18C8;
jpt_80113B10 = 0x800E18E0;
aDamKind04x = 0x800E18F4;
jpt_801140A8 = 0x800E1908;
jpt_801141F0 = 0x800E1948;
jpt_80114300 = 0x800E1990;
jpt_80114388 = 0x800E19B0;
jpt_80115DF0 = 0x800E19D0;
jpt_8011643C = 0x800E19E8;
jpt_801169F4 = 0x800E1A00;
jpt_80116CF8 = 0x800E1A20;
aErrorStep = 0x800E1A38;
jpt_80118D54 = 0x800E1A44;
aStrY02x = 0x800E1A74;
jpt_801195F4 = 0x800E1A84;
aAtariNuki = 0x800E1AA4;
jpt_8011AD40 = 0x800E1AB4;
jpt_8011AD94 = 0x800E1AD4;
jpt_8011C214 = 0x800E1AF4;
jpt_8011C490 = 0x800E1B44;
jpt_8011CB08 = 0x800E1B74;
jpt_8011DC74 = 0x800E1B94;
jpt_8011DD70 = 0x800E1BF4;
jpt_8011DDCC = 0x800E1C54;
jpt_8011E580 = 0x800E1CB4;
jpt_8011E648 = 0x800E1CE4;
jpt_8011E9D4 = 0x800E1D1C;
jpt_8011EADC = 0x800E1D4C;
jpt_80120C98 = 0x800E1D84;
jpt_80120FDC = 0x800E1DA4;
jpt_80122494 = 0x800E1DBC;
jpt_80124410 = 0x800E1DD4;
jpt_80126808 = 0x800E1E34;
aLightTimer02x = 0x800E1E48;
jpt_80126F54 = 0x800E1E5C;
jpt_80128C94 = 0x800E1E7C;
jpt_8012A918 = 0x800E1E90;
jpt_8012D4D8 = 0x800E1EB0;
jpt_8012EFE4 = 0x800E1EC8;
jpt_8012FA74 = 0x800E1EF0;
jpt_8012FAC0 = 0x800E1F18;
jpt_80130384 = 0x800E1F30;
jpt_801303DC = 0x800E1F58;
jpt_80130728 = 0x800E1F70;
jpt_80130788 = 0x800E1F98;
jpt_80130B00 = 0x800E1FB0;
jpt_80131014 = 0x800E1FD8;
jpt_801314B4 = 0x800E2000;
jpt_80132F94 = 0x800E2034;
jpt_801332C4 = 0x800E205C;
jpt_80133990 = 0x800E2074;
jpt_80133C10 = 0x800E208C;
jpt_80135058 = 0x800E20B4;
jpt_801353DC = 0x800E2354;
nullsub_8 = 0x800E2F34;
entrypoint_sotn = 0x800E3988;
nullsub_9 = 0x800E7384;
SetRoomForegroundLayer = 0x800ED774;
SetRoomBackgroundLayer = 0x800ED90C;
LoadRoomLayer = 0x800ED9F4;
CheckCollision = 0x800EF45C;
drawMenuChar = 0x800F678C;
drawMenuInt = 0x800F68F4;
setMenuBackgroundRect = 0x80107330;
CopyMapOverlayCallback = 0x801074BC;
nullsub_10 = 0x801362A4;
g_someValue = 0x8013792C;
g_OverlayCopySrcIndex = 0x80137F70;
g_OverlayCopyDstIndex = 0x80137F74;
g_OverlayCopySrc = 0x80137F80;
g_OverlayCopyDst = 0x80137F84;
g_OverlayBlockCount = 0x80137F8C;
g_OverlayLastBlockSize = 0x80137F90;
p = 0x80180014;

8
diff_settings.py Normal file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env python3
def apply(config, args):
config["arch"] = "mipsel"
config['baseimg'] = f'dra.bin'
config['myimg'] = f'build/dra.bin'
config['mapfile'] = f'build/dra.map'
config['source_directories'] = ['src/dra', 'include', 'asm/dra']

1
dra.sha Normal file
View File

@ -0,0 +1 @@
2eac5f7162e77416166c2511c787995488f01c37 build/DRA.BIN

7
include/common.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef COMMON_H
#define COMMON_H
#include "include_asm.h"
#include "types.h"
#endif

31
include/dra.h Normal file
View File

@ -0,0 +1,31 @@
#ifndef DRA_H
#define DRA_H
#include "main.h"
extern s8 D_80073512;
extern s32 D_80138F20;
extern s32 D_80138F7C;
extern s8 D_80139020;
extern s16 D_801396EA;
extern u16 D_801396F4;
extern s32 D_8013980C;
extern u8 D_80139810;
extern s32 D_8013B660;
extern s16 D_8013B668;
extern s32 D_8013B694;
extern s32 D_80138784[487];
void func_800E92E4(void);
void func_8010E0A8(void);
void func_80111928(void);
void func_80131EBC(s32 arg0, s32 arg1);
void func_80131ED8(s32 value);
void func_80131EE8(void);
void func_80131F04(void);
s32 func_80131F28(void);
s32 func_80131F38(void);
s16 func_80131F94(void);
s32 func_80133940(void);
s32 func_80133950(void);
#endif

33
include/include_asm.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef INCLUDE_ASM_H
#define INCLUDE_ASM_H
#define STRINGIFY_(x) #x
#define STRINGIFY(x) STRINGIFY_(x)
#ifndef PERMUTER
#ifndef INCLUDE_ASM
#define INCLUDE_ASM(FOLDER, NAME) \
__asm__( \
".section .text\n" \
"\t.align\t2\n" \
"\t.globl\t"#NAME"\n" \
"\t.ent\t"#NAME"\n" \
#NAME ":\n" \
".include \""FOLDER"/"#NAME".s\"\n" \
"\t.set reorder\n" \
"\t.set at\n" \
"\t.end\t"#NAME \
);
#endif
// omit .global
__asm__(".include \"include/include_asm.inc\"\n");
#else
#define INCLUDE_ASM(FOLDER, NAME)
#endif
#endif

6
include/include_asm.inc Normal file
View File

@ -0,0 +1,6 @@
.macro glabel label
\label:
.endm
.macro .def #
.endm

4
include/macro.inc Normal file
View File

@ -0,0 +1,4 @@
.macro glabel label
.global \label
\label:
.endm

9
include/main.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef MAIN_H
#define MAIN_H
extern unsigned char func_80019424();
extern unsigned char func_80019434();
extern unsigned char func_80019444();
extern void func_80021F6C(s16, s16);
#endif

23
include/main.inc Normal file
View File

@ -0,0 +1,23 @@
.include "macro.inc"
.set noat
.set noreorder
.align 4
.section .text
.macro syscalldef label Sect Func
.global \label
\label:
addiu $t2, $zero, \Sect
jr $t2
addiu $t1, $zero, \Func
nop
.endm
.macro exceptiondef label Func
.global \label
\label:
addiu $a0, $zero, \Func
syscall
jr $ra
nop
.endm

27
include/psxsdk/libapi.h Normal file
View File

@ -0,0 +1,27 @@
extern void InitHeap (unsigned long *, unsigned long);
extern long Load(char *, struct EXEC *);
extern long Exec(struct EXEC *, long, char **);
// GPU_cw
extern void _bu_init(void);
extern long open(char *, unsigned long);
extern long lseek(long, long, long);
extern long read(long, void *, long);
extern long write(long, void *, long);
extern long close(long);
extern long format(char *);
extern struct DIRENTRY * firstfile(char *, struct DIRENTRY *);
extern struct DIRENTRY * nextfile(struct DIRENTRY *);
extern long erase(char *);
extern long Krom2RawAdd(unsigned long);
extern void ChangeClearPAD(long);
extern void StopPAD(void);
// PAD_init2
// PAD_dr
extern void FlushCache(void);
extern void DeliverEvent(unsigned long, unsigned long);
extern long TestEvent(long);
extern long OpenEvent(unsigned long,long,long,long (*func)());
extern long EnableEvent(long);
// ChangeClearRCnt
extern void _96_remove(void);

13
include/psxsdk/libc.h Normal file
View File

@ -0,0 +1,13 @@
extern void exit();
extern void puts(char *);
// setjmp
extern char *strcat (char *, char *);
extern char *strcpy (char *, char *);
extern int strlen (char *);
extern void *memcpy (unsigned char *, unsigned char *, int);
extern void *memset (unsigned char *, unsigned char, int);
extern int rand(void);
extern void srand(unsigned int);
extern void *malloc(size_t);
extern void free(void *);
int printf(char *, ...)

7
include/psxsdk/libcard.h Normal file
View File

@ -0,0 +1,7 @@
// _card_info
// _card_load
extern void InitCARD(long val);
extern long StartCARD(void);
// _card_clear
// _card_write
// _new_card

24
include/types.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef TYPES_H
#define TYPES_H
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef signed char s8;
typedef signed short s16;
typedef signed int s32;
typedef signed long long s64;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef float f32;
typedef double f64;
#endif

1
main.sha Normal file
View File

@ -0,0 +1 @@
54828d4e44ea9575f2a0917ff63def42a304abff build/main.exe

1301
src/dra/42398.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
#include "common.h"
INCLUDE_ASM("asm/main/nonmatchings/psxsdk/fprintf", fprintf);

17
src/main/psxsdk/libapi.c Normal file
View File

@ -0,0 +1,17 @@
#include "common.h"
#include "main.h"
unsigned char func_80019424()
{
return *(unsigned char*)0x80032AB4;
}
unsigned char func_80019434()
{
return *(unsigned char*)0x80032AC4;
}
unsigned char func_80019444()
{
return *(unsigned char*)0x80032AC5;
}

7
src/main/psxsdk/libetc.c Normal file
View File

@ -0,0 +1,7 @@
#include "common.h"
extern u16* g_InterruptMask;
u16 GetIntrMask(void) {
return *g_InterruptMask;
}

1
tools/asm-differ Submodule

@ -0,0 +1 @@
Subproject commit 89df9d720d996267095edab0f17dc7026744e83e

1
tools/n64splat Submodule

@ -0,0 +1 @@
Subproject commit dd1700bb7a69be5faf4b37f80cb80fc4efb131fe