summaryrefslogtreecommitdiff
path: root/lib/ultralib
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2024-02-26 07:18:26 -0800
committerGitHub <noreply@github.com>2024-02-26 08:18:26 -0700
commitc632d1d20b680081c8b1ced4877a32d50d917730 (patch)
treeb7491ee1b79939ab9c541a0b4162c38bb3372b16 /lib/ultralib
parenta10bb11ed6784c6a16a09b7eb17657d2e1bb303c (diff)
Link libultra archive (#149)
* git subrepo pull --force lib/ultralib subrepo: subdir: "lib/ultralib" merged: "34e07ce" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "34e07ce" git-subrepo: version: "0.4.6" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "110b9eb" * Link in libultra archive * git subrepo pull (merge) lib/ultralib subrepo: subdir: "lib/ultralib" merged: "ce7b219" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "caf88de" git-subrepo: version: "0.4.6" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "110b9eb" * Update paths in lib warnings * git subrepo pull (merge) lib/ultralib subrepo: subdir: "lib/ultralib" merged: "4f49c1e" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "299d7fa" git-subrepo: version: "0.4.6" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "110b9eb" * FIXUPS
Diffstat (limited to 'lib/ultralib')
-rw-r--r--lib/ultralib/.github/workflows/ci_gcc.yml4
-rw-r--r--lib/ultralib/.github/workflows/ci_ido.yml4
-rw-r--r--lib/ultralib/.gitignore3
-rw-r--r--lib/ultralib/.gitrepo6
-rw-r--r--lib/ultralib/Makefile136
-rw-r--r--lib/ultralib/Makefile.gcc19
-rw-r--r--lib/ultralib/Makefile.ido17
-rw-r--r--lib/ultralib/README.md36
-rw-r--r--lib/ultralib/base/I/libgultra.txt404
-rw-r--r--lib/ultralib/base/I/libgultra_d.txt404
-rw-r--r--lib/ultralib/base/I/libgultra_rom.txt404
-rw-r--r--lib/ultralib/base/I/libultra.txt400
-rw-r--r--lib/ultralib/base/I/libultra_d.txt404
-rw-r--r--lib/ultralib/base/I/libultra_rom.txt370
-rw-r--r--lib/ultralib/base/J/libgultra.txt446
-rw-r--r--lib/ultralib/base/J/libgultra_d.txt451
-rw-r--r--lib/ultralib/base/J/libgultra_rom.txt416
-rw-r--r--lib/ultralib/base/J/libultra.txt446
-rw-r--r--lib/ultralib/base/J/libultra_d.txt451
-rw-r--r--lib/ultralib/base/J/libultra_rom.txt418
-rw-r--r--lib/ultralib/base/K/libgultra.txt468
-rw-r--r--lib/ultralib/base/K/libgultra_d.txt471
-rw-r--r--lib/ultralib/base/K/libgultra_rom.txt425
-rw-r--r--lib/ultralib/base/K/libultra.txt468
-rw-r--r--lib/ultralib/base/K/libultra_d.txt471
-rw-r--r--lib/ultralib/base/K/libultra_rom.txt427
-rw-r--r--lib/ultralib/base/L/libgultra.txt483
-rw-r--r--lib/ultralib/base/L/libgultra_d.txt486
-rw-r--r--lib/ultralib/base/L/libgultra_rom.txt440
-rw-r--r--lib/ultralib/base/L/libultra.txt483
-rw-r--r--lib/ultralib/base/L/libultra_d.txt486
-rw-r--r--lib/ultralib/base/L/libultra_rom.txt442
-rw-r--r--lib/ultralib/include/PR/gu.h3
-rw-r--r--lib/ultralib/include/PR/os_host.h5
-rw-r--r--lib/ultralib/include/PR/os_internal_exception.h8
-rw-r--r--lib/ultralib/include/PR/os_motor.h3
-rw-r--r--lib/ultralib/include/PR/os_version.h14
-rw-r--r--lib/ultralib/include/gcc/sgidefs.h44
-rw-r--r--lib/ultralib/include/sgidefs.h3
-rw-r--r--lib/ultralib/src/audio/csplayer.c47
-rw-r--r--lib/ultralib/src/audio/env.c26
-rw-r--r--lib/ultralib/src/audio/event.c2
-rw-r--r--lib/ultralib/src/audio/reverb.c7
-rw-r--r--lib/ultralib/src/audio/save.c8
-rw-r--r--lib/ultralib/src/audio/seqpdelete.c10
-rw-r--r--lib/ultralib/src/audio/seqplayer.c58
-rw-r--r--lib/ultralib/src/audio/sndp.h2
-rw-r--r--lib/ultralib/src/audio/sndplayer.c21
-rw-r--r--lib/ultralib/src/audio/synsetfxmix.c13
-rw-r--r--lib/ultralib/src/audio/synstartvoiceparam.c13
-rw-r--r--lib/ultralib/src/audio/synthInternals.h6
-rw-r--r--lib/ultralib/src/audio/synthesizer.c9
-rw-r--r--lib/ultralib/src/debug/assert.c2
-rw-r--r--lib/ultralib/src/debug/assertbreak.s4
-rw-r--r--lib/ultralib/src/debug/profile.c2
-rw-r--r--lib/ultralib/src/debug/threadprofilestop.c9
-rw-r--r--lib/ultralib/src/error/commonerror.c12
-rw-r--r--lib/ultralib/src/error/error.c30
-rw-r--r--lib/ultralib/src/error/errorasm.s24
-rw-r--r--lib/ultralib/src/flash/flashgetaddr.c5
-rw-r--r--lib/ultralib/src/gt/dumpturbo.c4
-rw-r--r--lib/ultralib/src/gu/mtxcatf.c63
-rw-r--r--lib/ultralib/src/gu/mtxcatl.c12
-rw-r--r--lib/ultralib/src/gu/normalize.c23
-rw-r--r--lib/ultralib/src/gu/parse_gbi.c8
-rw-r--r--lib/ultralib/src/gu/rotate.c9
-rw-r--r--lib/ultralib/src/gu/scale.c32
-rw-r--r--lib/ultralib/src/gu/translate.c31
-rw-r--r--lib/ultralib/src/gu/us2dex.c17
-rw-r--r--lib/ultralib/src/gu/us2dex_emu.c21
-rw-r--r--lib/ultralib/src/host/host_ptn64.c5
-rw-r--r--lib/ultralib/src/io/aisetfreq.c3
-rw-r--r--lib/ultralib/src/io/aisetnextbuf.c8
-rw-r--r--lib/ultralib/src/io/cartrominit.c32
-rw-r--r--lib/ultralib/src/io/conteeplongwrite.c2
-rw-r--r--lib/ultralib/src/io/conteepprobe.c2
-rw-r--r--lib/ultralib/src/io/conteepread.c46
-rw-r--r--lib/ultralib/src/io/conteepwrite.c55
-rw-r--r--lib/ultralib/src/io/contpfs.c102
-rw-r--r--lib/ultralib/src/io/contramread.c98
-rw-r--r--lib/ultralib/src/io/contramwrite.c90
-rw-r--r--lib/ultralib/src/io/controller.h44
-rw-r--r--lib/ultralib/src/io/crc.c48
-rw-r--r--lib/ultralib/src/io/driverominit.c31
-rw-r--r--lib/ultralib/src/io/epirawread.c11
-rw-r--r--lib/ultralib/src/io/gbpakinit.c2
-rw-r--r--lib/ultralib/src/io/gbpakreadid.c9
-rw-r--r--lib/ultralib/src/io/gbpakreadwrite.c3
-rw-r--r--lib/ultralib/src/io/leodiskinit.c36
-rw-r--r--lib/ultralib/src/io/leointerrupt.c194
-rw-r--r--lib/ultralib/src/io/motor.c207
-rw-r--r--lib/ultralib/src/io/pfsallocatefile.c195
-rw-r--r--lib/ultralib/src/io/pfschecker.c58
-rw-r--r--lib/ultralib/src/io/pfsdeletefile.c119
-rw-r--r--lib/ultralib/src/io/pfsfilestate.c62
-rw-r--r--lib/ultralib/src/io/pfsfreeblocks.c6
-rw-r--r--lib/ultralib/src/io/pfsgetlabel.c4
-rw-r--r--lib/ultralib/src/io/pfsgetstatus.c20
-rw-r--r--lib/ultralib/src/io/pfsinitpak.c30
-rw-r--r--lib/ultralib/src/io/pfsnumfiles.c12
-rw-r--r--lib/ultralib/src/io/pfsreadwritefile.c18
-rw-r--r--lib/ultralib/src/io/pfsreformat.c2
-rw-r--r--lib/ultralib/src/io/pfsrepairid.c55
-rw-r--r--lib/ultralib/src/io/pfssearchfile.c7
-rw-r--r--lib/ultralib/src/io/pfsselectbank.c2
-rw-r--r--lib/ultralib/src/io/pfssetlabel.c12
-rw-r--r--lib/ultralib/src/io/piint.h41
-rw-r--r--lib/ultralib/src/io/pimgr.c6
-rw-r--r--lib/ultralib/src/io/pirawread.c11
-rw-r--r--lib/ultralib/src/io/sirawdma.c16
-rw-r--r--lib/ultralib/src/io/sirawread.c10
-rw-r--r--lib/ultralib/src/io/sirawwrite.c10
-rw-r--r--lib/ultralib/src/io/sprawdma.c8
-rw-r--r--lib/ultralib/src/io/sprawread.c10
-rw-r--r--lib/ultralib/src/io/sprawwrite.c10
-rw-r--r--lib/ultralib/src/io/sptask.c4
-rw-r--r--lib/ultralib/src/io/vimgr.c4
-rw-r--r--lib/ultralib/src/io/visetspecial.c5
-rw-r--r--lib/ultralib/src/io/viswapcontext.c8
-rw-r--r--lib/ultralib/src/io/vitbl.c4
-rw-r--r--lib/ultralib/src/libc/ldiv.c1
-rw-r--r--lib/ultralib/src/libc/syncprintf.c114
-rw-r--r--lib/ultralib/src/log/delay.s4
-rw-r--r--lib/ultralib/src/log/logfloat.c4
-rw-r--r--lib/ultralib/src/mgu/mtxcatl.c10
-rw-r--r--lib/ultralib/src/mgu/rotate.c9
-rw-r--r--lib/ultralib/src/os/ackramromread.c9
-rw-r--r--lib/ultralib/src/os/ackramromwrite.c8
-rw-r--r--lib/ultralib/src/os/createthread.c2
-rw-r--r--lib/ultralib/src/os/destroythread.c13
-rw-r--r--lib/ultralib/src/os/exceptasm.h6
-rw-r--r--lib/ultralib/src/os/exceptasm.s53
-rw-r--r--lib/ultralib/src/os/gethwinterrupt.c8
-rw-r--r--lib/ultralib/src/os/getmemsize.c18
-rw-r--r--lib/ultralib/src/os/initialize.c126
-rw-r--r--lib/ultralib/src/os/initialize_isv.c50
-rw-r--r--lib/ultralib/src/os/interrupt.s11
-rw-r--r--lib/ultralib/src/os/osint.h2
-rw-r--r--lib/ultralib/src/os/seteventmesg.c4
-rw-r--r--lib/ultralib/src/os/setfpccsr.s2
-rw-r--r--lib/ultralib/src/os/sethwinterrupt.c16
-rw-r--r--lib/ultralib/src/os/settimer.c9
-rw-r--r--lib/ultralib/src/os/testhost.c8
-rw-r--r--lib/ultralib/src/os/timerintr.c2
-rw-r--r--lib/ultralib/src/rg/printregion.c3
-rw-r--r--lib/ultralib/src/rmon/rmonbrk.c8
-rw-r--r--lib/ultralib/src/rmon/rmoncmds.c8
-rw-r--r--lib/ultralib/src/rmon/rmonmain.c12
-rw-r--r--lib/ultralib/src/rmon/rmonmem.c12
-rw-r--r--lib/ultralib/src/rmon/rmonmisc.c8
-rw-r--r--lib/ultralib/src/rmon/rmonrcp.s3
-rw-r--r--lib/ultralib/src/rmon/rmonregs.c16
-rw-r--r--lib/ultralib/src/rmon/rmonsio.c12
-rw-r--r--lib/ultralib/src/rmon/rmontask.c8
-rw-r--r--lib/ultralib/src/sp/sprite.c9
-rw-r--r--lib/ultralib/src/voice/voicecontread2.c10
-rw-r--r--lib/ultralib/src/voice/voicecontread36.c4
-rw-r--r--lib/ultralib/src/voice/voicecontwrite20.c14
-rw-r--r--lib/ultralib/src/voice/voicecontwrite4.c10
-rw-r--r--lib/ultralib/src/voice/voicegetstatus.c2
-rw-r--r--lib/ultralib/src/voice/voicesetadconverter.c4
-rw-r--r--lib/ultralib/src/voice/voicestopreaddata.c11
-rw-r--r--lib/ultralib/tools/Makefile6
-rwxr-xr-xlib/ultralib/tools/set_o32abi_bit.py25
164 files changed, 13528 insertions, 322 deletions
diff --git a/lib/ultralib/.github/workflows/ci_gcc.yml b/lib/ultralib/.github/workflows/ci_gcc.yml
index 054270a..31efff8 100644
--- a/lib/ultralib/.github/workflows/ci_gcc.yml
+++ b/lib/ultralib/.github/workflows/ci_gcc.yml
@@ -13,7 +13,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- version: [L] # [H, I, I_patch, J, K, L]
+ version: [I, J, K, L] # [H, I, I_patch, J, K, L]
suffix: [~, _d, _rom]
steps:
@@ -32,7 +32,7 @@ jobs:
token: ${{ secrets.SECRETTOKEN }}
path: deps_repo
- name: Get the dependency
- run: cp deps_repo/libultra/${{ matrix.version }}/* .
+ run: cp deps_repo/libultra/${{ matrix.version }}/* base/${{ matrix.version }}
- name: Setup
run: make setup -j $(nproc) TARGET=libgultra${{ matrix.suffix }} VERSION=${{ matrix.version }}
diff --git a/lib/ultralib/.github/workflows/ci_ido.yml b/lib/ultralib/.github/workflows/ci_ido.yml
index 4d7f8dc..1410108 100644
--- a/lib/ultralib/.github/workflows/ci_ido.yml
+++ b/lib/ultralib/.github/workflows/ci_ido.yml
@@ -13,7 +13,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- version: [L] # [E, F, G, H, I, I_patch, J, K, L]
+ version: [I, J, K, L] # [E, F, G, H, I, I_patch, J, K, L]
suffix: [~, _rom] # [~, _d, _rom]
steps:
@@ -32,7 +32,7 @@ jobs:
token: ${{ secrets.SECRETTOKEN }}
path: deps_repo
- name: Get the dependency
- run: cp deps_repo/libultra/${{ matrix.version }}/* .
+ run: cp deps_repo/libultra/${{ matrix.version }}/* base/${{ matrix.version }}
- name: Setup
run: make setup -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }}
diff --git a/lib/ultralib/.gitignore b/lib/ultralib/.gitignore
index d4c09ae..1193e99 100644
--- a/lib/ultralib/.gitignore
+++ b/lib/ultralib/.gitignore
@@ -10,6 +10,7 @@ __pycache__/
CMakeLists.txt
cmake-build-debug
venv/
+.venv
# Project-specific ignores
base_*/
@@ -24,3 +25,5 @@ tools/ido
# Tool artifacts
ctx.c
+
+libultra_collection/
diff --git a/lib/ultralib/.gitrepo b/lib/ultralib/.gitrepo
index 0ec609d..f9183f9 100644
--- a/lib/ultralib/.gitrepo
+++ b/lib/ultralib/.gitrepo
@@ -6,7 +6,7 @@
[subrepo]
remote = git@github.com:decompals/ultralib.git
branch = main
- commit = d163fa463289f0cd2a80c19f5673bd3c21d92861
- parent = ec338c391df972fb5a7a0840517e435b67c5daf1
+ commit = 299d7faf8798cbe75e3247ccdf4e65c09f5270dd
+ parent = a10bb11ed6784c6a16a09b7eb17657d2e1bb303c
method = merge
- cmdver = 0.4.3
+ cmdver = 0.4.6
diff --git a/lib/ultralib/Makefile b/lib/ultralib/Makefile
index cf87da4..a4714b6 100644
--- a/lib/ultralib/Makefile
+++ b/lib/ultralib/Makefile
@@ -1,15 +1,21 @@
-NON_MATCHING ?= 0
+COMPARE ?= 1
+FIXUPS ?= 0
+
+ifneq ($(FIXUPS),0)
+COMPARE := 0
+endif
# One of:
# libgultra_rom, libgultra_d, libgultra
# libultra_rom, libultra_d, libultra
TARGET ?= libgultra_rom
+VERSION ?= L
CROSS ?= mips-linux-gnu-
-BASE_DIR := base_$(TARGET)
-BASE_AR := $(TARGET).a
+BASE_DIR := extracted/$(VERSION)/$(TARGET)
+BASE_AR := base/$(VERSION)/$(TARGET).a
BUILD_ROOT := build
-BUILD_DIR := $(BUILD_ROOT)/$(TARGET)
+BUILD_DIR := $(BUILD_ROOT)/$(VERSION)/$(TARGET)
BUILD_AR := $(BUILD_DIR)/$(TARGET).a
WORKING_DIR := $(shell pwd)
@@ -17,6 +23,24 @@ WORKING_DIR := $(shell pwd)
CPP := cpp -P
AR := ar
+VERSION_D := 1
+VERSION_E := 2
+VERSION_F := 3
+VERSION_G := 4
+VERSION_H := 5
+VERSION_I := 6
+VERSION_J := 7
+VERSION_K := 8
+VERSION_L := 9
+
+VERSION_DEFINE := -DBUILD_VERSION=$(VERSION_$(VERSION)) -DBUILD_VERSION_STRING=\"2.0$(VERSION)\"
+
+ifeq ($(findstring _d,$(TARGET)),_d)
+DEBUGFLAG := -D_DEBUG
+else
+DEBUGFLAG := -DNDEBUG
+endif
+
ifeq ($(findstring libgultra,$(TARGET)),libgultra)
-include Makefile.gcc
else ifeq ($(findstring libultra,$(TARGET)),libultra)
@@ -25,28 +49,33 @@ else
$(error Invalid Target)
endif
-ifeq ($(findstring _d,$(TARGET)),_d)
-CPPFLAGS += -D_DEBUG
-else
-CPPFLAGS += -DNDEBUG
-endif
-
ifeq ($(findstring _rom,$(TARGET)),_rom)
CPPFLAGS += -D_FINALROM
endif
SRC_DIRS := $(shell find src -type d)
-ASM_DIRS := $(shell find asm -type d -not -path "asm/non_matchings*")
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
-S_FILES := $(foreach dir,$(SRC_DIRS) $(ASM_DIRS),$(wildcard $(dir)/*.s))
-O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \
- $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \
- $(foreach f,$(wildcard $(BASE_DIR)/*),$(BUILD_DIR)/$f)
+S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s))
+
+# Versions J and below used the C matrix math implementations
+MGU_MATRIX_FILES := mtxcatf normalize scale translate
+ifneq ($(filter $(VERSION),D E F G H I J),)
+S_FILES := $(filter-out $(addprefix src/mgu/,$(MGU_MATRIX_FILES:=.s)),$(S_FILES))
+else
+C_FILES := $(filter-out $(addprefix src/gu/,$(MGU_MATRIX_FILES:=.c)),$(C_FILES))
+endif
+
+C_O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f)
+S_O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f)
+O_FILES := $(S_O_FILES) $(C_O_FILES)
# Because we patch the object file timestamps, we can't use them as the targets since they'll always be older than the C file
# Therefore instead we use marker files that have actual timestamps as the dependencies for the archive
-MARKER_FILES := $(O_FILES:.o=.marker)
+C_MARKER_FILES := $(C_O_FILES:.o=.marker)
+S_MARKER_FILES := $(S_O_FILES:.o=.marker)
+S_MARKER_FILES := $(filter-out $(MDEBUG_FILES),$(S_MARKER_FILES))
+MARKER_FILES := $(C_MARKER_FILES) $(S_MARKER_FILES) $(MDEBUG_FILES)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
COMPARE_OBJ = cmp $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o) && echo "$(@:.marker=.o): OK"
COMPARE_AR = cmp $(BASE_AR) $@ && echo "$@: OK"
ifeq ($(COMPILER),ido)
@@ -61,22 +90,40 @@ AR_OLD := $(AR)
endif
BASE_OBJS := $(wildcard $(BASE_DIR)/*.o)
-# Try to find a file corresponding to an archive file in any of src/ asm/ or the base directory, prioritizing src then asm then the original file
-AR_ORDER = $(foreach f,$(shell $(AR) t $(BASE_AR)),$(shell find $(BUILD_DIR)/src $(BUILD_DIR)/asm $(BUILD_DIR)/$(BASE_DIR) -iname $f -type f -print -quit))
-MATCHED_OBJS = $(filter-out $(BUILD_DIR)/$(BASE_DIR)/%,$(AR_ORDER))
+
+# Check to make sure the current version has been set up
+ifneq ($(COMPARE),0)
+ifeq ($(BASE_OBJS),)
+# Ignore this check if the user is currently running setup, clean or distclean
+ifeq ($(filter $(MAKECMDGOALS),setup clean distclean),)
+$(error Current version ($(TARGET) 2.0$(VERSION)) has not been setup!)
+endif
+endif
+endif
+
+AR_OBJECTS := $(shell cat base/$(VERSION)/$(TARGET).txt)
+# If the version and target doesn't have a text file yet, resort back to using the base archive to get objects
+ifeq ($(AR_OBJECTS),)
+AR_OBJECTS := $(shell ar t $(BASE_AR))
+endif
+
+
+# Try to find a file corresponding to an archive file in src/ or the base directory, prioritizing src then the original file
+AR_ORDER = $(foreach f,$(AR_OBJECTS),$(shell find $(BUILD_DIR)/src $(BASE_DIR) -iname $f -type f -print -quit))
+MATCHED_OBJS = $(filter-out $(BASE_DIR)/%,$(AR_ORDER))
UNMATCHED_OBJS = $(filter-out $(MATCHED_OBJS),$(AR_ORDER))
NUM_OBJS = $(words $(AR_ORDER))
NUM_OBJS_MATCHED = $(words $(MATCHED_OBJS))
NUM_OBJS_UNMATCHED = $(words $(UNMATCHED_OBJS))
-$(shell mkdir -p asm $(BASE_DIR) src $(BUILD_DIR)/$(BASE_DIR) $(foreach dir,$(ASM_DIRS) $(SRC_DIRS),$(BUILD_DIR)/$(dir)))
+$(shell mkdir -p $(BASE_DIR) src $(foreach dir,$(SRC_DIRS),$(BUILD_DIR)/$(dir)))
.PHONY: all clean distclean setup
all: $(BUILD_AR)
$(BUILD_AR): $(MARKER_FILES)
$(AR_OLD) rcs $@ $(AR_ORDER)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# patch archive creation time and individual files' ownership & permissions
dd bs=1 skip=24 seek=24 count=12 conv=notrunc if=$(BASE_AR) of=$@ status=none
python3 tools/patch_ar_meta.py $@ $(BASE_AR) $(PATCH_AR_FLAGS)
@@ -85,30 +132,32 @@ ifneq ($(NON_MATCHING),1)
endif
clean:
- $(RM) -rf $(BUILD_ROOT)
+ $(RM) -rf $(BUILD_DIR)
-distclean: clean
+distclean:
$(MAKE) -C tools distclean
- $(RM) -rf $(BASE_DIR)
+ $(RM) -rf extracted/ $(BUILD_ROOT)
setup:
$(MAKE) -C tools
- cd $(BASE_DIR) && $(AR) xo ../$(BASE_AR)
+ifneq ($(COMPARE),0)
+ cd $(BASE_DIR) && $(AR) xo $(WORKING_DIR)/$(BASE_AR)
chmod -R +rw $(BASE_DIR)
ifeq ($(COMPILER),ido)
export CROSS=$(CROSS) && ./tools/strip_debug.sh $(BASE_DIR)
endif
+endif
$(BUILD_DIR)/$(BASE_DIR)/%.marker: $(BASE_DIR)/%.o
cp $< $(@:.marker=.o)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# change file timestamps to match original
@touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o)
@$(COMPARE_OBJ)
@touch $@
endif
-GBIDEFINE := -DF3DEX_GBI_2
+GBIDEFINE := -DF3DEX_GBI
$(BUILD_DIR)/src/gu/parse_gbi.marker: GBIDEFINE := -DF3D_GBI
$(BUILD_DIR)/src/gu/us2dex_emu.marker: GBIDEFINE :=
@@ -119,9 +168,9 @@ $(BUILD_DIR)/src/sp/spriteex2.marker: GBIDEFINE :=
$(BUILD_DIR)/src/voice/%.marker: OPTFLAGS += -DLANG_JAPANESE -I$(WORKING_DIR)/src -I$(WORKING_DIR)/src/voice
$(BUILD_DIR)/src/voice/%.marker: CC := tools/compile_sjis.py -D__CC=$(WORKING_DIR)/$(CC) -D__BUILD_DIR=$(BUILD_DIR)
-$(BUILD_DIR)/%.marker: %.c
+$(C_MARKER_FILES): $(BUILD_DIR)/%.marker: %.c
cd $(<D) && $(WORKING_DIR)/$(CC) $(CFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(OPTFLAGS) $(<F) $(IINC) -o $(WORKING_DIR)/$(@:.marker=.o)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# check if this file is in the archive; patch corrupted bytes and change file timestamps to match original if so
@$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) $(STRIP) && \
@@ -129,13 +178,18 @@ ifneq ($(NON_MATCHING),1)
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
+endif
+ifneq ($(FIXUPS),0)
+ tools/set_o32abi_bit.py $(WORKING_DIR)/$(@:.marker=.o)
+ $(CROSS)strip $(WORKING_DIR)/$(@:.marker=.o) -N asdasdasdasd
+ $(CROSS)objcopy --remove-section .mdebug $(WORKING_DIR)/$(@:.marker=.o)
+endif
# create or update the marker file
@touch $@
-endif
-$(BUILD_DIR)/%.marker: %.s
+$(S_MARKER_FILES): $(BUILD_DIR)/%.marker: %.s
cd $(<D) && $(WORKING_DIR)/$(CC) $(ASFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(ASOPTFLAGS) $(<F) $(IINC) -o $(WORKING_DIR)/$(@:.marker=.o)
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# check if this file is in the archive; patch corrupted bytes and change file timestamps to match original if so
@$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) $(STRIP) && \
@@ -143,9 +197,14 @@ ifneq ($(NON_MATCHING),1)
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
+endif
+ifneq ($(FIXUPS),0)
+ tools/set_o32abi_bit.py $(WORKING_DIR)/$(@:.marker=.o)
+ $(CROSS)strip $(WORKING_DIR)/$(@:.marker=.o) -N asdasdasdasd
+ $(CROSS)objcopy --remove-section .mdebug $(WORKING_DIR)/$(@:.marker=.o)
+endif
# create or update the marker file
@touch $@
-endif
# Rule for building files that require specific file paths in the mdebug section
$(MDEBUG_FILES): $(BUILD_DIR)/src/%.marker: src/%.s
@@ -153,7 +212,7 @@ $(MDEBUG_FILES): $(BUILD_DIR)/src/%.marker: src/%.s
mkdir -p $(@:.marker=)
export USR_INCLUDE=$(WORKING_DIR)/include && cd $(@:.marker=) && $(WORKING_DIR)/$(CC) $(ASFLAGS) $(CPPFLAGS) ../$(<F) -I/usr/include -o $(notdir $(<:.s=.o))
mv $(@:.marker=)/$(<F:.s=.o) $(@:.marker=)/..
-ifneq ($(NON_MATCHING),1)
+ifneq ($(COMPARE),0)
# check if this file is in the archive; patch corrupted bytes and change file timestamps to match original if so
@$(if $(findstring $(BASE_DIR)/$(@F:.marker=.o), $(BASE_OBJS)), \
python3 tools/fix_objfile.py $(@:.marker=.o) $(BASE_DIR)/$(@F:.marker=.o) && \
@@ -161,9 +220,14 @@ ifneq ($(NON_MATCHING),1)
touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o), \
echo "Object file $(@F:.marker=.o) is not in the current archive" \
)
+endif
+ifneq ($(FIXUPS),0)
+ tools/set_o32abi_bit.py $(WORKING_DIR)/$(@:.marker=.o)
+ $(CROSS)strip $(WORKING_DIR)/$(@:.marker=.o) -N asdasdasdasd
+ $(CROSS)objcopy --remove-section .mdebug $(WORKING_DIR)/$(@:.marker=.o)
+endif
# create or update the marker file
@touch $@
-endif
# Disable built-in rules
.SUFFIXES:
diff --git a/lib/ultralib/Makefile.gcc b/lib/ultralib/Makefile.gcc
index dce908b..96f1eed 100644
--- a/lib/ultralib/Makefile.gcc
+++ b/lib/ultralib/Makefile.gcc
@@ -9,11 +9,26 @@ export COMPILER_PATH := $(WORKING_DIR)/tools/gcc
CFLAGS := -w -nostdinc -c -G 0 -mgp32 -mfp32 -D_LANGUAGE_C
ASFLAGS := -w -nostdinc -c -G 0 -mgp32 -mfp32 -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_MIPS_SIM=1 -D_ULTRA64 -x assembler-with-cpp
-CPPFLAGS = -D_MIPS_SZLONG=32 -D__USE_ISOC99 $(GBIDEFINE)
+CPPFLAGS = -D_MIPS_SZLONG=32 -D__USE_ISOC99 $(GBIDEFINE) $(VERSION_DEFINE) $(DEBUGFLAG)
IINC = -I . -I $(WORKING_DIR)/include -I $(WORKING_DIR)/include/gcc -I $(WORKING_DIR)/include/PR
MIPS_VERSION := -mips3
ASOPTFLAGS :=
+ifneq ($(filter $(VERSION),D E F G H I J),)
+CFLAGS += -funsigned-char
+endif
+
+# 2.0I libgultra_rom was not compiled with -DNDEBUG and instead libgultra had -DNDEBUG
+ifneq ($(filter $(VERSION),I),)
+ifeq ($(findstring _rom,$(TARGET)),_rom)
+DEBUGFLAG :=
+else ifeq ($(findstring _d,$(TARGET)),_d)
+DEBUGFLAG := -D_DEBUG
+else
+DEBUGFLAG := -DNDEBUG
+endif
+endif
+
ifeq ($(findstring _d,$(TARGET)),_d)
OPTFLAGS := -O0
else
@@ -33,7 +48,9 @@ export VR4300MUL := ON
$(BUILD_DIR)/src/os/initialize_isv.marker: OPTFLAGS := -O2
$(BUILD_DIR)/src/os/initialize_isv.marker: STRIP = && tools/gcc/strip-2.7 -N initialize_isv.c $(WORKING_DIR)/$(@:.marker=.o)
$(BUILD_DIR)/src/os/assert.marker: OPTFLAGS := -O0
+ifeq ($(filter $(VERSION),D E F G H I),)
$(BUILD_DIR)/src/os/seterrorhandler.marker: OPTFLAGS := -O0
+endif
$(BUILD_DIR)/src/mgu/%.marker: export VR4300MUL := OFF
$(BUILD_DIR)/src/mgu/rotate.marker: export VR4300MUL := ON
$(BUILD_DIR)/src/debug/%.marker: ASFLAGS += -P
diff --git a/lib/ultralib/Makefile.ido b/lib/ultralib/Makefile.ido
index 54c8ff7..1550f4d 100644
--- a/lib/ultralib/Makefile.ido
+++ b/lib/ultralib/Makefile.ido
@@ -9,7 +9,7 @@ export COMPILER_PATH := $(WORKING_DIR)/tools/ido
CFLAGS := -c -Wab,-r4300_mul -G 0 -nostdinc -Xcpluscomm -fullwarn -woff 516,649,838,712
ASFLAGS := -c -Wab,-r4300_mul -G 0 -nostdinc -woff 516,649,838,712
-CPPFLAGS = -D_MIPS_SZLONG=32 $(GBIDEFINE) $(PICFLAGS)
+CPPFLAGS = -D_MIPS_SZLONG=32 $(GBIDEFINE) $(VERSION_DEFINE) $(PICFLAGS) $(DEBUGFLAG)
IINC = -I $(WORKING_DIR)/include -I $(WORKING_DIR)/include/ido -I $(WORKING_DIR)/include/PR
MIPS_VERSION := -mips2 -o32
PICFLAGS := -non_shared
@@ -18,7 +18,11 @@ ifeq ($(findstring _d,$(TARGET)),_d)
OPTFLAGS := -O1 -g2
ASOPTFLAGS := -O0 -g2
else
+ifneq ($(filter $(VERSION),D E F G H I),)
+OPTFLAGS := -O1
+else
OPTFLAGS := -O2
+endif
ASOPTFLAGS := -O1
endif
@@ -43,3 +47,14 @@ $(BUILD_DIR)/src/libc/llcvt.marker: MIPS_VERSION := -mips3 -32
$(BUILD_DIR)/src/os/exceptasm.marker: MIPS_VERSION := -mips3 -32
$(BUILD_DIR)/src/log/delay.marker: MIPS_VERSION := -mips1 -o32
$(BUILD_DIR)/src/log/delay.marker: PICFLAGS := -KPIC
+
+ifneq ($(filter $(VERSION),D E F G H I),)
+$(BUILD_DIR)/src/libc/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/sched/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/gu/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/mgu/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/sp/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/audio/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/rg/%.marker: OPTFLAGS := -O3
+$(BUILD_DIR)/src/gt/%.marker: OPTFLAGS := -O3
+endif
diff --git a/lib/ultralib/README.md b/lib/ultralib/README.md
index ce88d5c..8fa9b97 100644
--- a/lib/ultralib/README.md
+++ b/lib/ultralib/README.md
@@ -11,17 +11,19 @@ Currently this repo supports building the following versions:
| 2.0E | :x: / N/A | :x: / N/A | :x: / N/A |
| 2.0F | :x: / N/A | :x: / N/A | :x: / N/A |
| 2.0G | :x: / N/A | :x: / N/A | :x: / N/A |
-| 2.0H | :x: / :x: | :x: / :x: | :x: / :x: |
-| 2.0I | :x: / :x: | :x: / :x: | :x: / :x: |
+| 2.0H | N/A / :x: | N/A / :x: | N/A / :x: |
+| 2.0I | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: |
| 2.0I_patch | :x: / :x: | :x: / :x: | :x: / :x: |
-| 2.0J | :x: / :x: | :x: / :x: | :x: / :x: |
-| 2.0K | :x: / :x: | :x: / :x: | :x: / :x: |
+| 2.0J | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: |
+| 2.0K | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: |
| 2.0L | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: |
| ique_v1.5 | :x: | :x: | :x: |
## Preparation
-After cloning the repo, put a copy of the target archive on the root of this directory.
+After cloning the repo, put a copy of the target archive(s) in their correct version folder in `base/`.
+For example, if your target archive is libgultra_rom.a 2.0L then you'd place it in `base/L/`.
+If you will be building without a target archive by setting `COMPARE=0` then you can skip this step.
## Build dependencies
@@ -46,5 +48,25 @@ sudo apt install binutils-mips-linux-gnu
## Building
-- `make setup`
-- `make`
+Run make setup with the proper flags set followed by make with optional jobs.
+For example, if building the 2.0L PC archive you'd do the following:
+
+- `make VERSION=L TARGET=libgultra_rom setup`
+- `make VERSION=L TARGET=libgultra_rom`
+
+Every target flag combination requires separate a setup command.
+
+If building without an target archive, than you can use `COMPARE=0` like the the following:
+
+- `make VERSION=L TARGET=libgultra_rom COMPARE=0 setup`
+- `make VERSION=L TARGET=libgultra_rom COMPARE=0`
+
+note that running setup without `COMPARE=0` and no archive will result in an error,
+and only needs to be run once instead of per target flag combination
+
+If building for use with modern linkers, than you can use `FIXUPS=1` like the the following:
+
+- `make VERSION=L TARGET=libgultra_rom FIXUPS=1 setup`
+- `make VERSION=L TARGET=libgultra_rom FIXUPS=1`
+
+note that running with `FIXUPS=1` will automatically set `COMPARE=0`.
diff --git a/lib/ultralib/base/I/libgultra.txt b/lib/ultralib/base/I/libgultra.txt
new file mode 100644
index 0000000..315e830
--- /dev/null
+++ b/lib/ultralib/base/I/libgultra.txt
@@ -0,0 +1,404 @@
+gt.o
+dumpturbo.o
+sqrtf.o
+libm_vals.o
+align.o
+cosf.o
+coss.o
+frustum.o
+lookat.o
+lookatref.o
+lookathil.o
+lookatstereo.o
+mtxutil.o
+mtxcatf.o
+mtxcatl.o
+normalize.o
+ortho.o
+perspective.o
+rotate.o
+rotaterpy.o
+scale.o
+sinf.o
+sins.o
+translate.o
+loadtextureblockmipmap.o
+guloadtile_bug.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+usprite.o
+us2dex.o
+us2dex_emu.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+exceptasm.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+getintmask.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+invaldcache.o
+invalicache.o
+interrupt.o
+maptlb.o
+parameters.o
+probetlb.o
+setintmask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+unmaptlb.o
+unmaptlball.o
+writebackdcache.o
+writebackdcacheall.o
+maptlbrdb.o
+errorasm.o
+assertbreak.o
+atomic.o
+createmesgqueue.o
+createthread.o
+destroythread.o
+getactivequeue.o
+getthreadid.o
+getthreadpri.o
+gettime.o
+initialize.o
+jammesg.o
+kdebugserver.o
+physicaltovirtual.o
+recvmesg.o
+resetglobalintmask.o
+sendmesg.o
+seteventmesg.o
+setglobalintmask.o
+sethwinterrupt.o
+setthreadpri.o
+settime.o
+settimer.o
+startthread.o
+stopthread.o
+stoptimer.o
+syncputchars.o
+thread.o
+timerintr.o
+virtualtophysical.o
+yieldthread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+initrdb.o
+rdbsend.o
+getmemsize.o
+error.o
+seterrorhandler.o
+assert.o
+exit.o
+profile.o
+readhost.o
+testhost.o
+writehost.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+color.o
+clearattribute.o
+hide.o
+spscale.o
+setattribute.o
+show.o
+sprite.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+crc.o
+contramread.o
+contramwrite.o
+contpfs.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+motor.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+leodiskinit.o
+leointerrupt.o
+driverominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+giorawinterrupt.o
+giointerrupt.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+sched.o
diff --git a/lib/ultralib/base/I/libgultra_d.txt b/lib/ultralib/base/I/libgultra_d.txt
new file mode 100644
index 0000000..315e830
--- /dev/null
+++ b/lib/ultralib/base/I/libgultra_d.txt
@@ -0,0 +1,404 @@
+gt.o
+dumpturbo.o
+sqrtf.o
+libm_vals.o
+align.o
+cosf.o
+coss.o
+frustum.o
+lookat.o
+lookatref.o
+lookathil.o
+lookatstereo.o
+mtxutil.o
+mtxcatf.o
+mtxcatl.o
+normalize.o
+ortho.o
+perspective.o
+rotate.o
+rotaterpy.o
+scale.o
+sinf.o
+sins.o
+translate.o
+loadtextureblockmipmap.o
+guloadtile_bug.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+usprite.o
+us2dex.o
+us2dex_emu.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+exceptasm.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+getintmask.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+invaldcache.o
+invalicache.o
+interrupt.o
+maptlb.o
+parameters.o
+probetlb.o
+setintmask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+unmaptlb.o
+unmaptlball.o
+writebackdcache.o
+writebackdcacheall.o
+maptlbrdb.o
+errorasm.o
+assertbreak.o
+atomic.o
+createmesgqueue.o
+createthread.o
+destroythread.o
+getactivequeue.o
+getthreadid.o
+getthreadpri.o
+gettime.o
+initialize.o
+jammesg.o
+kdebugserver.o
+physicaltovirtual.o
+recvmesg.o
+resetglobalintmask.o
+sendmesg.o
+seteventmesg.o
+setglobalintmask.o
+sethwinterrupt.o
+setthreadpri.o
+settime.o
+settimer.o
+startthread.o
+stopthread.o
+stoptimer.o
+syncputchars.o
+thread.o
+timerintr.o
+virtualtophysical.o
+yieldthread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+initrdb.o
+rdbsend.o
+getmemsize.o
+error.o
+seterrorhandler.o
+assert.o
+exit.o
+profile.o
+readhost.o
+testhost.o
+writehost.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+color.o
+clearattribute.o
+hide.o
+spscale.o
+setattribute.o
+show.o
+sprite.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+crc.o
+contramread.o
+contramwrite.o
+contpfs.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+motor.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+leodiskinit.o
+leointerrupt.o
+driverominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+giorawinterrupt.o
+giointerrupt.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+sched.o
diff --git a/lib/ultralib/base/I/libgultra_rom.txt b/lib/ultralib/base/I/libgultra_rom.txt
new file mode 100644
index 0000000..315e830
--- /dev/null
+++ b/lib/ultralib/base/I/libgultra_rom.txt
@@ -0,0 +1,404 @@
+gt.o
+dumpturbo.o
+sqrtf.o
+libm_vals.o
+align.o
+cosf.o
+coss.o
+frustum.o
+lookat.o
+lookatref.o
+lookathil.o
+lookatstereo.o
+mtxutil.o
+mtxcatf.o
+mtxcatl.o
+normalize.o
+ortho.o
+perspective.o
+rotate.o
+rotaterpy.o
+scale.o
+sinf.o
+sins.o
+translate.o
+loadtextureblockmipmap.o
+guloadtile_bug.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+usprite.o
+us2dex.o
+us2dex_emu.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+exceptasm.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+getintmask.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+invaldcache.o
+invalicache.o
+interrupt.o
+maptlb.o
+parameters.o
+probetlb.o
+setintmask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+unmaptlb.o
+unmaptlball.o
+writebackdcache.o
+writebackdcacheall.o
+maptlbrdb.o
+errorasm.o
+assertbreak.o
+atomic.o
+createmesgqueue.o
+createthread.o
+destroythread.o
+getactivequeue.o
+getthreadid.o
+getthreadpri.o
+gettime.o
+initialize.o
+jammesg.o
+kdebugserver.o
+physicaltovirtual.o
+recvmesg.o
+resetglobalintmask.o
+sendmesg.o
+seteventmesg.o
+setglobalintmask.o
+sethwinterrupt.o
+setthreadpri.o
+settime.o
+settimer.o
+startthread.o
+stopthread.o
+stoptimer.o
+syncputchars.o
+thread.o
+timerintr.o
+virtualtophysical.o
+yieldthread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+initrdb.o
+rdbsend.o
+getmemsize.o
+error.o
+seterrorhandler.o
+assert.o
+exit.o
+profile.o
+readhost.o
+testhost.o
+writehost.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+color.o
+clearattribute.o
+hide.o
+spscale.o
+setattribute.o
+show.o
+sprite.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+crc.o
+contramread.o
+contramwrite.o
+contpfs.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+motor.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+leodiskinit.o
+leointerrupt.o
+driverominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+giorawinterrupt.o
+giointerrupt.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+sched.o
diff --git a/lib/ultralib/base/I/libultra.txt b/lib/ultralib/base/I/libultra.txt
new file mode 100644
index 0000000..bb17631
--- /dev/null
+++ b/lib/ultralib/base/I/libultra.txt
@@ -0,0 +1,400 @@
+gt.o
+dumpturbo.o
+sqrtf.o
+libm_vals.o
+align.o
+cosf.o
+coss.o
+frustum.o
+lookat.o
+lookatref.o
+lookathil.o
+lookatstereo.o
+mtxutil.o
+mtxcatf.o
+mtxcatl.o
+normalize.o
+ortho.o
+perspective.o
+rotate.o
+rotateRPY.o
+scale.o
+sinf.o
+sins.o
+translate.o
+loadtextureblockmipmap.o
+guLoadTile_bug.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+usprite.o
+us2dex.o
+us2dex_emu.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+exceptasm.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+getintmask.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+invaldcache.o
+invalicache.o
+interrupt.o
+maptlb.o
+parameters.o
+probetlb.o
+setintmask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+unmaptlb.o
+unmaptlball.o
+writebackdcache.o
+writebackdcacheall.o
+maptlbrdb.o
+assertbreak.o
+atomic.o
+createmesgqueue.o
+createthread.o
+destroythread.o
+getactivequeue.o
+getthreadid.o
+getthreadpri.o
+gettime.o
+initialize.o
+jammesg.o
+kdebugserver.o
+physicaltovirtual.o
+recvmesg.o
+resetglobalintmask.o
+sendmesg.o
+seteventmesg.o
+setglobalintmask.o
+sethwinterrupt.o
+setthreadpri.o
+settime.o
+settimer.o
+startthread.o
+stopthread.o
+stoptimer.o
+syncputchars.o
+thread.o
+timerintr.o
+virtualtophysical.o
+yieldthread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+initrdb.o
+rdbsend.o
+getmemsize.o
+exit.o
+profile.o
+readhost.o
+testhost.o
+writehost.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+color.o
+clearattribute.o
+hide.o
+spscale.o
+setattribute.o
+show.o
+sprite.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+crc.o
+contramread.o
+contramwrite.o
+contpfs.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+motor.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+leodiskinit.o
+leointerrupt.o
+driverominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+giorawinterrupt.o
+giointerrupt.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+sched.o
diff --git a/lib/ultralib/base/I/libultra_d.txt b/lib/ultralib/base/I/libultra_d.txt
new file mode 100644
index 0000000..934ef45
--- /dev/null
+++ b/lib/ultralib/base/I/libultra_d.txt
@@ -0,0 +1,404 @@
+gt.o
+dumpturbo.o
+sqrtf.o
+libm_vals.o
+align.o
+cosf.o
+coss.o
+frustum.o
+lookat.o
+lookatref.o
+lookathil.o
+lookatstereo.o
+mtxutil.o
+mtxcatf.o
+mtxcatl.o
+normalize.o
+ortho.o
+perspective.o
+rotate.o
+rotateRPY.o
+scale.o
+sinf.o
+sins.o
+translate.o
+loadtextureblockmipmap.o
+guLoadTile_bug.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+usprite.o
+us2dex.o
+us2dex_emu.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+exceptasm.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+getintmask.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+invaldcache.o
+invalicache.o
+interrupt.o
+maptlb.o
+parameters.o
+probetlb.o
+setintmask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+unmaptlb.o
+unmaptlball.o
+writebackdcache.o
+writebackdcacheall.o
+maptlbrdb.o
+errorasm.o
+assertbreak.o
+atomic.o
+createmesgqueue.o
+createthread.o
+destroythread.o
+getactivequeue.o
+getthreadid.o
+getthreadpri.o
+gettime.o
+initialize.o
+jammesg.o
+kdebugserver.o
+physicaltovirtual.o
+recvmesg.o
+resetglobalintmask.o
+sendmesg.o
+seteventmesg.o
+setglobalintmask.o
+sethwinterrupt.o
+setthreadpri.o
+settime.o
+settimer.o
+startthread.o
+stopthread.o
+stoptimer.o
+syncputchars.o
+thread.o
+timerintr.o
+virtualtophysical.o
+yieldthread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+initrdb.o
+rdbsend.o
+getmemsize.o
+error.o
+seterrorhandler.o
+assert.o
+exit.o
+profile.o
+readhost.o
+testhost.o
+writehost.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+color.o
+clearattribute.o
+hide.o
+spscale.o
+setattribute.o
+show.o
+sprite.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+crc.o
+contramread.o
+contramwrite.o
+contpfs.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+motor.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+leodiskinit.o
+leointerrupt.o
+driverominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+giorawinterrupt.o
+giointerrupt.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+sched.o
diff --git a/lib/ultralib/base/I/libultra_rom.txt b/lib/ultralib/base/I/libultra_rom.txt
new file mode 100644
index 0000000..c879d12
--- /dev/null
+++ b/lib/ultralib/base/I/libultra_rom.txt
@@ -0,0 +1,370 @@
+gt.o
+sqrtf.o
+libm_vals.o
+align.o
+cosf.o
+coss.o
+frustum.o
+lookat.o
+lookatref.o
+lookathil.o
+lookatstereo.o
+mtxutil.o
+mtxcatf.o
+mtxcatl.o
+normalize.o
+ortho.o
+perspective.o
+rotate.o
+rotateRPY.o
+scale.o
+sinf.o
+sins.o
+translate.o
+loadtextureblockmipmap.o
+guLoadTile_bug.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+usprite.o
+us2dex.o
+us2dex_emu.o
+exceptasm.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+getintmask.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+invaldcache.o
+invalicache.o
+interrupt.o
+maptlb.o
+parameters.o
+probetlb.o
+setintmask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+unmaptlb.o
+unmaptlball.o
+writebackdcache.o
+writebackdcacheall.o
+maptlbrdb.o
+atomic.o
+createmesgqueue.o
+createthread.o
+destroythread.o
+getactivequeue.o
+getthreadid.o
+getthreadpri.o
+gettime.o
+initialize.o
+jammesg.o
+kdebugserver.o
+physicaltovirtual.o
+recvmesg.o
+resetglobalintmask.o
+sendmesg.o
+seteventmesg.o
+setglobalintmask.o
+sethwinterrupt.o
+setthreadpri.o
+settime.o
+settimer.o
+startthread.o
+stopthread.o
+stoptimer.o
+syncputchars.o
+thread.o
+timerintr.o
+virtualtophysical.o
+yieldthread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+initrdb.o
+rdbsend.o
+getmemsize.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+color.o
+clearattribute.o
+hide.o
+spscale.o
+setattribute.o
+show.o
+sprite.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+crc.o
+contramread.o
+contramwrite.o
+contpfs.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+motor.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+leodiskinit.o
+leointerrupt.o
+driverominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+sched.o
diff --git a/lib/ultralib/base/J/libgultra.txt b/lib/ultralib/base/J/libgultra.txt
new file mode 100644
index 0000000..575ae94
--- /dev/null
+++ b/lib/ultralib/base/J/libgultra.txt
@@ -0,0 +1,446 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+profile.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+mtxcatf.o
+mtxcatl.o
+mtxutil.o
+normalize.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotate.o
+rotaterpy.o
+scale.o
+sinf.o
+sins.o
+translate.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+exit.o
diff --git a/lib/ultralib/base/J/libgultra_d.txt b/lib/ultralib/base/J/libgultra_d.txt
new file mode 100644
index 0000000..a25743c
--- /dev/null
+++ b/lib/ultralib/base/J/libgultra_d.txt
@@ -0,0 +1,451 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+errorasm.o
+getcurrfaultthread.o
+getnextfaultthread.o
+error.o
+seterrorhandler.o
+kmcprintf.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+mtxcatf.o
+mtxcatl.o
+mtxutil.o
+normalize.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotate.o
+rotaterpy.o
+scale.o
+sinf.o
+sins.o
+translate.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+exit.o
diff --git a/lib/ultralib/base/J/libgultra_rom.txt b/lib/ultralib/base/J/libgultra_rom.txt
new file mode 100644
index 0000000..7fcf23e
--- /dev/null
+++ b/lib/ultralib/base/J/libgultra_rom.txt
@@ -0,0 +1,416 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+gt.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+mtxcatf.o
+mtxcatl.o
+mtxutil.o
+normalize.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotate.o
+rotaterpy.o
+scale.o
+sinf.o
+sins.o
+translate.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+rdbsend.o
+initrdb.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
diff --git a/lib/ultralib/base/J/libultra.txt b/lib/ultralib/base/J/libultra.txt
new file mode 100644
index 0000000..ba8bbc2
--- /dev/null
+++ b/lib/ultralib/base/J/libultra.txt
@@ -0,0 +1,446 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+profile.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+mtxcatf.o
+mtxcatl.o
+mtxutil.o
+normalize.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotate.o
+rotateRPY.o
+scale.o
+sinf.o
+sins.o
+translate.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+exit.o
diff --git a/lib/ultralib/base/J/libultra_d.txt b/lib/ultralib/base/J/libultra_d.txt
new file mode 100644
index 0000000..0b357b4
--- /dev/null
+++ b/lib/ultralib/base/J/libultra_d.txt
@@ -0,0 +1,451 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+mtxcatf.o
+mtxcatl.o
+mtxutil.o
+normalize.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotate.o
+rotateRPY.o
+scale.o
+sinf.o
+sins.o
+translate.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+errorasm.o
+getcurrfaultthread.o
+getnextfaultthread.o
+error.o
+seterrorhandler.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+exit.o
+kmcprintf.o
diff --git a/lib/ultralib/base/J/libultra_rom.txt b/lib/ultralib/base/J/libultra_rom.txt
new file mode 100644
index 0000000..73da3e3
--- /dev/null
+++ b/lib/ultralib/base/J/libultra_rom.txt
@@ -0,0 +1,418 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+mtxcatf.o
+mtxcatl.o
+mtxutil.o
+normalize.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotate.o
+rotateRPY.o
+scale.o
+sinf.o
+sins.o
+translate.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+rdbsend.o
+initrdb.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
diff --git a/lib/ultralib/base/K/libgultra.txt b/lib/ultralib/base/K/libgultra.txt
new file mode 100644
index 0000000..7814487
--- /dev/null
+++ b/lib/ultralib/base/K/libgultra.txt
@@ -0,0 +1,468 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotaterpy.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+initialize_isv.o
+monutil.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/K/libgultra_d.txt b/lib/ultralib/base/K/libgultra_d.txt
new file mode 100644
index 0000000..0a78430
--- /dev/null
+++ b/lib/ultralib/base/K/libgultra_d.txt
@@ -0,0 +1,471 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+errorasm.o
+getcurrfaultthread.o
+getnextfaultthread.o
+seterrorhandler.o
+commonerror.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotaterpy.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+initialize_isv.o
+monutil.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/K/libgultra_rom.txt b/lib/ultralib/base/K/libgultra_rom.txt
new file mode 100644
index 0000000..67e702e
--- /dev/null
+++ b/lib/ultralib/base/K/libgultra_rom.txt
@@ -0,0 +1,425 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+gt.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotaterpy.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+rdbsend.o
+initrdb.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
diff --git a/lib/ultralib/base/K/libultra.txt b/lib/ultralib/base/K/libultra.txt
new file mode 100644
index 0000000..4048e29
--- /dev/null
+++ b/lib/ultralib/base/K/libultra.txt
@@ -0,0 +1,468 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotateRPY.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+initialize_isv.o
+monutil.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/K/libultra_d.txt b/lib/ultralib/base/K/libultra_d.txt
new file mode 100644
index 0000000..3a171d0
--- /dev/null
+++ b/lib/ultralib/base/K/libultra_d.txt
@@ -0,0 +1,471 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotateRPY.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+initialize_isv.o
+monutil.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+errorasm.o
+getcurrfaultthread.o
+getnextfaultthread.o
+seterrorhandler.o
+commonerror.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/K/libultra_rom.txt b/lib/ultralib/base/K/libultra_rom.txt
new file mode 100644
index 0000000..d890186
--- /dev/null
+++ b/lib/ultralib/base/K/libultra_rom.txt
@@ -0,0 +1,427 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotateRPY.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+rdbsend.o
+initrdb.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
diff --git a/lib/ultralib/base/L/libgultra.txt b/lib/ultralib/base/L/libgultra.txt
new file mode 100644
index 0000000..b4fc977
--- /dev/null
+++ b/lib/ultralib/base/L/libgultra.txt
@@ -0,0 +1,483 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+flashgetaddr.o
+flashreinit.o
+flashchange.o
+flashinit.o
+flashreadstatus.o
+flashreadid.o
+flashclearstatus.o
+flashallerase.o
+flashallerasethrough.o
+flashcheckeraseend.o
+flashsectorerase.o
+flashsectorerasethrough.o
+flashwritebuffer.o
+flashwritearray.o
+flashreadarray.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotaterpy.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+initialize_isv.o
+monutil.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/L/libgultra_d.txt b/lib/ultralib/base/L/libgultra_d.txt
new file mode 100644
index 0000000..78c619e
--- /dev/null
+++ b/lib/ultralib/base/L/libgultra_d.txt
@@ -0,0 +1,486 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+errorasm.o
+getcurrfaultthread.o
+getnextfaultthread.o
+seterrorhandler.o
+commonerror.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+flashgetaddr.o
+flashreinit.o
+flashchange.o
+flashinit.o
+flashreadstatus.o
+flashreadid.o
+flashclearstatus.o
+flashallerase.o
+flashallerasethrough.o
+flashcheckeraseend.o
+flashsectorerase.o
+flashsectorerasethrough.o
+flashwritebuffer.o
+flashwritearray.o
+flashreadarray.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotaterpy.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+initialize_isv.o
+monutil.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/L/libgultra_rom.txt b/lib/ultralib/base/L/libgultra_rom.txt
new file mode 100644
index 0000000..4e1e0b7
--- /dev/null
+++ b/lib/ultralib/base/L/libgultra_rom.txt
@@ -0,0 +1,440 @@
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+flashgetaddr.o
+flashreinit.o
+flashchange.o
+flashinit.o
+flashreadstatus.o
+flashreadid.o
+flashclearstatus.o
+flashallerase.o
+flashallerasethrough.o
+flashcheckeraseend.o
+flashsectorerase.o
+flashsectorerasethrough.o
+flashwritebuffer.o
+flashwritearray.o
+flashreadarray.o
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrnew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+gt.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guloadtile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotaterpy.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+rdbsend.o
+initrdb.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteex.o
+spriteex2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
diff --git a/lib/ultralib/base/L/libultra.txt b/lib/ultralib/base/L/libultra.txt
new file mode 100644
index 0000000..ce952e2
--- /dev/null
+++ b/lib/ultralib/base/L/libultra.txt
@@ -0,0 +1,483 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotateRPY.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+initialize_isv.o
+monutil.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+flashgetaddr.o
+flashreinit.o
+flashchange.o
+flashinit.o
+flashreadstatus.o
+flashreadid.o
+flashclearstatus.o
+flashallerase.o
+flashallerasethrough.o
+flashcheckeraseend.o
+flashsectorerase.o
+flashsectorerasethrough.o
+flashwritebuffer.o
+flashwritearray.o
+flashreadarray.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/L/libultra_d.txt b/lib/ultralib/base/L/libultra_d.txt
new file mode 100644
index 0000000..ca76eda
--- /dev/null
+++ b/lib/ultralib/base/L/libultra_d.txt
@@ -0,0 +1,486 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+assertbreak.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+assert.o
+profile.o
+threadprofile.o
+threadprofileclear.o
+threadprofileinit.o
+threadprofilereadcount.o
+threadprofilereadtime.o
+threadprofilestart.o
+threadprofilestop.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+dumpturbo.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotateRPY.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+parse_rdp.o
+parse_gbi.o
+dump_gbi.o
+parse_string.o
+rdbsend.o
+initrdb.o
+ackramromread.o
+ackramromwrite.o
+host_ptn64.o
+readhost.o
+testhost.o
+writehost.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+delay.o
+log.o
+logfloat.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+printregion.o
+rmonrcp.o
+rmonbrk.o
+rmoncmds.o
+rmonmem.o
+rmonmisc.o
+rmonprint.o
+rmonregs.o
+rmontask.o
+rmonmain.o
+rmonsio.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+initialize_isv.o
+monutil.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+errorasm.o
+getcurrfaultthread.o
+getnextfaultthread.o
+seterrorhandler.o
+commonerror.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+flashgetaddr.o
+flashreinit.o
+flashchange.o
+flashinit.o
+flashreadstatus.o
+flashreadid.o
+flashclearstatus.o
+flashallerase.o
+flashallerasethrough.o
+flashcheckeraseend.o
+flashsectorerase.o
+flashsectorerasethrough.o
+flashwritebuffer.o
+flashwritearray.o
+flashreadarray.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
+initialize_kmc.o
+initialize_msp.o
+initialize_emu.o
+exit.o
diff --git a/lib/ultralib/base/L/libultra_rom.txt b/lib/ultralib/base/L/libultra_rom.txt
new file mode 100644
index 0000000..065ef27
--- /dev/null
+++ b/lib/ultralib/base/L/libultra_rom.txt
@@ -0,0 +1,442 @@
+ai.o
+aigetlen.o
+aigetstat.o
+aisetfreq.o
+aisetnextbuf.o
+drvrNew.o
+load.o
+auxbus.o
+bnkf.o
+env.o
+event.o
+filter.o
+mainbus.o
+resample.o
+reverb.o
+save.o
+seq.o
+sl.o
+heapcheck.o
+heapinit.o
+heapalloc.o
+copy.o
+seqpdelete.o
+seqpgetfxmix.o
+seqpgetpan.o
+seqpgetchlvol.o
+seqpgetpriority.o
+seqpgetprogram.o
+seqpgetseq.o
+seqpgettempo.o
+seqpgetvol.o
+seqpgetstate.o
+seqploop.o
+seqpplay.o
+seqpsendmidi.o
+seqpsetbank.o
+seqpsetfxmix.o
+seqpsetpan.o
+seqpsetchlvol.o
+seqpsetpriority.o
+seqpsetprogram.o
+seqpsetseq.o
+seqpsettempo.o
+seqpsetvol.o
+seqpstop.o
+seqplayer.o
+cseq.o
+cspdelete.o
+cspgetfxmix.o
+cspgetpan.o
+cspgetchlvol.o
+cspgetpriority.o
+cspgetprogram.o
+cspgetseq.o
+cspgettempo.o
+cspgetvol.o
+cspgetstate.o
+cspplay.o
+cspsendmidi.o
+cspsetbank.o
+cspsetfxmix.o
+cspsetpan.o
+cspsetchlvol.o
+cspsetpriority.o
+cspsetprogram.o
+cspsetseq.o
+cspsettempo.o
+cspsetvol.o
+cspstop.o
+csplayer.o
+sndplayer.o
+sndpdelete.o
+sndpallocate.o
+sndpdeallocate.o
+sndpsetsound.o
+sndpplay.o
+sndpplayat.o
+sndpgetsound.o
+sndpstop.o
+sndpgetstate.o
+sndpsetpitch.o
+sndpsetpriority.o
+sndpsetvol.o
+sndpsetpan.o
+sndpsetfxmix.o
+synthesizer.o
+syndelete.o
+synaddplayer.o
+synremoveplayer.o
+synfreevoice.o
+synallocvoice.o
+synstopvoice.o
+synstartvoice.o
+synstartvoiceparam.o
+synsetpitch.o
+synsetvol.o
+synsetfxmix.o
+synsetpan.o
+syngetpriority.o
+synsetpriority.o
+synallocfx.o
+synfreefx.o
+syngetfxref.o
+synsetfxparam.o
+cents2ratio.o
+parse_abi.o
+invaldcache.o
+invalicache.o
+writebackdcache.o
+writebackdcacheall.o
+contquery.o
+contreaddata.o
+contreset.o
+controller.o
+contsetch.o
+physicaltovirtual.o
+virtualtophysical.o
+atomic.o
+kdebugserver.o
+syncputchars.o
+giorawinterrupt.o
+giointerrupt.o
+gt.o
+libm_vals.o
+sqrtf.o
+align.o
+cosf.o
+coss.o
+frustum.o
+guLoadTile_bug.o
+loadtextureblockmipmap.o
+lookat.o
+lookathil.o
+lookatref.o
+lookatstereo.o
+ortho.o
+perspective.o
+position.o
+poslight.o
+poslighthil.o
+random.o
+rotateRPY.o
+sinf.o
+sins.o
+us2dex.o
+us2dex_emu.o
+us2dex2_emu.o
+usprite.o
+rdbsend.o
+initrdb.o
+bcmp.o
+bcopy.o
+bzero.o
+ll.o
+llcvt.o
+string.o
+ldiv.o
+llbit.o
+xlitob.o
+xldtob.o
+xprintf.o
+sprintf.o
+syncprintf.o
+createmesgqueue.o
+jammesg.o
+recvmesg.o
+sendmesg.o
+seteventmesg.o
+dp.o
+dpgetstat.o
+dpsetstat.o
+dpsetnextbuf.o
+dpctr.o
+getcause.o
+getcompare.o
+getconfig.o
+getcount.o
+getfpccsr.o
+getsr.o
+gettlbasid.o
+gettlbhi.o
+gettlblo0.o
+gettlblo1.o
+gettlbpagemask.o
+setcause.o
+setcompare.o
+setconfig.o
+setcount.o
+setfpccsr.o
+setsr.o
+settlbasid.o
+getwatchlo.o
+setwatchlo.o
+region.o
+malloc.o
+free.o
+getbufcount.o
+getsize.o
+sp.o
+spgetstat.o
+spsetstat.o
+spsetpc.o
+sprawread.o
+sprawwrite.o
+sprawdma.o
+sptask.o
+sptaskyield.o
+sptaskyielded.o
+sched.o
+si.o
+sigetstat.o
+sirawread.o
+sirawwrite.o
+sirawdma.o
+siacs.o
+crc.o
+clearattribute.o
+color.o
+hide.o
+setattribute.o
+show.o
+sprite.o
+spriteEX.o
+spriteEX2.o
+spscale.o
+createthread.o
+destroythread.o
+getthreadid.o
+getthreadpri.o
+setthreadpri.o
+startthread.o
+stopthread.o
+thread.o
+yieldthread.o
+getactivequeue.o
+gettime.o
+settime.o
+settimer.o
+stoptimer.o
+timerintr.o
+maptlb.o
+probetlb.o
+maptlbrdb.o
+unmaptlb.o
+unmaptlball.o
+vi.o
+vigetcurrcontext.o
+vigetfield.o
+vigetcurrframebuf.o
+vigetnextframebuf.o
+vigetline.o
+vigetmode.o
+vigetnextcontext.o
+vigetstat.o
+vimgr.o
+visetevent.o
+visetmode.o
+visetspecial.o
+visetxscale.o
+visetyscale.o
+viswapbuf.o
+viswapcontext.o
+vitbl.o
+viblack.o
+virepeatline.o
+vifade.o
+viextendvstart.o
+vimodentsclpn1.o
+vimodentsclpf1.o
+vimodentsclan1.o
+vimodentsclaf1.o
+vimodentsclpn2.o
+vimodentsclpf2.o
+vimodentsclan2.o
+vimodentsclaf2.o
+vimodentschpn1.o
+vimodentschpf1.o
+vimodentschan1.o
+vimodentschaf1.o
+vimodentschpn2.o
+vimodentschpf2.o
+vimodepallpn1.o
+vimodepallpf1.o
+vimodepallan1.o
+vimodepallaf1.o
+vimodepallpn2.o
+vimodepallpf2.o
+vimodepallan2.o
+vimodepallaf2.o
+vimodepalhpn1.o
+vimodepalhpf1.o
+vimodepalhan1.o
+vimodepalhaf1.o
+vimodepalhpn2.o
+vimodepalhpf2.o
+vimodempallpn1.o
+vimodempallpf1.o
+vimodempallan1.o
+vimodempallaf1.o
+vimodempallpn2.o
+vimodempallpf2.o
+vimodempallan2.o
+vimodempallaf2.o
+vimodempalhpn1.o
+vimodempalhpf1.o
+vimodempalhan1.o
+vimodempalhaf1.o
+vimodempalhpn2.o
+vimodempalhpf2.o
+vimodefpallpn1.o
+vimodefpallpf1.o
+vimodefpallan1.o
+vimodefpallaf1.o
+vimodefpallpn2.o
+vimodefpallpf2.o
+vimodefpallan2.o
+vimodefpallaf2.o
+vimodefpalhpn1.o
+vimodefpalhpf1.o
+vimodefpalhan1.o
+vimodefpalhaf1.o
+vimodefpalhpn2.o
+vimodefpalhpf2.o
+mtxident.o
+mtxidentf.o
+mtxf2l.o
+mtxl2f.o
+mtxcatf.o
+scale.o
+scalef.o
+normalize.o
+translate.o
+translatef.o
+mtxcatl.o
+mtxxfml.o
+mtxxfmf.o
+rotate.o
+conteepread.o
+conteepwrite.o
+conteepprobe.o
+conteeplongwrite.o
+conteeplongread.o
+getcurrfaultthread.o
+getnextfaultthread.o
+exceptasm.o
+interrupt.o
+setintmask.o
+getintmask.o
+sethwinterrupt.o
+gethwinterrupt.o
+setpiinterrupt.o
+setglobalintmask.o
+resetglobalintmask.o
+pi.o
+pigettype.o
+pigetstat.o
+pirawread.o
+pirawwrite.o
+pirawdma.o
+pigetcmdq.o
+pimgr.o
+epirawread.o
+epirawwrite.o
+epirawdma.o
+epiwrite.o
+epiread.o
+epidma.o
+epigettype.o
+epilinkhandle.o
+cartrominit.o
+devmgr.o
+piacs.o
+piwrite.o
+piread.o
+pidma.o
+voicecontrolgain.o
+voiceinit.o
+voicecheckresult.o
+voicecontwrite20.o
+voicemaskdictionary.o
+voicecheckword.o
+voicecontwrite4.o
+voicesetadconverter.o
+voicecleardictionary.o
+voicecrc.o
+voicesetword.o
+voicecontread2.o
+voicegetreaddata.o
+voicestartreaddata.o
+voicecontread36.o
+voicegetstatus.o
+voicestopreaddata.o
+voicecountsyllables.o
+contchannelreset.o
+flashgetaddr.o
+flashreinit.o
+flashchange.o
+flashinit.o
+flashreadstatus.o
+flashreadid.o
+flashclearstatus.o
+flashallerase.o
+flashallerasethrough.o
+flashcheckeraseend.o
+flashsectorerase.o
+flashsectorerasethrough.o
+flashwritebuffer.o
+flashwritearray.o
+flashreadarray.o
+gbpakinit.o
+gbpakgetstatus.o
+gbpaksetbank.o
+gbpakgetbank.o
+gbpakpower.o
+gbpakreadwrite.o
+gbpakreadid.o
+gbpakcheckconnector.o
+motor.o
+pfsreformat.o
+pfschecker.o
+pfsinit.o
+pfsallocatefile.o
+pfsdeletefile.o
+pfsreadwritefile.o
+pfsfilestate.o
+pfssearchfile.o
+pfssetlabel.o
+pfsgetlabel.o
+pfsisplug.o
+pfsfreeblocks.o
+pfsnumfiles.o
+pfsinitpak.o
+pfsrepairid.o
+pfsgetstatus.o
+pfsselectbank.o
+contpfs.o
+contramread.o
+contramwrite.o
+parameters.o
+afterprenmi.o
+getmemsize.o
+initialize.o
diff --git a/lib/ultralib/include/PR/gu.h b/lib/ultralib/include/PR/gu.h
index aa83ba0..9a2fa2b 100644
--- a/lib/ultralib/include/PR/gu.h
+++ b/lib/ultralib/include/PR/gu.h
@@ -24,6 +24,7 @@
#include <PR/mbi.h>
#include <PR/ultratypes.h>
#include <PR/sptask.h>
+#include <PR/os_version.h>
#ifndef MAX
#define MAX(a,b) (((a)>(b))?(a):(b))
@@ -192,7 +193,7 @@ extern float cosf(float angle);
extern signed short sins (unsigned short angle);
extern signed short coss (unsigned short angle);
extern float sqrtf(float value);
-#ifdef __sgi
+#if defined(__sgi) && BUILD_VERSION >= VERSION_K
#pragma intrinsic(sqrtf);
#endif
diff --git a/lib/ultralib/include/PR/os_host.h b/lib/ultralib/include/PR/os_host.h
index 0cc1ae5..3192f6a 100644
--- a/lib/ultralib/include/PR/os_host.h
+++ b/lib/ultralib/include/PR/os_host.h
@@ -35,6 +35,7 @@ extern "C" {
#endif
#include <PR/ultratypes.h>
+#include <PR/os_version.h>
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
@@ -126,6 +127,10 @@ extern void __osInitialize_emu(void);
#endif /* _FINAL_ROM */
+#if BUILD_VERSION < VERSION_K
+#undef osInitialize
+#endif
+
/**************************************************************************
*
* Extern variables
diff --git a/lib/ultralib/include/PR/os_internal_exception.h b/lib/ultralib/include/PR/os_internal_exception.h
index 2484903..dae8a9f 100644
--- a/lib/ultralib/include/PR/os_internal_exception.h
+++ b/lib/ultralib/include/PR/os_internal_exception.h
@@ -26,14 +26,22 @@ extern "C" {
#endif
#include "os.h"
+#include "os_version.h"
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
/* Routine for HW interrupt "handler" */
+#if BUILD_VERSION >= VERSION_J
extern void __osSetHWIntrRoutine(OSHWIntr interrupt,
s32 (*handler)(void), void *stackEnd);
extern void __osGetHWIntrRoutine(OSHWIntr interrupt,
s32 (**handler)(void), void **stackEnd);
+#else
+extern void __osSetHWIntrRoutine(OSHWIntr interrupt,
+ s32 (*handler)(void));
+extern void __osGetHWIntrRoutine(OSHWIntr interrupt,
+ s32 (**handler)(void));
+#endif
/* Routine for global interrupt mask */
extern void __osSetGlobalIntMask(OSHWIntr);
diff --git a/lib/ultralib/include/PR/os_motor.h b/lib/ultralib/include/PR/os_motor.h
index f8dcbd5..2edb8e6 100644
--- a/lib/ultralib/include/PR/os_motor.h
+++ b/lib/ultralib/include/PR/os_motor.h
@@ -17,6 +17,7 @@ extern "C" {
#include <PR/ultratypes.h>
#include "os_message.h"
#include "os_pfs.h"
+#include "os_version.h"
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
@@ -62,7 +63,7 @@ extern "C" {
/* Rumble PAK interface */
extern s32 osMotorInit(OSMesgQueue *, OSPfs *, int);
-#if 1
+#if BUILD_VERSION >= VERSION_J
#define MOTOR_START 1
#define MOTOR_STOP 0
#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
diff --git a/lib/ultralib/include/PR/os_version.h b/lib/ultralib/include/PR/os_version.h
index c485a43..aa10d20 100644
--- a/lib/ultralib/include/PR/os_version.h
+++ b/lib/ultralib/include/PR/os_version.h
@@ -10,7 +10,17 @@
#ifndef _OS_VERSION_H_
#define _OS_VERSION_H_
-#define OS_MAJOR_VERSION "2.0K" /* major version */
-#define OS_MINOR_VERSION 0 /* patch level */
+#define VERSION_D 1
+#define VERSION_E 2
+#define VERSION_F 3
+#define VERSION_G 4
+#define VERSION_H 5
+#define VERSION_I 6
+#define VERSION_J 7
+#define VERSION_K 8
+#define VERSION_L 9
+
+#define OS_MAJOR_VERSION BUILD_VERSION_STRING /* major version */
+#define OS_MINOR_VERSION 0 /* patch level */
#endif /* !_OS_VERSION_H_ */
diff --git a/lib/ultralib/include/gcc/sgidefs.h b/lib/ultralib/include/gcc/sgidefs.h
new file mode 100644
index 0000000..56567e8
--- /dev/null
+++ b/lib/ultralib/include/gcc/sgidefs.h
@@ -0,0 +1,44 @@
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ralf Baechle <ralf@gnu.org>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _SGIDEFS_H
+#define _SGIDEFS_H 1
+
+/*
+ * Definitions for the ISA level
+ */
+#define _MIPS_ISA_MIPS1 1
+#define _MIPS_ISA_MIPS2 2
+#define _MIPS_ISA_MIPS3 3
+#define _MIPS_ISA_MIPS4 4
+#define _MIPS_ISA_MIPS5 5
+
+/*
+ * Subprogram calling convention
+ *
+ * At the moment only _MIPS_SIM_ABI32 is in use. This will change rsn.
+ * Until GCC 2.8.0 is released don't rely on this definitions because the
+ * 64bit code is essentially using the 32bit interface model just with
+ * 64bit registers.
+ */
+#define _MIPS_SIM_ABI32 1
+#define _MIPS_SIM_NABI32 2
+#define _MIPS_SIM_ABI64 3
+
+#endif /* sgidefs.h */
diff --git a/lib/ultralib/include/sgidefs.h b/lib/ultralib/include/sgidefs.h
index e69de29..8d4b6e1 100644
--- a/lib/ultralib/include/sgidefs.h
+++ b/lib/ultralib/include/sgidefs.h
@@ -0,0 +1,3 @@
+#ifdef __GNUC__
+#include "gcc/sgidefs.h"
+#endif
diff --git a/lib/ultralib/src/audio/csplayer.c b/lib/ultralib/src/audio/csplayer.c
index 66999f7..5cd3df6 100644
--- a/lib/ultralib/src/audio/csplayer.c
+++ b/lib/ultralib/src/audio/csplayer.c
@@ -81,9 +81,9 @@ void alCSPNew(ALCSPlayer *seqp, ALSeqpConfig *c)
seqp->initOsc = c->initOsc;
seqp->updateOsc = c->updateOsc;
seqp->stopOsc = c->stopOsc;
-
+
seqp->nextEvent.type = AL_SEQP_API_EVT; /* this will start the voice handler "spinning" */
-
+
/*
* init the channel state
*/
@@ -104,14 +104,13 @@ void alCSPNew(ALCSPlayer *seqp, ALSeqpConfig *c)
seqp->vAllocHead = 0;
seqp->vAllocTail = 0;
-
- /*
- * init the event queue
- */
+#if BUILD_VERSION < VERSION_J
+#line 109
+#endif
+ // init the event queue
items = alHeapAlloc(hp, c->maxEvents, sizeof(ALEventListItem));
alEvtqNew(&seqp->evtq, items, c->maxEvents);
-
/*
* add ourselves to the driver
*/
@@ -292,10 +291,10 @@ static ALMicroTime __CSPVoiceHandler(void *node)
break;
case (AL_SEQP_SEQ_EVT):
-
-#ifdef _DEBUG
- assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */
+#if BUILD_VERSION < VERSION_J
+#line 294
#endif
+ assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */
seqp->target = seqp->nextEvent.msg.spseq.seq;
__setUsptFromTempo (seqp, 500000.0);
@@ -304,10 +303,10 @@ static ALMicroTime __CSPVoiceHandler(void *node)
break;
case (AL_SEQP_BANK_EVT):
-
-#ifdef _DEBUG
- assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */
+#if BUILD_VERSION < VERSION_J
+#line 303
#endif
+ assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */
seqp->bank = seqp->nextEvent.msg.spbank.bank;
__initFromBank((ALSeqPlayer *)seqp, seqp->bank);
@@ -317,10 +316,10 @@ static ALMicroTime __CSPVoiceHandler(void *node)
case (AL_SEQ_END_EVT):
case (AL_TEMPO_EVT):
case (AL_SEQ_MIDI_EVT):
-
-#ifdef _DEBUG
- assert(FALSE);
+#if BUILD_VERSION < VERSION_J
+#line 313
#endif
+ assert(FALSE);
break;
}
@@ -407,16 +406,16 @@ __CSPHandleNextSeqEvent(ALCSPlayer *seqp)
break;
default:
-
-#ifdef _DEBUG
- assert(FALSE); /* Sequence event type not supported. */
+#if BUILD_VERSION < VERSION_J
+#line 399
#endif
-
+ assert(FALSE); /* Sequence event type not supported. */
+#if BUILD_VERSION >= VERSION_J
break;
+#endif
}
}
-
static void __CSPHandleMIDIMsg(ALCSPlayer *seqp, ALEvent *event)
{
ALVoice *voice;
@@ -723,10 +722,10 @@ static void __CSPHandleMIDIMsg(ALCSPlayer *seqp, ALEvent *event)
break;
case (AL_MIDI_ProgramChange):
/* sct 1/16/96 - We must have a valid bank in order to process the program change. */
-
-#ifdef _DEBUG
- assert(seqp->bank != NULL);
+#if BUILD_VERSION < VERSION_J
+#line 710
#endif
+ assert(seqp->bank != NULL);
if (key < seqp->bank->instCount)
{
diff --git a/lib/ultralib/src/audio/env.c b/lib/ultralib/src/audio/env.c
index 9a11e23..fda20f4 100644
--- a/lib/ultralib/src/audio/env.c
+++ b/lib/ultralib/src/audio/env.c
@@ -93,19 +93,19 @@ Acmd *alEnvmixerPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset,
*/
inp = AL_RESAMPLER_OUT;
- while (e->ctrlList != 0) {
-
+ while (e->ctrlList != 0) {
lastOffset = thisOffset;
thisOffset = e->ctrlList->delta;
samples = thisOffset - lastOffset;
if (samples > outCount)
break;
-
-#ifdef _DEBUG
+#if BUILD_VERSION < VERSION_J
+#line 103
+#endif
assert(samples >= 0);
assert(samples <= AL_MAX_RSP_SAMPLES);
-#endif
-
+
+
switch (e->ctrlList->type) {
case (AL_FILTER_START_VOICE_ALT):
{
@@ -307,8 +307,7 @@ Acmd *alEnvmixerPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset,
return ptr;
}
-s32
-alEnvmixerParam(void *filter, s32 paramID, void *param)
+s32 alEnvmixerParam(void *filter, s32 paramID, void *param)
{
ALFilter *f = (ALFilter *) filter;
ALEnvMixer *e = (ALEnvMixer *) filter;
@@ -349,9 +348,10 @@ alEnvmixerParam(void *filter, s32 paramID, void *param)
}
return 0;
}
-
-static
-Acmd* _pullSubFrame(void *filter, s16 *inp, s16 *outp, s32 outCount,
+#if BUILD_VERSION < VERSION_J
+#line 350
+#endif
+static Acmd* _pullSubFrame(void *filter, s16 *inp, s16 *outp, s32 outCount,
s32 sampleOffset, Acmd *p)
{
Acmd *ptr = p;
@@ -366,9 +366,9 @@ Acmd* _pullSubFrame(void *filter, s16 *inp, s16 *outp, s32 outCount,
* ask all filters upstream from us to build their command
* lists.
*/
-#ifdef _DEBUG
+
assert(source);
-#endif
+
ptr = (*source->handler)(source, inp, outCount, sampleOffset, p);
diff --git a/lib/ultralib/src/audio/event.c b/lib/ultralib/src/audio/event.c
index 531e17c..3112c99 100644
--- a/lib/ultralib/src/audio/event.c
+++ b/lib/ultralib/src/audio/event.c
@@ -59,7 +59,7 @@ ALMicroTime alEvtqNextEvent(ALEventQueue *evtq, ALEvent *evt)
{
/* sct 11/28/95 - If we get here, most like we overflowed the event queue */
/* with non-self-perpetuating events. Eg. if we filled the evtq with volume */
- /* events, then when the seqp is told to game_play it will handle all the events */
+ /* events, then when the seqp is told to play it will handle all the events */
/* at once completely emptying out the queue. At this point this problem */
/* must be treated as an out of resource error and the evtq should be increased. */
evt->type = -1;
diff --git a/lib/ultralib/src/audio/reverb.c b/lib/ultralib/src/audio/reverb.c
index 8558169..f5158c3 100644
--- a/lib/ultralib/src/audio/reverb.c
+++ b/lib/ultralib/src/audio/reverb.c
@@ -46,7 +46,6 @@ extern u32 load_num, load_cnt, load_max, load_min, save_num, save_cnt, save_max,
}
-
Acmd *_loadOutputBuffer(ALFx *r, ALDelay *d, s32 buff, s32 incount, Acmd *p);
Acmd *_loadBuffer(ALFx *r, s16 *curr_ptr, s32 buff, s32 count, Acmd *p);
Acmd *_saveBuffer(ALFx *r, s16 *curr_ptr, s32 buff, s32 count, Acmd *p);
@@ -71,10 +70,10 @@ Acmd *alFxPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset,
#ifdef AUD_PROFILE
lastCnt[++cnt_index] = osGetCount();
#endif
-
-#ifdef _DEBUG
- assert(source);
+#if BUILD_VERSION < VERSION_J
+#line 74
#endif
+ assert(source);
/*
* pull channels going into this effect first
diff --git a/lib/ultralib/src/audio/save.c b/lib/ultralib/src/audio/save.c
index ec6a0bf..59bd09b 100644
--- a/lib/ultralib/src/audio/save.c
+++ b/lib/ultralib/src/audio/save.c
@@ -25,15 +25,15 @@
Acmd *alSavePull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset,
Acmd *p)
-
{
Acmd *ptr = p;
ALSave *f = (ALSave *)filter;
ALFilter *source = f->filter.source;
-
-#ifdef _DEBUG
- assert(f->filter.source);
+#if BUILD_VERSION < VERSION_J
+#line 33
#endif
+ assert(f->filter.source);
+
ptr = (*source->handler)(source, outp, outCount, sampleOffset, ptr);
diff --git a/lib/ultralib/src/audio/seqpdelete.c b/lib/ultralib/src/audio/seqpdelete.c
index 8e283b1..142f190 100644
--- a/lib/ultralib/src/audio/seqpdelete.c
+++ b/lib/ultralib/src/audio/seqpdelete.c
@@ -17,22 +17,22 @@
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
* Copyright Laws of the United States.
*====================================================================*/
-
+#include <PR/os_version.h>
#include <libaudio.h>
#include <assert.h>
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
-
void alSeqpDelete(ALSeqPlayer *seqp)
{
/* sct 1/4/96 - If the sequence player isn't stopped, then you may end
up with stuck notes. Application should check state before calling
this routine to be sure. */
-
-#ifdef _DEBUG
- assert(seqp->state == AL_STOPPED);
+#if BUILD_VERSION < VERSION_J
+#line 31
#endif
+ assert(seqp->state == AL_STOPPED);
+
alSynRemovePlayer(seqp->drvr, &seqp->node);
}
diff --git a/lib/ultralib/src/audio/seqplayer.c b/lib/ultralib/src/audio/seqplayer.c
index a25d624..9d77a6f 100644
--- a/lib/ultralib/src/audio/seqplayer.c
+++ b/lib/ultralib/src/audio/seqplayer.c
@@ -291,25 +291,24 @@ ALMicroTime __seqpVoiceHandler(void *node)
chan = seqp->nextEvent.msg.sppriority.chan;
seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority;
break;
-
case (AL_SEQP_SEQ_EVT):
-
-#ifdef _DEBUG
- assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */
+#if BUILD_VERSION < VERSION_J // Adjust line numbers to match asserts
+#line 295
#endif
+ assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */
+
seqp->target = seqp->nextEvent.msg.spseq.seq;
__setUsptFromTempo (seqp, 500000.0);
if (seqp->bank)
__initFromBank(seqp, seqp->bank);
break;
-
case (AL_SEQP_BANK_EVT):
-
-#ifdef _DEBUG
- assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */
+#if BUILD_VERSION < VERSION_J
+#line 304
#endif
-
+ assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */
+
seqp->bank = seqp->nextEvent.msg.spbank.bank;
__initFromBank(seqp, seqp->bank);
break;
@@ -318,10 +317,11 @@ ALMicroTime __seqpVoiceHandler(void *node)
case (AL_SEQ_END_EVT):
case (AL_TEMPO_EVT):
case (AL_SEQ_MIDI_EVT):
-
-#ifdef _DEBUG
- assert(FALSE);
+#if BUILD_VERSION < VERSION_J
+#line 314
#endif
+ assert(FALSE);
+
break;
}
@@ -381,7 +381,6 @@ void __postNextSeqEvent(ALSeqPlayer *seqp)
alEvtqPostEvent(&seqp->evtq, &evt, deltaTicks * seqp->uspt);
}
-
/*
Call this routine to handle the next event in the sequence.
Assumes that the next sequence event is scheduled to be processed
@@ -419,16 +418,16 @@ __handleNextSeqEvent(ALSeqPlayer *seqp)
break;
default:
-
-#ifdef _DEBUG
- assert(FALSE); /* Sequence event type not supported. */
+#if BUILD_VERSION < VERSION_J
+#line 411
#endif
-
+ assert(FALSE); /* Sequence event type not supported. */
+#if BUILD_VERSION >= VERSION_J
break;
+#endif
}
}
-
void __handleMIDIMsg(ALSeqPlayer *seqp, ALEvent *event)
{
ALVoice *voice;
@@ -446,11 +445,12 @@ void __handleMIDIMsg(ALSeqPlayer *seqp, ALEvent *event)
ALVoiceState *vstate;
ALPan pan;
ALFxRef fxref;
-
-#ifdef _DEBUG
+#if BUILD_VERSION < VERSION_J
+#line 434
+#endif
/* sct 12/15/95 - Fixed assert to also allow seqp midi event types. */
assert(event->type == AL_SEQ_MIDI_EVT || event->type == AL_SEQP_MIDI_EVT);
-#endif
+
status = midi->status & AL_MIDI_StatusMask;
chan = midi->status & AL_MIDI_ChannelMask;
@@ -722,16 +722,16 @@ void __handleMIDIMsg(ALSeqPlayer *seqp, ALEvent *event)
case (AL_MIDI_FX3_CTRL):
default:
break;
-
}
break;
case (AL_MIDI_ProgramChange):
/* sct 1/16/96 - We must have a valid bank in order to process the program change. */
-
-#ifdef _DEBUG
- assert(seqp->bank != NULL);
+#if BUILD_VERSION < VERSION_J
+#line 713
#endif
+ assert(seqp->bank != NULL);
+
if (key < seqp->bank->instCount) {
ALInstrument *inst = seqp->bank->instArray[key];
@@ -873,7 +873,6 @@ ALVoiceState *__lookupVoice(ALSeqPlayer *seqp, u8 key, u8 channel)
return 0;
}
-
#if 0
ALSound *__lookupSound(ALSeqPlayer *seqp, u8 key, u8 vel, u8 chan)
{
@@ -902,10 +901,11 @@ ALSound *__lookupSoundQuick(ALSeqPlayer *seqp, u8 key, u8 vel, u8 chan)
s32 r = inst->soundCount;
s32 i;
ALKeyMap *keymap;
-
-#ifdef _DEBUG
- assert(inst != NULL); /* sct 10/31/95 - If inst is NULL, then the seqp probably wasn't setup correctly. */
+#if BUILD_VERSION < VERSION_J
+#line 885
#endif
+ assert(inst != NULL); /* sct 10/31/95 - If inst is NULL, then the seqp probably wasn't setup correctly. */
+
while (r >= l) {
i = (l+r)/2;
diff --git a/lib/ultralib/src/audio/sndp.h b/lib/ultralib/src/audio/sndp.h
index e21739d..17d7015 100644
--- a/lib/ultralib/src/audio/sndp.h
+++ b/lib/ultralib/src/audio/sndp.h
@@ -53,7 +53,7 @@ typedef struct {
ALSound *sound; /* sound referenced here */
s16 priority;
f32 pitch; /* current playback pitch */
- s32 state; /* game_play state for this sound */
+ s32 state; /* play state for this sound */
s16 vol; /* volume - combined with volume from bank */
ALPan pan; /* pan - 0 = left, 127 = right */
u8 fxMix; /* wet/dry mix - 0 = dry, 127 = wet */
diff --git a/lib/ultralib/src/audio/sndplayer.c b/lib/ultralib/src/audio/sndplayer.c
index 8f44b43..f2d7b56 100644
--- a/lib/ultralib/src/audio/sndplayer.c
+++ b/lib/ultralib/src/audio/sndplayer.c
@@ -80,7 +80,9 @@ ALMicroTime _sndpVoiceHandler(void *node)
switch (sndp->nextEvent.type) {
case (AL_SNDP_API_EVT):
evt.common.type = AL_SNDP_API_EVT;
- evt.common.state = (ALSoundState*)-1;
+#if BUILD_VERSION >= VERSION_K
+ evt.common.state = (ALSoundState*)-1;
+#endif
alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, sndp->frameTime);
break;
@@ -230,9 +232,7 @@ void _handleEvent(ALSndPlayer *sndp, ALSndpEvent *event)
break;
}
}
-
-static
-void _removeEvents(ALEventQueue *evtq, ALSoundState *state)
+static void _removeEvents(ALEventQueue *evtq, ALSoundState *state)
{
ALLink *thisNode;
ALLink *nextNode;
@@ -260,8 +260,6 @@ void _removeEvents(ALEventQueue *evtq, ALSoundState *state)
osSetIntMask(mask);
}
-
-
/*
This routine safely divides a signed 32-bit integer
by a floating point value. It avoids overflow by using
@@ -275,17 +273,18 @@ void _removeEvents(ALEventQueue *evtq, ALSoundState *state)
very small pitch ratios can cause the reult to overflow,
causing a floating point exception.
*/
-static
-s32 _DivS32ByF32 (s32 i, f32 f)
+#if BUILD_VERSION == VERSION_J // Adjust line numbers to match assert
+#line 277
+#elif BUILD_VERSION < VERSION_J
+#line 278
+#endif
+static s32 _DivS32ByF32 (s32 i, f32 f)
{
#define INT_MAX 2147483647 /* Should be in a limits.h file. */
-
f64 rd;
int ri;
-#ifdef _DEBUG
assert(f!=0); /* Caller must make sure we do not divide by zero! */
-#endif
rd = i/f; /* Store result as a double to avoid overflow. */
diff --git a/lib/ultralib/src/audio/synsetfxmix.c b/lib/ultralib/src/audio/synsetfxmix.c
index 8c156ab..c787103 100644
--- a/lib/ultralib/src/audio/synsetfxmix.c
+++ b/lib/ultralib/src/audio/synsetfxmix.c
@@ -39,9 +39,18 @@ void alSynSetFXMix(ALSynth *synth, ALVoice *v, u8 fxmix)
*/
update->delta = synth->paramSamples + v->pvoice->offset;
update->type = AL_FILTER_SET_FXAMT;
- if (fxmix > 127)
+#if BUILD_VERSION >= VERSION_J
+ if (fxmix > 127) {
fxmix = 127;
- update->data.i = fxmix;
+ }
+ update->data.i = fxmix;
+#else
+ if (fxmix < 0) { // Not possible
+ update->data.i = -fxmix;
+ } else {
+ update->data.i = fxmix;
+ }
+#endif
update->next = 0;
f = v->pvoice->channelKnob;
diff --git a/lib/ultralib/src/audio/synstartvoiceparam.c b/lib/ultralib/src/audio/synstartvoiceparam.c
index dbede0f..8d1a54b 100644
--- a/lib/ultralib/src/audio/synstartvoiceparam.c
+++ b/lib/ultralib/src/audio/synstartvoiceparam.c
@@ -23,6 +23,10 @@
#include <ultraerror.h>
#include <os_internal.h>
+#if BUILD_VERSION < VERSION_J
+#ident "$Revision: 1.17 $"
+#endif
+
void alSynStartVoiceParams(ALSynth *s, ALVoice *v, ALWaveTable *w,
f32 pitch, s16 vol, ALPan pan, u8 fxmix,
ALMicroTime t)
@@ -37,8 +41,15 @@ void alSynStartVoiceParams(ALSynth *s, ALVoice *v, ALWaveTable *w,
update = (ALStartParamAlt *)__allocParam();
ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE);
- if (fxmix > 127)
+#if BUILD_VERSION >= VERSION_J
+ if (fxmix > 127) {
fxmix = 127;
+ }
+#else
+ if (fxmix < 0) { // Not possible
+ fxmix = -fxmix;
+ }
+#endif
/*
* set offset and fxmix data
diff --git a/lib/ultralib/src/audio/synthInternals.h b/lib/ultralib/src/audio/synthInternals.h
index 07c08bc..c6c476c 100644
--- a/lib/ultralib/src/audio/synthInternals.h
+++ b/lib/ultralib/src/audio/synthInternals.h
@@ -24,6 +24,7 @@
#define __audioInternals__
#include <libaudio.h>
+#include <PR/os_version.h>
/*
* filter message ids
@@ -332,6 +333,11 @@ void _collectPVoices(ALSynth *drvr);
s32 _timeToSamples(ALSynth *ALSynth, s32 micros);
ALMicroTime _samplesToTime(ALSynth *synth, s32 samples);
+// This was renamed to have a leading underscore in 2.0J
+#if BUILD_VERSION < VERSION_J
+#define _init_lpfilter init_lpfilter
+#endif
+
void _init_lpfilter(ALLowPass *lp);
#endif
diff --git a/lib/ultralib/src/audio/synthesizer.c b/lib/ultralib/src/audio/synthesizer.c
index e499691..9123874 100644
--- a/lib/ultralib/src/audio/synthesizer.c
+++ b/lib/ultralib/src/audio/synthesizer.c
@@ -17,7 +17,7 @@
*====================================================================*/
#include "synthInternals.h"
#include <assert.h>
-
+#include <PR/os_version.h>
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
@@ -281,7 +281,6 @@ void _freePVoice(ALSynth *drvr, PVoice *pvoice)
alLink((ALLink *)pvoice, &drvr->pLameList);
}
-
/*
Add 0.5 to adjust the average affect of
the truncation error produced by casting
@@ -303,10 +302,10 @@ static s32 __nextSampleTime(ALSynth *drvr, ALPlayer **client)
{
ALMicroTime delta = 0x7fffffff; /* max delta for s32 */
ALPlayer *cl;
-
-#ifdef _DEBUG
- assert(drvr->head);
+#if BUILD_VERSION < VERSION_J // Adjust line numbers to match assert
+#line 306
#endif
+ assert(drvr->head);
*client = 0;
diff --git a/lib/ultralib/src/debug/assert.c b/lib/ultralib/src/debug/assert.c
index 4bf6f1e..ab7e313 100644
--- a/lib/ultralib/src/debug/assert.c
+++ b/lib/ultralib/src/debug/assert.c
@@ -5,6 +5,8 @@
void __assertBreak(void);
void __assert(const char* exp, const char* filename, int line) {
+#ifndef _FINALROM
osSyncPrintf("\nASSERTION FAULT: %s, %d: \"%s\"\n", filename, line, exp);
__assertBreak; // Doesn't actually do anything, but is needed for matching
+#endif
}
diff --git a/lib/ultralib/src/debug/assertbreak.s b/lib/ultralib/src/debug/assertbreak.s
index 2837980..69de71d 100644
--- a/lib/ultralib/src/debug/assertbreak.s
+++ b/lib/ultralib/src/debug/assertbreak.s
@@ -1,4 +1,6 @@
-#ifndef _FINALROM
+#include "PR/os_version.h"
+
+#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J
#include "sys/asm.h"
#include "sys/regdef.h"
diff --git a/lib/ultralib/src/debug/profile.c b/lib/ultralib/src/debug/profile.c
index e98d192..47b19d8 100644
--- a/lib/ultralib/src/debug/profile.c
+++ b/lib/ultralib/src/debug/profile.c
@@ -85,7 +85,7 @@ void osProfileInit(OSProf* profp, u32 profcnt) {
u32 i;
OSProf* t;
-#ifndef NDEBUG
+#if !defined(NDEBUG) && BUILD_VERSION >= VERSION_K
if (__osProfileActive) {
__osError(ERR_OSPROFILEINIT_STR, 0);
return;
diff --git a/lib/ultralib/src/debug/threadprofilestop.c b/lib/ultralib/src/debug/threadprofilestop.c
index 7cc20e7..4803620 100644
--- a/lib/ultralib/src/debug/threadprofilestop.c
+++ b/lib/ultralib/src/debug/threadprofilestop.c
@@ -10,8 +10,13 @@ void osThreadProfileStop(void) {
#ifndef NDEBUG
if (__osThprofFlag == 0) {
+#if BUILD_VERSION >= VERSION_L
__osRestoreInt(saveMask);
__osError(138, 0);
+#else
+ __osError(138, 0);
+ __osRestoreInt(saveMask);
+#endif
return;
}
#endif
@@ -23,10 +28,14 @@ void osThreadProfileStop(void) {
thprof[id].time += now_time - __osThprofLastTimer;
} else {
#ifndef NDEBUG
+#if BUILD_VERSION >= VERSION_L
__osRestoreInt(saveMask);
+#endif
__osError(147, 1, id);
+#if BUILD_VERSION >= VERSION_L
saveMask = __osDisableInt();
#endif
+#endif
}
}
__osThprofFunc = NULL;
diff --git a/lib/ultralib/src/error/commonerror.c b/lib/ultralib/src/error/commonerror.c
index 7c60755..5a6f1c9 100644
--- a/lib/ultralib/src/error/commonerror.c
+++ b/lib/ultralib/src/error/commonerror.c
@@ -8,8 +8,16 @@
#ifndef _FINALROM
+void __osSyncVPrintf(const char* fmt, va_list args);
+
static u32 errorLogData[19] ALIGNED(8);
-static OSLog errorLog = { OS_ERROR_MAGIC, 76, errorLogData, 0, 0 };
+static OSLog errorLog = {
+ OS_ERROR_MAGIC, // magic
+ sizeof(errorLogData), // len
+ errorLogData, // base
+ 0, //startCount
+ 0, //writeOffset
+};
static void __commonErrorHandler(s16 code, s16 numArgs, ...);
OSErrorHandler __osCommonHandler = __commonErrorHandler;
@@ -126,7 +134,7 @@ const char* __os_error_message[] = {
"Synthesizer: no free updates",
"alSndPDeallocate: attempt to deallocate a sound which is playing",
"alSndpDelete: attempt to delete player with playing sounds",
- "alSndpPlay: attempt to game_play a sound which is playing",
+ "alSndpPlay: attempt to play a sound which is playing",
"alSndpSetSound: sound id (%d) out of range (0 - %d)",
"alSndpSetPriority: sound id (%d) out of range (0 - %d)",
"alSndpSet Parameter: target (%d) out of range (0 - %d)",
diff --git a/lib/ultralib/src/error/error.c b/lib/ultralib/src/error/error.c
new file mode 100644
index 0000000..3f9ae2d
--- /dev/null
+++ b/lib/ultralib/src/error/error.c
@@ -0,0 +1,30 @@
+// This file was removed in 2.0J
+#include "stdarg.h"
+#include "PR/os_internal.h"
+#include "PR/ultralog.h"
+#include "PR/ultraerror.h"
+#include "macros.h"
+
+void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr);
+static void __osDefaultHandler(s16 code, s16 numArgs, ...);
+
+static u32 errorLogData[19] ALIGNED(8);
+static OSLog errorLog ALIGNED(8) = {
+ OS_ERROR_MAGIC, // magic
+ sizeof(errorLogData), // len
+ errorLogData, // base
+ 0, //startCount
+ 0, //writeOffset
+};
+
+OSErrorHandler __osErrorHandler = __osDefaultHandler;
+
+static void __osDefaultHandler(s16 code, s16 numArgs, ...) {
+ va_list argPtr;
+ va_start(argPtr, numArgs);
+
+ __osLogWrite(&errorLog, code, numArgs, argPtr);
+ osFlushLog(&errorLog);
+
+ va_end(argPtr);
+}
diff --git a/lib/ultralib/src/error/errorasm.s b/lib/ultralib/src/error/errorasm.s
index c3e3120..10f3561 100644
--- a/lib/ultralib/src/error/errorasm.s
+++ b/lib/ultralib/src/error/errorasm.s
@@ -1,11 +1,31 @@
-#ifndef _FINALROM
+#include "PR/os_version.h"
+
+#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J
#include "sys/asm.h"
#include "sys/regdef.h"
+#include "PR/os_version.h"
LEAF(__osError)
+#if BUILD_VERSION < VERSION_J
+ lw t0,__osErrorHandler
+ beqz t0,1f
+ jr t0
+#elif BUILD_VERSION < VERSION_K
+ lw t0,__kmc_pt_mode
+ bnez t0,_kmc_mode
+
+ lw t0,__osErrorHandler
+ beqz t0,1f
+ jr t0
+_kmc_mode:
+ lw t0,__kmcErrorHandler
+ beqz t0,1f
+ jr t0
+#else
lw t0,__osCommonHandler
beqz t0,1f
- jr t0
+ jr t0
+#endif
1:
j ra
END(__osError)
diff --git a/lib/ultralib/src/flash/flashgetaddr.c b/lib/ultralib/src/flash/flashgetaddr.c
index dafcab1..a530947 100644
--- a/lib/ultralib/src/flash/flashgetaddr.c
+++ b/lib/ultralib/src/flash/flashgetaddr.c
@@ -5,9 +5,10 @@ u32 __osFlashGetAddr(u32 page_num) {
u32 devAddr;
if (__osFlashVersion == OLD_FLASH) {
- devAddr = page_num * 64;
+ // Account for hardware bug in old flash where the address bits are shifted 1-off where they should be
+ devAddr = page_num * (FLASH_BLOCK_SIZE >> 1);
} else {
- devAddr = page_num * 128;
+ devAddr = page_num * FLASH_BLOCK_SIZE;
}
return devAddr;
diff --git a/lib/ultralib/src/gt/dumpturbo.c b/lib/ultralib/src/gt/dumpturbo.c
index 59930bc..02c0e63 100644
--- a/lib/ultralib/src/gt/dumpturbo.c
+++ b/lib/ultralib/src/gt/dumpturbo.c
@@ -20,6 +20,10 @@
#include <gt.h>
#include "macros.h"
+#if BUILD_VERSION < VERSION_J
+#ident "$Revision: 1.4 $"
+#endif
+
#undef PRINTF
#define PRINTF rmonPrintf
diff --git a/lib/ultralib/src/gu/mtxcatf.c b/lib/ultralib/src/gu/mtxcatf.c
new file mode 100644
index 0000000..6572e0f
--- /dev/null
+++ b/lib/ultralib/src/gu/mtxcatf.c
@@ -0,0 +1,63 @@
+
+/*
+ * Copyright 1995, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ *
+ * UNPUBLISHED -- Rights reserved under the copyright laws of the United
+ * States. Use of a copyright notice is precautionary only and does not
+ * imply publication or disclosure.
+ *
+ * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
+ * Use, duplication or disclosure by the Government is subject to restrictions
+ * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
+ * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
+ * in similar or successor clauses in the FAR, or the DOD or NASA FAR
+ * Supplement. Contractor/manufacturer is Silicon Graphics, Inc.,
+ * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
+ *
+ * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
+ * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
+ * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
+ * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
+ * GRAPHICS, INC.
+ *
+ */
+
+/*
+ * File: mtxcatf.c
+ * Creator: hsa@sgi.com
+ * Create Date: Thu Nov 2 13:03:02 PST 1995
+ *
+ */
+
+#include "guint.h"
+
+void guMtxCatF(float mf[4][4], float nf[4][4], float res[4][4])
+{
+ int i, j, k;
+ float temp[4][4];
+
+ for (i=0; i<4; i++) {
+ for (j=0; j<4; j++) {
+ temp[i][j] = 0.0;
+ for (k=0; k<4; k++) {
+ temp[i][j] += mf[i][k] * nf[k][j];
+ }
+ }
+ }
+
+ /* make sure we handle case where result is an input */
+ for (i=0; i<4; i++) {
+ for (j=0; j<4; j++) {
+ res[i][j] = temp[i][j];
+ }
+ }
+}
+
+void guMtxXFMF(float mf[4][4], float x, float y, float z, float *ox, float *oy, float *oz)
+{
+ *ox = mf[0][0]*x + mf[1][0]*y + mf[2][0]*z + mf[3][0];
+ *oy = mf[0][1]*x + mf[1][1]*y + mf[2][1]*z + mf[3][1];
+ *oz = mf[0][2]*x + mf[1][2]*y + mf[2][2]*z + mf[3][2];
+}
+
diff --git a/lib/ultralib/src/gu/mtxcatl.c b/lib/ultralib/src/gu/mtxcatl.c
index 11f43a1..3f165bb 100644
--- a/lib/ultralib/src/gu/mtxcatl.c
+++ b/lib/ultralib/src/gu/mtxcatl.c
@@ -31,6 +31,7 @@
*/
#include "guint.h"
+#include "os_version.h"
void guMtxCatL(Mtx *m, Mtx *n, Mtx *res)
{
@@ -43,3 +44,14 @@ void guMtxCatL(Mtx *m, Mtx *n, Mtx *res)
guMtxF2L(resf, res);
}
+
+#if BUILD_VERSION < VERSION_K
+void guMtxXFML(Mtx *m, float x, float y, float z, float *ox, float *oy, float *oz)
+{
+ float mf[4][4];
+
+ guMtxL2F(mf, m);
+
+ guMtxXFMF(mf, x, y, z, ox, oy, oz);
+}
+#endif
diff --git a/lib/ultralib/src/gu/normalize.c b/lib/ultralib/src/gu/normalize.c
new file mode 100644
index 0000000..6884b29
--- /dev/null
+++ b/lib/ultralib/src/gu/normalize.c
@@ -0,0 +1,23 @@
+/**************************************************************************
+ * *
+ * Copyright (C) 1994, Silicon Graphics, Inc. *
+ * *
+ * These coded instructions, statements, and computer programs contain *
+ * unpublished proprietary information of Silicon Graphics, Inc., and *
+ * are protected by Federal copyright law. They may not be disclosed *
+ * to third parties or copied or duplicated in any form, in whole or *
+ * in part, without the prior written consent of Silicon Graphics, Inc. *
+ * *
+ **************************************************************************/
+
+#include "guint.h"
+
+void guNormalize(float *x, float *y, float *z)
+{
+ float m;
+
+ m = 1/sqrtf((*x)*(*x) + (*y)*(*y) + (*z)*(*z));
+ *x *= m;
+ *y *= m;
+ *z *= m;
+}
diff --git a/lib/ultralib/src/gu/parse_gbi.c b/lib/ultralib/src/gu/parse_gbi.c
index 21cf9c3..d736d4a 100644
--- a/lib/ultralib/src/gu/parse_gbi.c
+++ b/lib/ultralib/src/gu/parse_gbi.c
@@ -77,7 +77,11 @@ void guParseGbiDL(u64 *gbi_dl, u32 nbytes, u8 flags)
word0 = (u32*)curGfx; /* get ptr to first word */
param = ((*word0) & 0x00ff0000) >> 16; /* get param */
word1 = word0 + 1; /* get pointer to second word */
+#if BUILD_VERSION >= VERSION_J
seg = ((*word1) & 0x0f000000) >> 24; /* get the segment */
+#else
+ seg = ((*word1) & 0xff000000) >> 24; /* get the segment */
+#endif
paddr = segments[seg] + ((*word1) & 0x00ffffff);
vaddr = (Gfx*)osPhysicalToVirtual(paddr);
len = 1;
@@ -109,7 +113,11 @@ void guParseGbiDL(u64 *gbi_dl, u32 nbytes, u8 flags)
case G_MTX:
word0 = (u32*)curGfx; /* get ptr to first word */
word1 = word0 + 1; /* get pointer to second word */
+#if BUILD_VERSION >= VERSION_J
seg = ((*word1) & 0x0f000000) >> 24; /* get the segment */
+#else
+ seg = ((*word1) & 0xff000000) >> 24; /* get the segment */
+#endif
paddr = segments[seg] + ((*word1) & 0x00ffffff);
vaddr = (Gfx*)osPhysicalToVirtual(paddr);
len = (*word0) & 0x0000ffff;
diff --git a/lib/ultralib/src/gu/rotate.c b/lib/ultralib/src/gu/rotate.c
index eceb096..c843d9f 100644
--- a/lib/ultralib/src/gu/rotate.c
+++ b/lib/ultralib/src/gu/rotate.c
@@ -11,6 +11,7 @@
**************************************************************************/
#include "guint.h"
+#include "os_version.h"
void guRotateF(float mf[4][4], float a, float x, float y, float z)
{
@@ -18,9 +19,11 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z)
float sine;
float cosine;
float ab, bc, ca, t;
+#if BUILD_VERSION >= VERSION_K
float xxsine;
float yxsine;
float zxsine;
+#endif
guNormalize(&x, &y, &z);
a *= dtor;
@@ -33,9 +36,15 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z)
guMtxIdentF(mf);
+#if BUILD_VERSION >= VERSION_K
xxsine = x * sine;
yxsine = y * sine;
zxsine = z * sine;
+#else
+ #define xxsine (x * sine)
+ #define yxsine (y * sine)
+ #define zxsine (z * sine)
+#endif
t = x*x;
mf[0][0] = t+cosine*(1-t);
diff --git a/lib/ultralib/src/gu/scale.c b/lib/ultralib/src/gu/scale.c
new file mode 100644
index 0000000..1523cd0
--- /dev/null
+++ b/lib/ultralib/src/gu/scale.c
@@ -0,0 +1,32 @@
+/**************************************************************************
+ * *
+ * Copyright (C) 1994, Silicon Graphics, Inc. *
+ * *
+ * These coded instructions, statements, and computer programs contain *
+ * unpublished proprietary information of Silicon Graphics, Inc., and *
+ * are protected by Federal copyright law. They may not be disclosed *
+ * to third parties or copied or duplicated in any form, in whole or *
+ * in part, without the prior written consent of Silicon Graphics, Inc. *
+ * *
+ **************************************************************************/
+
+#include "guint.h"
+
+void guScaleF(float mf[4][4], float x, float y, float z)
+{
+ guMtxIdentF(mf);
+
+ mf[0][0] = x;
+ mf[1][1] = y;
+ mf[2][2] = z;
+ mf[3][3] = 1;
+}
+
+void guScale(Mtx *m, float x, float y, float z)
+{
+ Matrix mf;
+
+ guScaleF(mf, x, y, z);
+
+ guMtxF2L(mf, m);
+}
diff --git a/lib/ultralib/src/gu/translate.c b/lib/ultralib/src/gu/translate.c
new file mode 100644
index 0000000..f086f39
--- /dev/null
+++ b/lib/ultralib/src/gu/translate.c
@@ -0,0 +1,31 @@
+/**************************************************************************
+ * *
+ * Copyright (C) 1994, Silicon Graphics, Inc. *
+ * *
+ * These coded instructions, statements, and computer programs contain *
+ * unpublished proprietary information of Silicon Graphics, Inc., and *
+ * are protected by Federal copyright law. They may not be disclosed *
+ * to third parties or copied or duplicated in any form, in whole or *
+ * in part, without the prior written consent of Silicon Graphics, Inc. *
+ * *
+ **************************************************************************/
+
+#include "guint.h"
+
+void guTranslateF(float mf[4][4], float x, float y, float z)
+{
+ guMtxIdentF(mf);
+
+ mf[3][0] = x;
+ mf[3][1] = y;
+ mf[3][2] = z;
+}
+
+void guTranslate(Mtx *m, float x, float y, float z)
+{
+ Matrix mf;
+
+ guTranslateF(mf, x, y, z);
+
+ guMtxF2L(mf, m);
+}
diff --git a/lib/ultralib/src/gu/us2dex.c b/lib/ultralib/src/gu/us2dex.c
index cf977f9..92f42bb 100644
--- a/lib/ultralib/src/gu/us2dex.c
+++ b/lib/ultralib/src/gu/us2dex.c
@@ -24,21 +24,23 @@ void guS2DInitBg(uObjBg *bg)
{
u16 tmemUse;
u16 shift;
+#if BUILD_VERSION >= VERSION_J
u32 tsize;
+#endif
/*
* Get the useable volume for TMEM
- * If imageFmt is CI then TLUT will use half
+ * If imageFmt is CI then TLUT will use half.
*/
tmemUse = (bg->b.imageFmt == G_IM_FMT_CI) ? 256 : 512;
/*
- * Get shift volume for conversion to TMEM word
+ * Get shift volume for conversion to TMEM word.
*/
shift = 6 - bg->b.imageSiz;
/*
- * Set other parameters for Load Mode
+ * Set other parameters for Load Mode.
*/
if (bg->b.imageLoad == G_BGLT_LOADBLOCK){
bg->b.tmemW = bg->b.imageW >> shift;
@@ -48,6 +50,7 @@ void guS2DInitBg(uObjBg *bg)
bg->b.tmemLoadSH = (bg->b.tmemSize>>1) - 1;
bg->b.tmemLoadTH = GS_CALC_DXT(bg->b.tmemW);
} else {
+#if BUILD_VERSION >= VERSION_J
bg->b.tmemW = (bg->b.frameW >> shift) + 3;
bg->b.tmemH = (tmemUse / bg->b.tmemW) << 2;
bg->b.tmemSizeW = (bg->b.imageW >> shift) * 2;
@@ -55,6 +58,14 @@ void guS2DInitBg(uObjBg *bg)
bg->b.tmemSize = tsize >> 16;
bg->b.tmemLoadSH = tsize & 0xffff;
bg->b.tmemLoadTH = bg->b.tmemH - 1;
+#else
+ bg->b.tmemW = (bg->b.frameW >> shift) + 1;
+ bg->b.tmemH = (tmemUse / bg->b.tmemW) << 2;
+ bg->b.tmemSizeW = (bg->b.imageW >> shift) * 2;
+ bg->b.tmemSize = bg->b.tmemH * bg->b.tmemSizeW;
+ bg->b.tmemLoadSH = (bg->b.tmemW<<4) - 1;
+ bg->b.tmemLoadTH = bg->b.tmemH - 1;
+#endif
}
return;
}
diff --git a/lib/ultralib/src/gu/us2dex_emu.c b/lib/ultralib/src/gu/us2dex_emu.c
index e79ff7b..c0a9e30 100644
--- a/lib/ultralib/src/gu/us2dex_emu.c
+++ b/lib/ultralib/src/gu/us2dex_emu.c
@@ -27,7 +27,9 @@ static u32 imageTop;
static s16 tmemSrcLines;
/* Addition 99/05/31(Y) */
+#if BUILD_VERSION >= VERSION_K
static s8 bgflg;
+#endif
/*----------------------------------------------------------------------------*
* Set scissoring parameters
@@ -63,8 +65,12 @@ static void tmemLoad_B(Gfx **pkt, u32 imagePtr, s16 loadLines, s16 tmemSH)
/* [LoadTile] CMD=0x34 TILE=7 SH=TMEMW*16-1 TMEMH*4-1 */
(*pkt)->words.w0 = (G_LOADTILE<<24)|0x000000;
/* addition 99/5/31(Y) */
+#if BUILD_VERSION >= VERSION_K
if(bgflg==3) (*pkt)->words.w1 = 0x07000000 | (tmemSH-1)<<16;
else (*pkt)->words.w1 = 0x07000000 | (tmemSH-1)<<16 | (loadLines<<2)-1;
+#else
+ (*pkt)->words.w1 = 0x07000000 | (tmemSH-1)<<16 | (loadLines<<2)-1;
+#endif
(*pkt) ++;
}
@@ -188,9 +194,11 @@ void guS2DEmuBgRect1Cyc(Gfx **pkt, uObjBg *bg)
scaleH = bg->s.scaleH;
/* addition 99/05/31(Y) */
+#if BUILD_VERSION >= VERSION_K
bgflg=bg->s.imageSiz;
if(scaleW==0) scaleW=1;
if(scaleH==0) scaleH=1;
+#endif
{
@@ -327,14 +335,20 @@ end */
// o Cut image width end number at TMEM Word boundary.
// o tmem width + 1 when start position not in agreement with Word boundary */
/* addition 99/05/31(Y) */
+#if BUILD_VERSION >= VERSION_K
if(bgflg==3){
tmemSize=480;
imageSliceWmax = 0x2800;
}
else{
imageSliceWmax = (((s32)bg->s.frameW * (s32)scaleW)>>7) + (flagBilerp<<5);
+ if (imageSliceWmax > imageSrcW) imageSliceWmax = imageSrcW;
+ }
+#else
+ imageSliceWmax = (((s32)bg->s.frameW * (s32)scaleW)>>7) + (flagBilerp<<5);
if (imageSliceWmax > imageSrcW) imageSliceWmax = imageSrcW;
- }
+#endif
+
tmemSliceWmax = (imageSliceWmax + tmemMask) / tmemShift + 1;
/* Get TMEM/image/frame line number that can be loaded at once */
@@ -390,6 +404,7 @@ end */
/* u32 rdpSetTimg_w0;
u32 rdpSetTile_w0; */
/* Addition 99/05/31(Y) */
+#if BUILD_VERSION >= VERSION_K
if(bgflg==3){
rdpSetTimg_w0 = (G_SETTIMG<<24)+0x180000+(imageSrcWsize>>1)-1;
rdpSetTile_w0 = (G_SETTILE<<24)+0x180000+(tmemSliceWmax<<9);
@@ -398,6 +413,10 @@ end */
rdpSetTimg_w0 = (G_SETTIMG<<24)+0x100000+(imageSrcWsize>>1)-1;
rdpSetTile_w0 = (G_SETTILE<<24)+0x100000+(tmemSliceWmax<<9);
}
+#else
+ rdpSetTimg_w0 = (G_SETTIMG<<24)+0x100000+(imageSrcWsize>>1)-1;
+ rdpSetTile_w0 = (G_SETTILE<<24)+0x100000+(tmemSliceWmax<<9);
+#endif
/* [SetTile:7] */
(*pkt)->words.w0 = rdpSetTile_w0;
(*pkt)->words.w1 = 0x07000000;
diff --git a/lib/ultralib/src/host/host_ptn64.c b/lib/ultralib/src/host/host_ptn64.c
index 6b33c4e..54e5e9e 100644
--- a/lib/ultralib/src/host/host_ptn64.c
+++ b/lib/ultralib/src/host/host_ptn64.c
@@ -1,9 +1,12 @@
#include "PR/os_internal.h"
+#include "PR/os_version.h"
#include "PR/rcp.h"
#include "memory.h"
#include "macros.h"
+#if BUILD_VERSION >= VERSION_J || !defined(_FINALROM)
+
static volatile unsigned int* ptwtmode = (unsigned*)0xbff08014;
static volatile unsigned int* ptstat = (unsigned*)0xbff08004;
static volatile unsigned int* ptport = (unsigned*)0xbff08000;
@@ -202,3 +205,5 @@ osWriteHost_ret:
__osPiRelAccess();
return;
}
+
+#endif
diff --git a/lib/ultralib/src/io/aisetfreq.c b/lib/ultralib/src/io/aisetfreq.c
index 55cf2af..e41d6fa 100644
--- a/lib/ultralib/src/io/aisetfreq.c
+++ b/lib/ultralib/src/io/aisetfreq.c
@@ -46,5 +46,8 @@ s32 osAiSetFrequency(u32 frequency) {
IO_WRITE(AI_DACRATE_REG, dacRate - 1);
IO_WRITE(AI_BITRATE_REG, bitRate - 1);
+#if BUILD_VERSION < VERSION_J
+ IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON);
+#endif
return osViClock / (s32)dacRate;
}
diff --git a/lib/ultralib/src/io/aisetnextbuf.c b/lib/ultralib/src/io/aisetnextbuf.c
index 23fd81b..041b61d 100644
--- a/lib/ultralib/src/io/aisetnextbuf.c
+++ b/lib/ultralib/src/io/aisetnextbuf.c
@@ -10,9 +10,11 @@ s32 osAiSetNextBuffer(void* bufPtr, u32 size) {
static u8 hdwrBugFlag = FALSE;
char* bptr;
+#if BUILD_VERSION >= VERSION_J
if (__osAiDeviceBusy()) {
return -1;
}
+#endif
#ifdef _DEBUG
if ((u32)bufPtr & (8 - 1)) {
@@ -38,6 +40,12 @@ s32 osAiSetNextBuffer(void* bufPtr, u32 size) {
hdwrBugFlag = FALSE;
}
+#if BUILD_VERSION < VERSION_J
+ if (__osAiDeviceBusy()) {
+ return -1;
+ }
+#endif
+
IO_WRITE(AI_DRAM_ADDR_REG, osVirtualToPhysical(bptr));
IO_WRITE(AI_LEN_REG, size);
return 0;
diff --git a/lib/ultralib/src/io/cartrominit.c b/lib/ultralib/src/io/cartrominit.c
index 9651878..87aa8bb 100644
--- a/lib/ultralib/src/io/cartrominit.c
+++ b/lib/ultralib/src/io/cartrominit.c
@@ -1,9 +1,11 @@
#include "macros.h"
+#include "PR/os_version.h"
#include "PR/os_internal.h"
#include "PR/R4300.h"
#include "PR/rcp.h"
#include "piint.h"
+#if BUILD_VERSION >= VERSION_J
OSPiHandle __CartRomHandle ALIGNED(8);
OSPiHandle* osCartRomInit(void) {
u32 value = 0;
@@ -61,3 +63,33 @@ OSPiHandle* osCartRomInit(void) {
return &__CartRomHandle;
}
+#else
+
+OSPiHandle CartRomHandle ALIGNED(8);
+OSPiHandle* osCartRomInit(void) {
+ u32 domain = 0;
+ u32 saveMask;
+
+ if (CartRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR2))
+ return &CartRomHandle;
+
+ CartRomHandle.type = DEVICE_TYPE_CART;
+ CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2);
+ osPiRawReadIo(NULL, &domain);
+ CartRomHandle.latency = domain & 0xff;
+ CartRomHandle.pulse = (domain >> 8) & 0xff;
+ CartRomHandle.pageSize = (domain >> 0x10) & 0xf;
+ CartRomHandle.relDuration = (domain >> 0x14) & 0xf;
+ CartRomHandle.domain = PI_DOMAIN1;
+ CartRomHandle.speed = 0;
+
+ bzero(&CartRomHandle.transferInfo, sizeof(__OSTranxInfo));
+
+ saveMask = __osDisableInt();
+ CartRomHandle.next = __osPiTable;
+ __osPiTable = &CartRomHandle;
+ __osRestoreInt(saveMask);
+
+ return &CartRomHandle;
+}
+#endif
diff --git a/lib/ultralib/src/io/conteeplongwrite.c b/lib/ultralib/src/io/conteeplongwrite.c
index c38acf8..c5668e1 100644
--- a/lib/ultralib/src/io/conteeplongwrite.c
+++ b/lib/ultralib/src/io/conteeplongwrite.c
@@ -9,7 +9,7 @@ s32 osEepromLongWrite(OSMesgQueue* mq, u8 address, u8* buffer, int length) {
length -= EEPROM_BLOCK_SIZE;
address++;
buffer += EEPROM_BLOCK_SIZE;
- osSetTimer(&__osEepromTimer, 562500, 0, &__osEepromTimerQ, &__osEepromTimerMsg);
+ osSetTimer(&__osEepromTimer, OS_USEC_TO_CYCLES(12000), 0, &__osEepromTimerQ, &__osEepromTimerMsg);
osRecvMesg(&__osEepromTimerQ, NULL, OS_MESG_BLOCK);
}
diff --git a/lib/ultralib/src/io/conteepprobe.c b/lib/ultralib/src/io/conteepprobe.c
index 5bee6a4..b19dc49 100644
--- a/lib/ultralib/src/io/conteepprobe.c
+++ b/lib/ultralib/src/io/conteepprobe.c
@@ -26,7 +26,9 @@ s32 osEepromProbe(OSMesgQueue* mq) {
}
}
+#if BUILD_VERSION >= VERSION_L
__osEepromRead16K = 0;
+#endif
__osSiRelAccess();
return ret;
}
diff --git a/lib/ultralib/src/io/conteepread.c b/lib/ultralib/src/io/conteepread.c
index 708a976..2d334fa 100644
--- a/lib/ultralib/src/io/conteepread.c
+++ b/lib/ultralib/src/io/conteepread.c
@@ -4,7 +4,9 @@
#include "siint.h"
OSPifRam __osEepPifRam ALIGNED(16);
+#if BUILD_VERSION >= VERSION_L
s32 __osEepromRead16K;
+#endif
static void __osPackEepReadData(u8 address);
s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) {
@@ -20,6 +22,7 @@ s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) {
ret = __osEepStatus(mq, &sdata);
type = sdata.type & (CONT_EEPROM | CONT_EEP16K);
+#if BUILD_VERSION >= VERSION_J
if (ret == 0) {
switch (type) {
case CONT_EEPROM:
@@ -31,9 +34,12 @@ s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) {
if (address >= EEP16K_MAXBLOCKS) {
// not technically possible
ret = CONT_RANGE_ERROR;
- } else {
+ }
+#if BUILD_VERSION >= VERSION_L
+ else {
__osEepromRead16K = 1;
}
+#endif
break;
default:
ret = CONT_NO_RESPONSE_ERROR;
@@ -44,6 +50,32 @@ s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) {
__osSiRelAccess();
return ret;
}
+#else
+ if (ret != 0)
+ {
+ __osSiRelAccess();
+ return CONT_NO_RESPONSE_ERROR;
+ } else {
+ switch (type) {
+ case CONT_EEPROM:
+ if (address > EEPROM_MAXBLOCKS) {
+ __osSiRelAccess();
+ return CONT_RANGE_ERROR;
+ }
+ break;
+ case CONT_EEPROM | CONT_EEP16K:
+ if (address > EEP16K_MAXBLOCKS) {
+ // not technically possible
+ __osSiRelAccess();
+ return CONT_RANGE_ERROR;
+ }
+ break;
+ default:
+ __osSiRelAccess();
+ return CONT_NO_RESPONSE_ERROR;
+ }
+ }
+#endif
while (sdata.status & CONT_EEPROM_BUSY) {
__osEepStatus(mq, &sdata);
@@ -78,6 +110,12 @@ static void __osPackEepReadData(u8 address) {
__OSContEepromFormat eepromformat;
int i;
+#if BUILD_VERSION < VERSION_J
+ for (i = 0; i < ARRLEN(__osEepPifRam.ramarray); i++) {
+ __osEepPifRam.ramarray[i] = CONT_CMD_NOP;
+ }
+#endif
+
__osEepPifRam.pifstatus = CONT_CMD_EXE;
eepromformat.txsize = CONT_CMD_READ_EEPROM_TX;
@@ -85,6 +123,12 @@ static void __osPackEepReadData(u8 address) {
eepromformat.cmd = CONT_CMD_READ_EEPROM;
eepromformat.address = address;
+#if BUILD_VERSION < VERSION_J
+ for (i = 0; i < ARRLEN(eepromformat.data); i++) {
+ eepromformat.data[i] = 0;
+ }
+#endif
+
for (i = 0; i < MAXCONTROLLERS; i++) {
*ptr++ = 0;
}
diff --git a/lib/ultralib/src/io/conteepwrite.c b/lib/ultralib/src/io/conteepwrite.c
index 5c4f4e2..7352430 100644
--- a/lib/ultralib/src/io/conteepwrite.c
+++ b/lib/ultralib/src/io/conteepwrite.c
@@ -6,17 +6,26 @@
static void __osPackEepWriteData(u8 address, u8* buffer);
s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) {
s32 ret = 0;
+#if BUILD_VERSION < VERSION_J
+ int i;
+#endif
u16 type;
u8* ptr = (u8*)&__osEepPifRam.ramarray;
__OSContEepromFormat eepromformat;
OSContStatus sdata;
+#if BUILD_VERSION >= VERSION_L
u8 temp[8];
+#endif
__osSiGetAccess();
ret = __osEepStatus(mq, &sdata);
+#if BUILD_VERSION < VERSION_J
+ ret = __osEepStatus(mq, &sdata); // Duplicate that was removed in 2.0J
+#endif
type = sdata.type & (CONT_EEPROM | CONT_EEP16K);
+#if BUILD_VERSION >= VERSION_J
if (ret == 0) {
switch (type) {
case CONT_EEPROM:
@@ -28,12 +37,15 @@ s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) {
if (address >= EEP16K_MAXBLOCKS) {
// not technically possible
ret = CONT_RANGE_ERROR;
- } else if (__osEepromRead16K) {
+ }
+#if BUILD_VERSION >= VERSION_L
+ else if (__osEepromRead16K) {
__osEepromRead16K = 0;
__osSiRelAccess();
osEepromRead(mq, (address ^ 1), temp);
__osSiGetAccess();
}
+#endif
break;
default:
ret = CONT_NO_RESPONSE_ERROR;
@@ -44,6 +56,32 @@ s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) {
__osSiRelAccess();
return ret;
}
+#else
+ if (ret != 0) {
+ __osSiRelAccess();
+ return CONT_NO_RESPONSE_ERROR;
+ } else {
+ switch (type) {
+ case CONT_EEPROM:
+ if (address > EEPROM_MAXBLOCKS) {
+ __osSiRelAccess();
+ return -1;
+ }
+
+ break;
+ case CONT_EEPROM | CONT_EEP16K:
+ if (address > EEP16K_MAXBLOCKS) {
+ // not technically possible
+ __osSiRelAccess();
+ return -1;
+ }
+ break;
+ default:
+ __osSiRelAccess();
+ return CONT_NO_RESPONSE_ERROR;
+ }
+ }
+#endif
while (sdata.status & CONT_EEPROM_BUSY) {
__osEepStatus(mq, &sdata);
@@ -57,7 +95,13 @@ s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) {
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
// skip the first 4 bytes
+#if BUILD_VERSION >= VERSION_J
ptr += 4;
+#else
+ for (i = 0; i < 4; i++) {
+ ptr++;
+ }
+#endif
eepromformat = *(__OSContEepromFormat*)ptr;
@@ -72,6 +116,11 @@ static void __osPackEepWriteData(u8 address, u8* buffer) {
__OSContEepromFormat eepromformat;
int i;
+#if BUILD_VERSION < VERSION_J
+ for (i = 0; i < ARRLEN(__osEepPifRam.ramarray); i++) {
+ __osEepPifRam.ramarray[i] = CONT_CMD_NOP;
+ }
+#endif
__osEepPifRam.pifstatus = CONT_CMD_EXE;
eepromformat.txsize = CONT_CMD_WRITE_EEPROM_TX;
@@ -123,7 +172,11 @@ s32 __osEepStatus(OSMesgQueue* mq, OSContStatus* data) {
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+#if BUILD_VERSION >= VERSION_J
__osContLastCmd = CONT_CMD_END;
+#else
+ __osContLastCmd = CONT_CMD_REQUEST_STATUS;
+#endif
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
diff --git a/lib/ultralib/src/io/contpfs.c b/lib/ultralib/src/io/contpfs.c
index 5f3854d..c845a7d 100644
--- a/lib/ultralib/src/io/contpfs.c
+++ b/lib/ultralib/src/io/contpfs.c
@@ -1,11 +1,14 @@
#include "macros.h"
#include "PR/os_internal.h"
+#include "PR/os_version.h"
#include "controller.h"
#include "PR/rmon.h"
+#if BUILD_VERSION >= VERSION_J
__OSInode __osPfsInodeCache ALIGNED(8);
s32 __osPfsInodeCacheChannel = -1;
u8 __osPfsInodeCacheBank = 250;
+#endif
u16 __osSumcalc(u8* ptr, int length) {
int i;
@@ -14,9 +17,16 @@ u16 __osSumcalc(u8* ptr, int length) {
for (i = 0; i < length; i++) {
sum += *tmp++;
+#if BUILD_VERSION < VERSION_J
+ sum = sum & 0xFFFF;
+#endif
}
+#if BUILD_VERSION >= VERSION_J
return sum & 0xFFFF;
+#else
+ return sum;
+#endif
}
s32 __osIdCheckSum(u16* ptr, u16* csum, u16* icsum) {
@@ -40,18 +50,27 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
u8 comp[BLOCKSIZE];
u8 mask = 0;
int i;
- int j = 0;
+ int j;
u16 index[4];
+#if BUILD_VERSION >= VERSION_J
+ j = 0;
+#else
+ SET_ACTIVEBANK_TO_ZERO();
+#endif
+
newid->repaired = -1;
newid->random = osGetCount();
newid->serial_mid = badid->serial_mid;
newid->serial_low = badid->serial_low;
- SET_ACTIVEBANK_TO_ZERO;
-
+#if BUILD_VERSION >= VERSION_J
+ SET_ACTIVEBANK_TO_ZERO();
+#else
+ j = 0;
+#endif
do {
- ERRCK(__osPfsSelectBank(pfs, j));
+ ERRCK(SELECT_BANK(pfs, j));
ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, temp));
temp[0] = j | 0x80;
@@ -74,7 +93,7 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
}
if (j > 0) {
- ERRCK(__osPfsSelectBank(pfs, 0));
+ ERRCK(SELECT_BANK(pfs, 0));
ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, (u8*)temp));
if (temp[0] != 0x80) {
@@ -85,7 +104,11 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
j++;
} while (j < PFS_MAX_BANKS);
- SET_ACTIVEBANK_TO_ZERO;
+#if BUILD_VERSION >= VERSION_J
+ SET_ACTIVEBANK_TO_ZERO();
+#else
+ ERRCK(SELECT_BANK(pfs, 0));
+#endif
mask = (j > 0) ? 1 : 0;
@@ -106,7 +129,11 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
for (i = 0; i < BLOCKSIZE; i++) {
if (temp[i] != ((u8*)newid)[i]) {
+#if BUILD_VERSION >= VERSION_J
return PFS_ERR_DEVICE;
+#else
+ return PFS_ERR_ID_FATAL;
+#endif
}
}
return 0;
@@ -120,7 +147,7 @@ s32 __osCheckPackId(OSPfs* pfs, __OSPackId* temp) {
int i;
int j;
- SET_ACTIVEBANK_TO_ZERO;
+ SET_ACTIVEBANK_TO_ZERO();
index[0] = PFS_ID_0AREA;
index[1] = PFS_ID_1AREA;
index[2] = PFS_ID_2AREA;
@@ -147,6 +174,9 @@ s32 __osCheckPackId(OSPfs* pfs, __OSPackId* temp) {
}
s32 __osGetId(OSPfs* pfs) {
+#if BUILD_VERSION < VERSION_J
+ int k;
+#endif
u16 sum;
u16 isum;
u8 temp[BLOCKSIZE];
@@ -154,7 +184,7 @@ s32 __osGetId(OSPfs* pfs) {
s32 ret;
__OSPackId* id;
- SET_ACTIVEBANK_TO_ZERO;
+ SET_ACTIVEBANK_TO_ZERO();
ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp));
__osIdCheckSum((u16*)temp, &sum, &isum);
id = (__OSPackId*)temp;
@@ -179,7 +209,13 @@ s32 __osGetId(OSPfs* pfs) {
}
}
+#if BUILD_VERSION >= VERSION_J
bcopy(id, pfs->id, BLOCKSIZE);
+#else
+ for (k = 0; k < ARRLEN(pfs->id); k++) {
+ pfs->id[k] = ((u8 *)id)[k];
+ }
+#endif
pfs->version = id->version;
pfs->banks = id->banks;
pfs->inode_start_page = 1 + DEF_DIR_PAGES + (2 * pfs->banks);
@@ -192,9 +228,13 @@ s32 __osGetId(OSPfs* pfs) {
}
s32 __osCheckId(OSPfs* pfs) {
+#if BUILD_VERSION < VERSION_J
+ int k;
+#endif
u8 temp[BLOCKSIZE];
s32 ret;
+#if BUILD_VERSION >= VERSION_J
if (pfs->activebank != 0) {
ret = __osPfsSelectBank(pfs, 0);
@@ -206,6 +246,9 @@ s32 __osCheckId(OSPfs* pfs) {
return ret;
}
}
+#else
+ SET_ACTIVEBANK_TO_ZERO();
+#endif
ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp);
@@ -216,9 +259,16 @@ s32 __osCheckId(OSPfs* pfs) {
ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp));
}
+#if BUILD_VERSION >= VERSION_J
if (bcmp(pfs->id, temp, BLOCKSIZE) != 0) {
return PFS_ERR_NEW_PACK;
}
+#else
+ for (k = 0; k < ARRLEN(temp); k++) {
+ if (pfs->id[k] != temp[k])
+ return PFS_ERR_NEW_PACK;
+ }
+#endif
return 0;
}
@@ -230,12 +280,14 @@ s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) {
int offset;
u8* addr;
+#if BUILD_VERSION >= VERSION_J
if (flag == PFS_READ && bank == __osPfsInodeCacheBank && (pfs->channel == __osPfsInodeCacheChannel)) {
bcopy(&__osPfsInodeCache, inode, sizeof(__OSInode));
return 0;
}
+#endif
- SET_ACTIVEBANK_TO_ZERO;
+ SET_ACTIVEBANK_TO_ZERO();
offset = (bank > 0) ? 1 : pfs->inode_start_page;
@@ -251,7 +303,7 @@ s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) {
ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr, FALSE);
ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr, FALSE);
} else {
- ret = __osContRamRead(pfs->queue, pfs->channel, pfs->inode_table + bank * 8 + j, addr);
+ ret = __osContRamRead(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr);
}
if (ret != 0) {
@@ -267,7 +319,9 @@ s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) {
ret = __osContRamRead(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr);
}
+#if BUILD_VERSION >= VERSION_J
sum = __osSumcalc((u8*)&inode->inode_page[offset], (PFS_INODE_SIZE_PER_PAGE - offset) * 2);
+#endif
if (sum != inode->inode_page[0].inode_t.page) {
return PFS_ERR_INCONSISTENT;
@@ -279,15 +333,43 @@ s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) {
__osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr, FALSE);
}
}
+#if BUILD_VERSION < VERSION_J
+ else
+ {
+ for (j = 0; j < PFS_ONE_PAGE; j++)
+ {
+ addr = ((u8 *)inode->inode_page + j * 32);
+ ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr, FALSE);
+ }
+ }
+#endif
}
+#if BUILD_VERSION >= VERSION_J
__osPfsInodeCacheBank = bank;
bcopy(inode, &__osPfsInodeCache, sizeof(__OSInode));
__osPfsInodeCacheChannel = pfs->channel;
+#endif
return 0;
}
+// This was moved into it's own file in 2.0J
+#if BUILD_VERSION < VERSION_J
+s32 __osPfsSelectBank(OSPfs* pfs) {
+ u8 temp[BLOCKSIZE];
+ int i;
+ s32 ret = 0;
+
+ for (i = 0; i < BLOCKSIZE; i++) {
+ temp[i] = pfs->activebank;
+ }
+
+ ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_DETECT, temp, FALSE);
+ return ret;
+}
+#endif
+
#ifdef _DEBUG
s32 __osDumpId(OSPfs* pfs) {
u8 id[BLOCKSIZE];
diff --git a/lib/ultralib/src/io/contramread.c b/lib/ultralib/src/io/contramread.c
index b0346e1..9c399ee 100644
--- a/lib/ultralib/src/io/contramread.c
+++ b/lib/ultralib/src/io/contramread.c
@@ -3,10 +3,11 @@
#include "controller.h"
#include "siint.h"
-s32 __osPfsLastChannel = -1;
-
#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
+#if BUILD_VERSION >= VERSION_J
+s32 __osPfsLastChannel = -1;
+
s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
s32 ret = 0;
s32 i;
@@ -37,8 +38,13 @@ s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
ptr += channel;
}
+#if BUILD_VERSION >= VERSION_J
READFORMAT(ptr)->addrh = address >> 3;
READFORMAT(ptr)->addrl = (u8)((address << 5) | __osContAddressCrc(address));
+#else
+ READFORMAT(ptr)->address = (address << 0x5) | __osContAddressCrc(address);
+#endif
+
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
@@ -67,3 +73,91 @@ s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
__osSiRelAccess();
return ret;
}
+#else
+
+static void __osPackRamReadData(int channel, u16 address);
+
+s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
+ s32 ret = 0;
+ int i;
+ u8* ptr = (u8*)&__osPfsPifRam;
+ __OSContRamReadFormat ramreadformat;
+ int retry = 2;
+
+ __osSiGetAccess();
+ __osContLastCmd = CONT_CMD_READ_PAK;
+ __osPackRamReadData(channel, address);
+ ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ do {
+ ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ ptr = (u8*)&__osPfsPifRam;
+
+ if (channel != 0) {
+ for (i = 0; i < channel; i++) {
+ ptr++;
+ }
+ }
+
+ ramreadformat = *READFORMAT(ptr);
+
+ ret = CHNL_ERR(ramreadformat);
+ if (ret == 0) {
+ u8 c = __osContDataCrc((u8*)&ramreadformat.data);
+ if (c != ramreadformat.datacrc) {
+ ret = __osPfsGetStatus(mq, channel);
+
+ if (ret != 0) {
+ __osSiRelAccess();
+ return ret;
+ }
+
+ ret = PFS_ERR_CONTRFAIL;
+ } else {
+ for (i = 0; i < ARRLEN(ramreadformat.data); i++) {
+ *buffer++ = ramreadformat.data[i];
+ }
+ }
+ } else {
+ ret = PFS_ERR_NOPACK;
+ }
+ } while ((ret == PFS_ERR_CONTRFAIL) && retry-- >= 0);
+
+ __osSiRelAccess();
+
+ return ret;
+}
+
+static void __osPackRamReadData(int channel, u16 address) {
+ u8 *ptr;
+ __OSContRamReadFormat ramreadformat;
+ int i;
+
+ ptr = (u8 *)__osPfsPifRam.ramarray;
+ __osPfsPifRam.pifstatus = CONT_CMD_EXE;
+ ramreadformat.dummy = CONT_CMD_NOP;
+ ramreadformat.txsize = CONT_CMD_READ_PAK_TX;
+ ramreadformat.rxsize = CONT_CMD_READ_PAK_RX;
+ ramreadformat.cmd = CONT_CMD_READ_PAK;
+ ramreadformat.address = (address << 0x5) | __osContAddressCrc(address);
+ ramreadformat.datacrc = CONT_CMD_NOP;
+
+ for (i = 0; i < ARRLEN(ramreadformat.data); i++) {
+ ramreadformat.data[i] = CONT_CMD_NOP;
+ }
+
+ if (channel != 0) {
+ for (i = 0; i < channel; i++) {
+ *ptr++ = CONT_CMD_REQUEST_STATUS;
+ }
+ }
+
+ *(__OSContRamReadFormat *)ptr = ramreadformat;
+ ptr += sizeof(__OSContRamReadFormat);
+ ptr[0] = CONT_CMD_END;
+}
+
+#endif
+
diff --git a/lib/ultralib/src/io/contramwrite.c b/lib/ultralib/src/io/contramwrite.c
index 8960c90..a213049 100644
--- a/lib/ultralib/src/io/contramwrite.c
+++ b/lib/ultralib/src/io/contramwrite.c
@@ -7,6 +7,7 @@ extern s32 __osPfsLastChannel;
#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
+#if BUILD_VERSION >= VERSION_J
s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) {
s32 ret = 0;
s32 i;
@@ -42,8 +43,12 @@ s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int
ptr += channel;
}
+#if BUILD_VERSION >= VERSION_J
READFORMAT(ptr)->addrh = address >> 3;
READFORMAT(ptr)->addrl = ((address << 5) | __osContAddressCrc(address));
+#else
+ READFORMAT(ptr)->address = (address << 0x5) | __osContAddressCrc(address);
+#endif
bcopy(buffer, READFORMAT(ptr)->data, BLOCKSIZE);
@@ -73,3 +78,88 @@ s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int
return ret;
}
+#else
+
+static void __osPackRamWriteData(int channel, u16 address, u8 *buffer);
+
+s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) {
+ s32 ret = 0;
+ s32 i;
+ u8* ptr = (u8*)&__osPfsPifRam;
+ __OSContRamReadFormat ramreadformat;
+ s32 retry = 2;
+ u8 crc;
+
+ if ((force != TRUE) && (address < PFS_LABEL_AREA) && (address != 0)) {
+ return 0;
+ }
+
+ __osSiGetAccess();
+ __osContLastCmd = CONT_CMD_WRITE_PAK;
+ __osPackRamWriteData(channel, address, buffer);
+ ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ do {
+ ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ ptr = (u8*)&__osPfsPifRam;
+
+ if (channel != 0) {
+ for (i = 0; i < channel; i++) {
+ ptr++;
+ }
+ }
+
+ ramreadformat = *READFORMAT(ptr);
+
+ ret = CHNL_ERR(ramreadformat);
+ if (ret == 0) {
+ if (__osContDataCrc(buffer) != ramreadformat.datacrc) {
+ ret = __osPfsGetStatus(mq, channel);
+
+ if (ret != 0) {
+ __osSiRelAccess();
+ return ret;
+ }
+
+ ret = PFS_ERR_CONTRFAIL;
+ }
+ } else {
+ ret = PFS_ERR_NOPACK;
+ }
+ } while ((ret == PFS_ERR_CONTRFAIL) && retry-- >= 0);
+
+ __osSiRelAccess();
+
+ return ret;
+}
+
+static void __osPackRamWriteData(int channel, u16 address, u8 *buffer) {
+ u8 *ptr;
+ __OSContRamReadFormat ramreadformat;
+ int i;
+
+ ptr = (u8 *)__osPfsPifRam.ramarray;
+ __osPfsPifRam.pifstatus = CONT_CMD_EXE;
+ ramreadformat.dummy = CONT_CMD_NOP;
+ ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX;
+ ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX;
+ ramreadformat.cmd = CONT_CMD_WRITE_PAK;
+ ramreadformat.address = (address << 0x5) | __osContAddressCrc(address);
+ ramreadformat.datacrc = CONT_CMD_NOP;
+
+ for (i = 0; i < ARRLEN(ramreadformat.data); i++) {
+ ramreadformat.data[i] = *buffer++;
+ }
+
+ if (channel != 0) {
+ for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
+ }
+
+ *(__OSContRamReadFormat *)ptr = ramreadformat;
+ ptr += sizeof(__OSContRamReadFormat);
+ ptr[0] = CONT_CMD_END;
+}
+
+#endif
diff --git a/lib/ultralib/src/io/controller.h b/lib/ultralib/src/io/controller.h
index ef67aa4..5dac7f5 100644
--- a/lib/ultralib/src/io/controller.h
+++ b/lib/ultralib/src/io/controller.h
@@ -2,6 +2,7 @@
#define _CONTROLLER_H
#include "PR/os_internal.h"
+#include "PR/os_version.h"
#include "PR/rcp.h"
//should go somewhere else but
@@ -53,8 +54,12 @@ typedef struct
/* 0x1 */ u8 txsize;
/* 0x2 */ u8 rxsize;
/* 0x3 */ u8 cmd;
+#if BUILD_VERSION >= VERSION_J
/* 0x4 */ u8 addrh;
/* 0x5 */ u8 addrl;
+#else
+ /* 0x4 */ u16 address;
+#endif
/* 0x6 */ u8 data[BLOCKSIZE];
/* 0x26 */ u8 datacrc;
} __OSContRamReadFormat;
@@ -204,9 +209,17 @@ s32 __osCheckPackId(OSPfs *pfs, __OSPackId *temp);
s32 __osGetId(OSPfs *pfs);
s32 __osCheckId(OSPfs *pfs);
s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank);
+#if BUILD_VERSION >= VERSION_J
s32 __osPfsSelectBank(OSPfs *pfs, u8 bank);
+#else
+s32 __osPfsSelectBank(OSPfs *pfs);
+#endif
s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page);
+#if BUILD_VERSION >= VERSION_J
s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u8 bank, __OSInodeUnit *last_page);
+#else
+s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u16 *sum, u8 bank, __OSInodeUnit *last_page, int flag);
+#endif
s32 __osBlockSum(OSPfs *pfs, u8 page_no, u16 *sum, u8 bank);
s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer);
s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force);
@@ -233,21 +246,40 @@ extern u8 __osMaxControllers;
if (ret != 0) \
return ret
-#define SET_ACTIVEBANK_TO_ZERO \
- if (pfs->activebank != 0) \
- { \
+#if BUILD_VERSION >= VERSION_J
+
+#define SELECT_BANK(pfs, bank) \
+ __osPfsSelectBank((pfs), (bank))
+
+#define SET_ACTIVEBANK_TO_ZERO() \
+ if (pfs->activebank != 0) \
+ { \
ERRCK(__osPfsSelectBank(pfs, 0)); \
} (void)0
-#define PFS_CHECK_ID \
+#else
+
+#define SELECT_BANK(pfs, bank) \
+ (pfs->activebank = (bank), __osPfsSelectBank((pfs)))
+
+#define SET_ACTIVEBANK_TO_ZERO() \
+ if (pfs->activebank != 0) \
+ { \
+ pfs->activebank = 0; \
+ ERRCK(__osPfsSelectBank(pfs)); \
+ } (void)0
+
+#endif
+
+#define PFS_CHECK_ID() \
if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) \
return PFS_ERR_NEW_PACK
-#define PFS_CHECK_STATUS \
+#define PFS_CHECK_STATUS() \
if ((pfs->status & PFS_INITIALIZED) == 0) \
return PFS_ERR_INVALID
-#define PFS_GET_STATUS \
+#define PFS_GET_STATUS() \
__osSiGetAccess(); \
ret = __osPfsGetStatus(queue, channel); \
__osSiRelAccess(); \
diff --git a/lib/ultralib/src/io/crc.c b/lib/ultralib/src/io/crc.c
index 05f2698..3293b2d 100644
--- a/lib/ultralib/src/io/crc.c
+++ b/lib/ultralib/src/io/crc.c
@@ -1,5 +1,7 @@
#include "PR/os_internal.h"
+#if BUILD_VERSION >= VERSION_J
+
u8 __osContAddressCrc(u16 addr) {
u32 temp = 0;
u32 i = 0x400;
@@ -64,3 +66,49 @@ u8 __osContDataCrc(u8* data) {
return temp;
}
+
+#else
+
+u8 __osContAddressCrc(u16 addr) {
+ u8 temp = 0;
+ u8 temp2;
+ int i;
+
+ for (i = 0; i < 16; i++) {
+ temp2 = (temp & 0x10) ? 0x15 : 0;
+
+ temp <<= 1;
+ temp |= (u8)((addr & 0x400) ? 1 : 0);
+ addr <<= 1;
+ temp ^= temp2;
+ }
+
+ return temp & 0x1f;
+}
+
+u8 __osContDataCrc(u8 *data) {
+ u8 temp = 0;
+ u8 temp2;
+ int i;
+ int j;
+
+ for (i = 0; i <= 32; i++) {
+ for (j = 7; j > -1; j--) {
+ temp2 = (temp & 0x80) ? 0x85 : 0;
+
+ temp <<= 1;
+
+ if (i == 32) {
+ temp &= -1;
+ } else {
+ temp |= ((*data & (1 << j)) ? 1 : 0);
+ }
+
+ temp ^= temp2;
+ }
+ data++;
+ }
+ return temp;
+}
+
+#endif
diff --git a/lib/ultralib/src/io/driverominit.c b/lib/ultralib/src/io/driverominit.c
new file mode 100644
index 0000000..d73d349
--- /dev/null
+++ b/lib/ultralib/src/io/driverominit.c
@@ -0,0 +1,31 @@
+#include "PR/os_internal.h"
+#include "PR/rcp.h"
+#include "macros.h"
+
+OSPiHandle DriveRomHandle ALIGNED(8);
+
+OSPiHandle *osDriveRomInit() {
+ u32 saveMask;
+
+ if (DriveRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR1)) {
+ return &DriveRomHandle;
+ }
+
+ DriveRomHandle.type = DEVICE_TYPE_BULK;
+ DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1);
+ DriveRomHandle.latency = 64;
+ DriveRomHandle.pulse = 7;
+ DriveRomHandle.pageSize = 7;
+ DriveRomHandle.relDuration = 2;
+ DriveRomHandle.domain = PI_DOMAIN1;
+ DriveRomHandle.speed = 0;
+
+ bzero(&DriveRomHandle.transferInfo, sizeof(__OSTranxInfo));
+
+ saveMask = __osDisableInt();
+ DriveRomHandle.next = __osPiTable;
+ __osPiTable = &DriveRomHandle;
+ __osRestoreInt(saveMask);
+
+ return &DriveRomHandle;
+}
diff --git a/lib/ultralib/src/io/epirawread.c b/lib/ultralib/src/io/epirawread.c
index 7794eb8..500a2ce 100644
--- a/lib/ultralib/src/io/epirawread.c
+++ b/lib/ultralib/src/io/epirawread.c
@@ -21,10 +21,10 @@
-
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 28
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
@@ -38,9 +38,8 @@ s32 __osEPiRawReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) {
__osError(ERR_OSPIRAWREADIO, 1, devAddr);
return -1;
}
-
- assert(data != NULL);
#endif
+ assert(data != NULL);
EPI_SYNC(pihandle, stat, domain);
*data = IO_READ(pihandle->baseAddress | devAddr);
diff --git a/lib/ultralib/src/io/gbpakinit.c b/lib/ultralib/src/io/gbpakinit.c
index d3f19b1..102d962 100644
--- a/lib/ultralib/src/io/gbpakinit.c
+++ b/lib/ultralib/src/io/gbpakinit.c
@@ -76,7 +76,7 @@ s32 osGbpakInit(OSMesgQueue* mq, OSPfs* pfs, int channel) {
ERRCK(__osPfsGetStatus(mq, channel));
osCreateMesgQueue(&__osGbpakTimerQ, &__osGbpakTimerMsg, 1);
- osSetTimer(&__osGbpakTimer, 9000000, 0, &__osGbpakTimerQ, &__osGbpakTimerMsg);
+ osSetTimer(&__osGbpakTimer, OS_USEC_TO_CYCLES(192000), 0, &__osGbpakTimerQ, &__osGbpakTimerMsg);
osRecvMesg(&__osGbpakTimerQ, NULL, OS_MESG_BLOCK);
pfs->queue = mq;
pfs->status = PFS_GBPAK_INITIALIZED;
diff --git a/lib/ultralib/src/io/gbpakreadid.c b/lib/ultralib/src/io/gbpakreadid.c
index f35ef25..3e2fa19 100644
--- a/lib/ultralib/src/io/gbpakreadid.c
+++ b/lib/ultralib/src/io/gbpakreadid.c
@@ -1,13 +1,16 @@
#include "macros.h"
#include "PR/os_internal.h"
#include "controller.h"
+#include "os_version.h"
s32 osGbpakReadId(OSPfs* pfs, OSGbpakId* id, u8* status) {
s32 i;
s32 ret;
u8 isum;
u8 buf[96];
+#if BUILD_VERSION >= VERSION_K
u8 temp[32];
+#endif
static u8 nintendo[] = { 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83,
0x00, 0x0C, 0x00, 0x0D, 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99, 0xBB, 0xBB, 0x67, 0x63,
@@ -44,6 +47,7 @@ s32 osGbpakReadId(OSPfs* pfs, OSGbpakId* id, u8* status) {
return PFS_ERR_CONTRFAIL;
}
+#if BUILD_VERSION >= VERSION_K
if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) {
for (i = 0; i < ARRLEN(temp); temp[i++] = 0) {
;
@@ -67,6 +71,11 @@ s32 osGbpakReadId(OSPfs* pfs, OSGbpakId* id, u8* status) {
return 4;
}
}
+#else
+ if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) {
+ return 4;
+ }
+#endif
for (i = 0x34, isum = 0; i < 0x4E; i++) {
isum += buf[i];
}
diff --git a/lib/ultralib/src/io/gbpakreadwrite.c b/lib/ultralib/src/io/gbpakreadwrite.c
index c73b536..a6d4b02 100644
--- a/lib/ultralib/src/io/gbpakreadwrite.c
+++ b/lib/ultralib/src/io/gbpakreadwrite.c
@@ -1,5 +1,6 @@
#include "PR/os_internal.h"
#include "controller.h"
+#include "os_version.h"
s32 __osGbpakSetBank(OSPfs* pfs, u8 bank);
@@ -18,9 +19,11 @@ s32 osGbpakReadWrite(OSPfs* pfs, u16 flag, u16 address, u8* buffer, u16 size) {
}
}
+#if BUILD_VERSION >= VERSION_K
if (size == 0) {
return 0;
}
+#endif
size = (u16)(size >> 5);
address = (u16)((address | 0xC000) >> 5);
diff --git a/lib/ultralib/src/io/leodiskinit.c b/lib/ultralib/src/io/leodiskinit.c
new file mode 100644
index 0000000..e9f140b
--- /dev/null
+++ b/lib/ultralib/src/io/leodiskinit.c
@@ -0,0 +1,36 @@
+// This file was removed in 2.0J
+#include "PR/os_internal.h"
+#include "PR/os_libc.h"
+#include "PR/rcp.h"
+#include "macros.h"
+
+OSPiHandle LeoDiskHandle ALIGNED(8);
+OSPiHandle *__osDiskHandle;
+
+OSPiHandle *osLeoDiskInit() {
+ u32 saveMask;
+
+ LeoDiskHandle.type = DEVICE_TYPE_64DD;
+ LeoDiskHandle.baseAddress = PHYS_TO_K1(PI_DOM2_ADDR1);
+ LeoDiskHandle.latency = 3;
+ LeoDiskHandle.pulse = 6;
+ LeoDiskHandle.pageSize = 6;
+ LeoDiskHandle.relDuration = 2;
+ LeoDiskHandle.domain = PI_DOMAIN2;
+
+ IO_WRITE(PI_BSD_DOM2_LAT_REG, LeoDiskHandle.latency);
+ IO_WRITE(PI_BSD_DOM2_PWD_REG, LeoDiskHandle.pulse);
+ IO_WRITE(PI_BSD_DOM2_PGS_REG, LeoDiskHandle.pageSize);
+ IO_WRITE(PI_BSD_DOM2_RLS_REG, LeoDiskHandle.relDuration);
+ LeoDiskHandle.speed = 0;
+
+ bzero(&LeoDiskHandle.transferInfo, sizeof(__OSTranxInfo));
+
+ saveMask = __osDisableInt();
+ LeoDiskHandle.next = __osPiTable;
+ __osPiTable = &LeoDiskHandle;
+ __osDiskHandle = &LeoDiskHandle;
+ __osRestoreInt(saveMask);
+
+ return &LeoDiskHandle;
+}
diff --git a/lib/ultralib/src/io/leointerrupt.c b/lib/ultralib/src/io/leointerrupt.c
new file mode 100644
index 0000000..ad34e45
--- /dev/null
+++ b/lib/ultralib/src/io/leointerrupt.c
@@ -0,0 +1,194 @@
+#include "PR/os_internal.h"
+#include "PR/rcp.h"
+#include "../os/osint.h"
+#include "piint.h"
+#include "macros.h"
+
+extern OSPiHandle *__osDiskHandle;
+
+u8 leoDiskStack[OS_PIM_STACKSIZE] ALIGNED(16);
+
+static void __osLeoAbnormalResume(void);
+static void __osLeoResume(void);
+
+s32 __osLeoInterrupt() {
+ u32 stat = 0;
+ volatile u32 pi_stat;
+ u32 bm_stat;
+ __OSTranxInfo *info = &__osDiskHandle->transferInfo;
+ __OSBlockInfo *blockInfo = &info->block[info->blockNum];
+
+ pi_stat = IO_READ(PI_STATUS_REG);
+ if (pi_stat & PI_STATUS_DMA_BUSY) {
+ __OSGlobalIntMask = __OSGlobalIntMask & ~SR_IBIT4; //cart interrupt
+ blockInfo->errStatus = LEO_ERROR_29;
+ __osLeoResume();
+ return 1;
+ }
+
+ WAIT_ON_IOBUSY(pi_stat);
+ stat = IO_READ(LEO_STATUS);
+ if (stat & LEO_STATUS_MECHANIC_INTERRUPT) {
+ WAIT_ON_IOBUSY(pi_stat);
+ IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR);
+ blockInfo->errStatus = LEO_ERROR_GOOD;
+ return 0;
+ }
+
+ if (info->cmdType == LEO_CMD_TYPE_2) {
+ return 1;
+ }
+
+ if (stat & LEO_STATUS_BUFFER_MANAGER_ERROR) {
+ WAIT_ON_IOBUSY(pi_stat);
+ stat = IO_READ(LEO_STATUS);
+ blockInfo->errStatus = LEO_ERROR_22;
+ __osLeoResume();
+ IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
+ __OSGlobalIntMask |= OS_IM_PI;
+ return 1;
+ }
+
+ if (info->cmdType == LEO_CMD_TYPE_1) {
+ if ((stat & LEO_STATUS_DATA_REQUEST) == 0) {
+ if (info->sectorNum + 1 != info->transferMode * 85) {
+ blockInfo->errStatus = LEO_ERROR_24;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+
+ IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
+ __OSGlobalIntMask |= OS_IM_PI;
+ blockInfo->errStatus = LEO_ERROR_GOOD;
+ __osLeoResume();
+ return 1;
+ } else {
+ blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr + blockInfo->sectorSize);
+ info->sectorNum++;
+ __osEPiRawStartDma(__osDiskHandle, OS_WRITE, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize);
+ return 1;
+ }
+ } else if (info->cmdType == LEO_CMD_TYPE_0) {
+ if (info->transferMode == LEO_SECTOR_MODE) {
+ if (info->sectorNum > (s32)blockInfo->C1ErrNum + 17) {
+ blockInfo->errStatus = LEO_ERROR_GOOD;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+
+ if ((stat & LEO_STATUS_DATA_REQUEST) == 0) {
+ blockInfo->errStatus = LEO_ERROR_23;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+ } else {
+ blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr + blockInfo->sectorSize);
+ }
+
+ bm_stat = IO_READ(LEO_BM_STATUS);
+ if ((bm_stat & LEO_BM_STATUS_C1SINGLE && bm_stat & LEO_BM_STATUS_C1DOUBLE) || bm_stat & LEO_BM_STATUS_MICRO) {
+ if (blockInfo->C1ErrNum > 3) {
+ if (info->transferMode != LEO_SECTOR_MODE || info->sectorNum > 0x52) {
+ blockInfo->errStatus = LEO_ERROR_23;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+ } else {
+ int errNum = blockInfo->C1ErrNum;
+ blockInfo->C1ErrSector[errNum] = info->sectorNum + 1;
+ }
+
+ blockInfo->C1ErrNum++;
+ }
+
+ if (stat & LEO_STATUS_C2_TRANSFER) {
+ if (info->sectorNum + 1 != 88) {
+ blockInfo->errStatus = LEO_ERROR_24;
+ __osLeoAbnormalResume();
+ }
+
+ if (info->transferMode == LEO_TRACK_MODE && info->blockNum == 0) {
+ info->blockNum = 1;
+ info->sectorNum = -1;
+ info->block[1].dramAddr = (void *)((u32)info->block[1].dramAddr - info->block[1].sectorSize);
+
+ blockInfo->errStatus = LEO_ERROR_22;
+ } else {
+ IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
+ __OSGlobalIntMask |= OS_IM_PI;
+ info->cmdType = LEO_CMD_TYPE_2;
+ blockInfo->errStatus = LEO_ERROR_GOOD;
+ }
+
+ __osEPiRawStartDma(__osDiskHandle, OS_READ, LEO_C2_BUFF, blockInfo->C2Addr, blockInfo->sectorSize * 4);
+ return 1;
+ }
+
+ if (info->sectorNum == -1 && info->transferMode == LEO_TRACK_MODE && info->blockNum == 1) {
+ __OSBlockInfo *bptr = &info->block[0];
+ if (bptr->C1ErrNum == 0) {
+ if (((u32 *)bptr->C2Addr)[0] | ((u32 *)bptr->C2Addr)[1] | ((u32 *)bptr->C2Addr)[2] | ((u32 *)bptr->C2Addr)[3]) {
+ bptr->errStatus = LEO_ERROR_24;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+ }
+
+ bptr->errStatus = 0;
+ __osLeoResume();
+ }
+ info->sectorNum++;
+ if (stat & LEO_STATUS_DATA_REQUEST) {
+ if (info->sectorNum > 0x54) {
+ blockInfo->errStatus = LEO_ERROR_24;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+
+ __osEPiRawStartDma(__osDiskHandle, 0, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize);
+ blockInfo->errStatus = LEO_ERROR_GOOD;
+ return 1;
+ } else if (info->sectorNum <= 0x54) {
+ blockInfo->errStatus = LEO_ERROR_24;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+
+ return 1;
+ } else {
+ blockInfo->errStatus = LEO_ERROR_4;
+ __osLeoAbnormalResume();
+ return 1;
+ }
+}
+
+static void __osLeoAbnormalResume(void) {
+ __OSTranxInfo *info = &__osDiskHandle->transferInfo;
+ u32 pi_stat;
+
+ WAIT_ON_IOBUSY(pi_stat);
+ IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET);
+ WAIT_ON_IOBUSY(pi_stat);
+ IO_WRITE(LEO_BM_CTL, info->bmCtlShadow);
+ __osLeoResume();
+ IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
+ __OSGlobalIntMask |= OS_IM_PI;
+}
+
+static void __osLeoResume(void) {
+ __OSEventState *es = &__osEventStateTab[OS_EVENT_PI];
+ OSMesgQueue *mq = es->messageQueue;
+ s32 last;
+
+ if (mq == NULL || MQ_IS_FULL(mq)) {
+ return;
+ }
+
+ last = (mq->first + mq->validCount) % mq->msgCount;
+ mq->msg[last] = es->message;
+ mq->validCount++;
+
+ if (mq->mtqueue->next != NULL) {
+ __osEnqueueThread(&__osRunQueue, __osPopThread(&mq->mtqueue));
+ }
+}
diff --git a/lib/ultralib/src/io/motor.c b/lib/ultralib/src/io/motor.c
index 8ad1b08..8028d69 100644
--- a/lib/ultralib/src/io/motor.c
+++ b/lib/ultralib/src/io/motor.c
@@ -1,8 +1,10 @@
#include "macros.h"
#include "PR/os_internal.h"
+#include "PR/os_version.h"
#include "controller.h"
#include "siint.h"
+#if BUILD_VERSION >= VERSION_J
static OSPifRam __MotorDataBuf[MAXCONTROLLERS] ALIGNED(8);
#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
@@ -80,10 +82,10 @@ s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) {
pfs->activebank = 0xFF;
pfs->status = 0;
- ret = __osPfsSelectBank(pfs, 0xFE);
+ ret = SELECT_BANK(pfs, 0xFE);
if (ret == PFS_ERR_NEW_PACK) {
- ret = __osPfsSelectBank(pfs, 0x80);
+ ret = SELECT_BANK(pfs, 0x80);
}
if (ret != 0) {
@@ -102,7 +104,7 @@ s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) {
return PFS_ERR_DEVICE;
}
- ret = __osPfsSelectBank(pfs, 0x80);
+ ret = SELECT_BANK(pfs, 0x80);
if (ret == PFS_ERR_NEW_PACK) {
ret = PFS_ERR_CONTRFAIL;
}
@@ -129,3 +131,202 @@ s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) {
pfs->status = PFS_MOTOR_INITIALIZED;
return 0;
}
+
+#else
+
+OSPifRam _MotorStopData[MAXCONTROLLERS] ALIGNED(8);
+OSPifRam _MotorStartData[MAXCONTROLLERS] ALIGNED(8);
+u8 _motorstopbuf[32] ALIGNED(8);
+u8 _motorstartbuf[32] ALIGNED(8);
+u32 __osMotorinitialized[MAXCONTROLLERS] = {0, 0, 0, 0};
+
+s32 osMotorStop(OSPfs *pfs) {
+ int i;
+ s32 ret;
+ u8 *ptr;
+ __OSContRamReadFormat ramreadformat;
+
+ ptr = (u8 *)&__osPfsPifRam;
+
+ if (!__osMotorinitialized[pfs->channel]) {
+ return PFS_ERR_INVALID;
+ }
+
+ __osSiGetAccess();
+
+ __osContLastCmd = CONT_CMD_WRITE_PAK;
+ __osSiRawStartDma(OS_WRITE, &_MotorStopData[pfs->channel]);
+ osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
+ ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
+ ptr = (u8 *)&__osPfsPifRam;
+
+ if (pfs->channel != 0) {
+ for (i = 0; i < pfs->channel; i++) {
+ ptr++;
+ }
+ }
+
+ ramreadformat = *(__OSContRamReadFormat *)ptr;
+ ret = CHNL_ERR(ramreadformat);
+
+ if (ret == 0 && __osContDataCrc((u8*)&_motorstopbuf) != ramreadformat.datacrc) {
+ ret = PFS_ERR_CONTRFAIL;
+ }
+
+ __osSiRelAccess();
+ return ret;
+}
+
+s32 osMotorStart(OSPfs *pfs) {
+
+ int i;
+ s32 ret;
+ u8 *ptr;
+ __OSContRamReadFormat ramreadformat;
+
+ ptr = (u8 *)&__osPfsPifRam;
+
+ if (!__osMotorinitialized[pfs->channel]) {
+ return PFS_ERR_INVALID;
+ }
+
+ __osSiGetAccess();
+
+ __osContLastCmd = CONT_CMD_WRITE_PAK;
+ __osSiRawStartDma(OS_WRITE, &_MotorStartData[pfs->channel]);
+ osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
+ ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
+ ptr = (u8 *)&__osPfsPifRam;
+
+ if (pfs->channel != 0) {
+ for (i = 0; i < pfs->channel; i++) {
+ ptr++;
+ }
+ }
+
+ ramreadformat = *(__OSContRamReadFormat *)ptr;
+ ret = CHNL_ERR(ramreadformat);
+
+ if (ret == 0 && __osContDataCrc((u8*)&_motorstartbuf) != ramreadformat.datacrc) {
+ ret = PFS_ERR_CONTRFAIL;
+ }
+
+ __osSiRelAccess();
+ return ret;
+}
+
+static void _MakeMotorData(int channel, u16 address, u8 *buffer, OSPifRam *mdata)
+{
+ u8 *ptr = (u8 *)mdata->ramarray;
+ __OSContRamReadFormat ramreadformat;
+ int i;
+
+ for (i = 0; i < ARRLEN(mdata->ramarray); i++) {
+ mdata->ramarray[i] = 0;
+ }
+
+ mdata->pifstatus = CONT_CMD_EXE;
+ ramreadformat.dummy = CONT_CMD_NOP;
+ ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX;
+ ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX;
+ ramreadformat.cmd = CONT_CMD_WRITE_PAK;
+
+ ramreadformat.address = (address << 0x5) | __osContAddressCrc(address);
+ ramreadformat.datacrc = CONT_CMD_NOP;
+
+ for (i = 0; i < ARRLEN(ramreadformat.data); i++) {
+ ramreadformat.data[i] = *buffer++;
+ }
+
+ if (channel != 0) {
+ for (i = 0; i < channel; i++) {
+ *ptr++ = 0;
+ }
+ }
+
+ *(__OSContRamReadFormat *)ptr = ramreadformat;
+ ptr += sizeof(__OSContRamReadFormat);
+ ptr[0] = CONT_CMD_END;
+}
+
+s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) {
+ int i;
+ s32 ret;
+ u8 temp[32];
+
+ pfs->queue = mq;
+ pfs->channel = channel;
+ pfs->status = 0;
+ pfs->activebank = 128;
+
+ for (i = 0; i < ARRLEN(temp); i++) {
+ temp[i] = 254;
+ }
+
+ ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE);
+
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE);
+ }
+
+ if (ret != 0) {
+ return ret;
+ }
+
+ ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp);
+
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = PFS_ERR_CONTRFAIL;
+ }
+
+ if (ret != 0) {
+ return ret;
+ }
+
+ if (temp[31] == 254) {
+ return PFS_ERR_DEVICE;
+ }
+
+ for (i = 0; i < ARRLEN(temp); i++) {
+ temp[i] = 128;
+ }
+
+ ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE);
+
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE);
+ }
+
+ if (ret != 0) {
+ return ret;
+ }
+
+ ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp);
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = PFS_ERR_CONTRFAIL;
+ }
+
+ if (ret != 0) {
+ return ret;
+ }
+
+ if (temp[31] != 0x80) {
+ return PFS_ERR_DEVICE;
+ }
+
+ if (!__osMotorinitialized[channel]) {
+ for (i = 0; i < ARRLEN(_motorstartbuf); i++) {
+ _motorstartbuf[i] = 1;
+ _motorstopbuf[i] = 0;
+ }
+ _MakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstartbuf, &_MotorStartData[channel]);
+ _MakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstopbuf, &_MotorStopData[channel]);
+ __osMotorinitialized[channel] = 1;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/lib/ultralib/src/io/pfsallocatefile.c b/lib/ultralib/src/io/pfsallocatefile.c
index 5e1a85f..24f6fe7 100644
--- a/lib/ultralib/src/io/pfsallocatefile.c
+++ b/lib/ultralib/src/io/pfsallocatefile.c
@@ -4,6 +4,8 @@
#define ROUND_UP_DIVIDE(numerator, denominator) (((numerator) + (denominator)-1) / (denominator))
+#if BUILD_VERSION >= VERSION_J
+
s32 osPfsAllocateFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, int file_size_in_bytes,
s32* file_no) {
int start_page;
@@ -144,6 +146,193 @@ s32 __osPfsDeclearPage(OSPfs* pfs, __OSInode* inode, int file_size_in_pages, int
return ret;
}
+#else
+
+static s32 __osClearPage(OSPfs *pfs, int page_num, u8 *data, u8 bank);
+
+s32 osPfsAllocateFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, int file_size_in_bytes,
+ s32* file_no) {
+ int start_page;
+ int decleared;
+ int last_page;
+ int old_last_page = 0;
+ int j;
+ s32 ret = 0;
+ int file_size_in_pages;
+ __OSInode inode;
+ __OSInode backup_inode;
+ __OSDir dir;
+ u8 bank;
+ u8 old_bank = 0;
+ int firsttime = 0;
+ s32 bytes;
+ __OSInodeUnit fpage;
+
+ if (company_code == 0 || game_code == 0) {
+ return PFS_ERR_INVALID;
+ }
+
+ file_size_in_pages = ROUND_UP_DIVIDE(file_size_in_bytes, BLOCKSIZE * PFS_ONE_PAGE);
+
+ if ((pfs->status & PFS_INITIALIZED) == FALSE) {
+ return PFS_ERR_INVALID;
+ }
+
+ PFS_CHECK_ID();
+
+ if (((ret = osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, file_no)) != 0) &&
+ ret != PFS_ERR_INVALID) {
+ return ret;
+ }
+
+ if (*file_no != -1) {
+ return PFS_ERR_EXIST;
+ }
+
+ ret = osPfsFreeBlocks(pfs, &bytes);
+
+ if (file_size_in_bytes > bytes) {
+ return PFS_DATA_FULL;
+ }
+
+ if (file_size_in_pages != 0) {
+
+ if (((ret = osPfsFindFile(pfs, 0, 0, NULL, NULL, file_no)) != 0) && ret != PFS_ERR_INVALID) {
+ return ret;
+ }
+
+ if (*file_no == -1) {
+ return PFS_DIR_FULL;
+ }
+
+ for (bank = 0; bank < pfs->banks; bank++) {
+ ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank));
+ ERRCK(__osPfsDeclearPage(pfs, &inode, file_size_in_pages, &start_page, bank, &decleared, &last_page));
+
+ if (start_page != -1) {
+ if (firsttime == 0) {
+ fpage.inode_t.page = start_page;
+ fpage.inode_t.bank = bank;
+ } else {
+ backup_inode.inode_page[old_last_page].inode_t.bank = bank;
+ backup_inode.inode_page[old_last_page].inode_t.page = start_page;
+ ERRCK(__osPfsRWInode(pfs, &backup_inode, PFS_WRITE, old_bank));
+ }
+
+ for (j = 0; j < ARRLEN(inode.inode_page); j++) {
+ backup_inode.inode_page[j].ipage = inode.inode_page[j].ipage;
+ }
+ old_last_page = last_page;
+ old_bank = bank;
+ firsttime++;
+ if (file_size_in_pages > decleared) {
+ file_size_in_pages = file_size_in_pages - decleared;
+ } else {
+ file_size_in_pages = 0;
+ break;
+ }
+ }
+ }
+
+ if (file_size_in_pages > 0 || start_page == -1) {
+ return PFS_ERR_INCONSISTENT;
+ }
+
+ backup_inode.inode_page[old_last_page].inode_t.bank = bank;
+ backup_inode.inode_page[old_last_page].inode_t.page = start_page;
+ ERRCK(__osPfsRWInode(pfs, &backup_inode, OS_WRITE, old_bank));
+
+ dir.start_page = fpage;
+ dir.company_code = company_code;
+ dir.game_code = game_code;
+ dir.data_sum = 0;
+
+ for (j = 0; j < ARRLEN(dir.game_name); j++)
+ dir.game_name[j] = *game_name++;
+ for (j = 0; j < ARRLEN(dir.ext_name); j++)
+ dir.ext_name[j] = *ext_name++;
+
+ ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + *file_no, (u8*)&dir, FALSE));
+ return ret;
+ } else {
+ return PFS_ERR_INVALID;
+ }
+}
+
+s32 __osPfsDeclearPage(OSPfs* pfs, __OSInode* inode, int file_size_in_pages, int* first_page, u8 bank, int* decleared,
+ int* last_page) {
+ int j;
+ int spage;
+ int old_page;
+ u8 tmp_data[BLOCKSIZE];
+ int i;
+ s32 ret = 0;
+ int offset = bank > 0 ? 1 : pfs->inode_start_page;
+
+ for (j = offset; j < ARRLEN(inode->inode_page); j++) {
+ if (inode->inode_page[j].ipage == 3) {
+ break;
+ }
+ }
+
+ if (j == ARRLEN(inode->inode_page)) {
+ *first_page = -1;
+ return ret;
+ }
+
+ for (i = 0; i < ARRLEN(tmp_data); i++) {
+ tmp_data[i] = 0;
+ }
+
+ spage = j;
+ *decleared = 1;
+ old_page = j;
+ j++;
+
+ while (file_size_in_pages > *decleared && j < ARRLEN(inode->inode_page)) {
+ if (inode->inode_page[j].ipage == 3) {
+ inode->inode_page[old_page].inode_t.bank = bank;
+ inode->inode_page[old_page].inode_t.page = j;
+ ERRCK(__osClearPage(pfs, old_page, (u8*)tmp_data, bank));
+ old_page = j;
+ (*decleared)++;
+ }
+ j++;
+ }
+
+ *first_page = spage;
+
+ if (j == ARRLEN(inode->inode_page) && file_size_in_pages > *decleared) {
+ *last_page = old_page;
+ return ret;
+ } else {
+ inode->inode_page[old_page].ipage = 1;
+ ret = __osClearPage(pfs, old_page, (u8*)tmp_data, bank);
+ *last_page = 0;
+ return ret;
+ }
+}
+
+static s32 __osClearPage(OSPfs *pfs, int page_no, u8 *data, u8 bank)
+{
+ int i;
+ s32 ret;
+ ret = 0;
+ pfs->activebank = bank;
+ ERRCK(__osPfsSelectBank(pfs));
+ for (i = 0; i < PFS_ONE_PAGE; i++) {
+ ret = __osContRamWrite(pfs->queue, pfs->channel, page_no * PFS_ONE_PAGE + i, data, FALSE);
+ if (ret != 0) {
+ break;
+ }
+ }
+ pfs->activebank = 0;
+ ret = __osPfsSelectBank(pfs);
+ return ret;
+}
+
+#endif
+
#ifdef _DEBUG
s32 __osDumpInode(OSPfs* pfs) {
int j;
@@ -151,11 +340,17 @@ s32 __osDumpInode(OSPfs* pfs) {
s32 ret = 0;
__OSDir dir;
u8 bank;
+#if BUILD_VERSION >= VERSION_J
u8 startbank = PFS_ID_BANK_256K;
+#endif
rmonPrintf("INODE:\n");
+#if BUILD_VERSION >= VERSION_J
for (bank = startbank; bank < pfs->banks; bank++) {
+#else
+ for (bank = 0; bank < pfs->banks; bank++) {
+#endif
rmonPrintf("\nBank %d:\n", bank);
ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank);
for (j = 0; j < PFS_INODE_SIZE_PER_PAGE; j++) {
diff --git a/lib/ultralib/src/io/pfschecker.c b/lib/ultralib/src/io/pfschecker.c
index 6830c0e..b736200 100644
--- a/lib/ultralib/src/io/pfschecker.c
+++ b/lib/ultralib/src/io/pfschecker.c
@@ -19,7 +19,9 @@ s32 osPfsChecker(OSPfs* pfs) {
__OSInodeCache cache;
int fixed = 0;
u8 bank;
+#if BUILD_VERSION >= VERSION_J
u8 oldbank = 254;
+#endif
s32 cc;
s32 cl;
int offset;
@@ -39,6 +41,7 @@ s32 osPfsChecker(OSPfs* pfs) {
for (j = 0; j < pfs->dir_size; j++) {
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir));
+#if BUILD_VERSION >= VERSION_J
if (tmp_dir.company_code != 0 || tmp_dir.game_code != 0) {
if (tmp_dir.company_code == 0 || tmp_dir.game_code == 0) {
cc = -1;
@@ -73,11 +76,59 @@ s32 osPfsChecker(OSPfs* pfs) {
if (cc != 0 || next_page.ipage != PFS_EOF) {
bzero(&tmp_dir, sizeof(__OSDir));
- SET_ACTIVEBANK_TO_ZERO;
+ SET_ACTIVEBANK_TO_ZERO();
ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir, FALSE));
fixed++;
}
}
+#else
+ if (tmp_dir.company_code != 0 && tmp_dir.game_code != 0) {
+ next_page = tmp_dir.start_page;
+ cl = cc = 0;
+ bank = 255;
+
+ while (CHECK_IPAGE(next_page)) {
+ if (bank != next_page.inode_t.bank) {
+ bank = next_page.inode_t.bank;
+ ret = __osPfsRWInode(pfs, &tmp_inode, OS_READ, bank);
+ if (ret != 0 && ret != PFS_ERR_INCONSISTENT) {
+ return ret;
+ }
+ }
+
+ if ((cc = corrupted(pfs, next_page, &cache) - cl) != 0) {
+ break;
+ }
+
+ cl = 1;
+ next_page = tmp_inode.inode_page[next_page.inode_t.page];
+ }
+
+ if (cc != 0 || next_page.ipage != PFS_EOF) {
+ tmp_dir.company_code = 0;
+ tmp_dir.game_code = 0;
+ tmp_dir.start_page.ipage = 0;
+ tmp_dir.status = DIR_STATUS_EMPTY;
+ tmp_dir.data_sum = 0;
+
+ SET_ACTIVEBANK_TO_ZERO();
+ ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir, FALSE));
+ fixed++;
+ }
+ } else {
+ if (tmp_dir.company_code != 0 || tmp_dir.game_code != 0) {
+ tmp_dir.company_code = 0;
+ tmp_dir.game_code = 0;
+ tmp_dir.start_page.ipage = 0;
+ tmp_dir.status = DIR_STATUS_EMPTY;
+ tmp_dir.data_sum = 0;
+
+ SET_ACTIVEBANK_TO_ZERO();
+ ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir, FALSE));
+ fixed++;
+ }
+ }
+#endif
}
for (j = 0; j < pfs->dir_size; j++) {
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir));
@@ -152,8 +203,13 @@ s32 corrupted_init(OSPfs* pfs, __OSInodeCache* cache) {
tpage = tmp_inode.inode_page[i];
if (tpage.ipage >= pfs->inode_start_page && tpage.inode_t.bank != bank) {
+#if BUILD_VERSION >= VERSION_J
n = ((tpage.inode_t.page & 0x7F) / PFS_SECTOR_SIZE) +
((tpage.inode_t.bank % PFS_BANK_LAPPED_BY) * BLOCKSIZE);
+#else
+ n = ((tpage.inode_t.page) / PFS_SECTOR_SIZE) +
+ ((tpage.inode_t.bank % PFS_BANK_LAPPED_BY) * BLOCKSIZE);
+#endif
cache->map[n] |= 1 << (bank % PFS_BANK_LAPPED_BY);
}
}
diff --git a/lib/ultralib/src/io/pfsdeletefile.c b/lib/ultralib/src/io/pfsdeletefile.c
index a55b09d..e013211 100644
--- a/lib/ultralib/src/io/pfsdeletefile.c
+++ b/lib/ultralib/src/io/pfsdeletefile.c
@@ -3,9 +3,15 @@
s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name) {
s32 file_no;
+#if BUILD_VERSION < VERSION_J
+ int k;
+#endif
s32 ret;
__OSInode inode;
__OSDir dir;
+#if BUILD_VERSION < VERSION_J
+ u16 sum = 0;
+#endif
__OSInodeUnit last_page;
u8 startpage;
u8 bank;
@@ -14,15 +20,30 @@ s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name,
return PFS_ERR_INVALID;
}
+#if BUILD_VERSION >= VERSION_J
ERRCK(osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, &file_no));
- SET_ACTIVEBANK_TO_ZERO;
+ SET_ACTIVEBANK_TO_ZERO();
+#else
+ PFS_CHECK_STATUS();
+ PFS_CHECK_ID();
+ SET_ACTIVEBANK_TO_ZERO();
+ ERRCK(osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, &file_no));
+
+ if (file_no == -1) {
+ return PFS_ERR_INVALID;
+ }
+#endif
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir));
startpage = dir.start_page.inode_t.page;
for (bank = dir.start_page.inode_t.bank; bank < pfs->banks;) {
ERRCK(__osPfsRWInode(pfs, &inode, OS_READ, bank));
+#if BUILD_VERSION >= VERSION_J
ERRCK(__osPfsReleasePages(pfs, &inode, startpage, bank, &last_page));
+#else
+ ERRCK(__osPfsReleasePages(pfs, &inode, startpage, &sum, bank, &last_page, TRUE));
+#endif
ERRCK(__osPfsRWInode(pfs, &inode, OS_WRITE, bank));
if (last_page.ipage == PFS_EOF) {
@@ -37,13 +58,31 @@ s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name,
return PFS_ERR_INCONSISTENT;
}
+#if BUILD_VERSION >= VERSION_J
bzero(&dir, sizeof(__OSDir));
+#else
+ dir.game_code = 0;
+ dir.company_code = 0;
+ dir.start_page.ipage = 0;
+ dir.data_sum = 0;
+ for (k = 0; k < ARRLEN(dir.game_name); k++)
+ {
+ dir.game_name[k] = 0;
+ }
+ for (k = 0; k < ARRLEN(dir.ext_name); k++)
+ {
+ dir.ext_name[k] = 0;
+ }
+ dir.status = DIR_STATUS_EMPTY;
+#endif
ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir, FALSE);
return ret;
}
+#if BUILD_VERSION >= VERSION_J
+
s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u8 bank, __OSInodeUnit* last_page) {
__OSInodeUnit next_page;
__OSInodeUnit old_page;
@@ -61,3 +100,81 @@ s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u8 bank, __
return ret;
}
+
+#else
+
+s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u16 *sum, u8 bank, __OSInodeUnit *last_page, int flag)
+{
+ __OSInodeUnit next_page;
+ __OSInodeUnit old_page;
+ s32 ret;
+ int offset;
+ ret = 0;
+ next_page = inode->inode_page[start_page];
+
+ if (next_page.ipage != 1) {
+ offset = (next_page.inode_t.bank > 0) ? 1 : pfs->inode_start_page;
+ } else {
+ offset = (bank > 0) ? 1 : pfs->inode_start_page;
+ }
+
+ if (next_page.inode_t.page < offset && next_page.ipage != 1) {
+ return PFS_ERR_INCONSISTENT;
+ }
+
+ *last_page = next_page;
+
+ if (flag == TRUE) {
+ inode->inode_page[start_page].ipage = 3;
+ }
+
+ ERRCK(__osBlockSum(pfs, start_page, sum, bank));
+
+ if (next_page.ipage == 1) {
+ return 0;
+ }
+
+ while (next_page.ipage >= pfs->inode_start_page) {
+ old_page = next_page;
+ next_page = inode->inode_page[next_page.inode_t.page];
+ inode->inode_page[old_page.inode_t.page].ipage = 3;
+
+ ERRCK(__osBlockSum(pfs, old_page.inode_t.page, sum, bank));
+
+ if (next_page.inode_t.bank != bank) {
+ break;
+ }
+ }
+
+ if (next_page.ipage >= pfs->inode_start_page && next_page.inode_t.bank == bank) {
+ inode->inode_page[next_page.inode_t.page].ipage = 3;
+ }
+
+ *last_page = next_page;
+ return 0;
+}
+s32 __osBlockSum(OSPfs *pfs, u8 page_no, u16 *sum, u8 bank)
+{
+ int i;
+ s32 ret;
+ u8 data[32];
+ ret = 0;
+ pfs->activebank = bank;
+ ERRCK(__osPfsSelectBank(pfs));
+ for (i = 0; i < PFS_ONE_PAGE; i++)
+ {
+ ret = __osContRamRead(pfs->queue, pfs->channel, page_no * PFS_ONE_PAGE + i, data);
+ if (ret != 0)
+ {
+ pfs->activebank = 0;
+ __osPfsSelectBank(pfs);
+ return ret;
+ }
+ *sum = *sum + __osSumcalc(data, sizeof(data));
+ }
+ pfs->activebank = 0;
+ ret = __osPfsSelectBank(pfs);
+ return ret;
+}
+
+#endif
diff --git a/lib/ultralib/src/io/pfsfilestate.c b/lib/ultralib/src/io/pfsfilestate.c
index e617887..4f80020 100644
--- a/lib/ultralib/src/io/pfsfilestate.c
+++ b/lib/ultralib/src/io/pfsfilestate.c
@@ -7,15 +7,25 @@ s32 osPfsFileState(OSPfs* pfs, s32 file_no, OSPfsState* state) {
__OSInode inode;
__OSDir dir;
__OSInodeUnit next_page;
+#if BUILD_VERSION < VERSION_J
+ int j;
+#endif
u8 bank;
+#if BUILD_VERSION < VERSION_J
+ u8 start_page;
+#endif
if (file_no >= pfs->dir_size || file_no < 0) {
return PFS_ERR_INVALID;
}
- PFS_CHECK_STATUS;
+ PFS_CHECK_STATUS();
+#if BUILD_VERSION >= VERSION_J
ERRCK(__osCheckId(pfs));
- SET_ACTIVEBANK_TO_ZERO;
+#else
+ PFS_CHECK_ID();
+#endif
+ SET_ACTIVEBANK_TO_ZERO();
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir));
@@ -23,6 +33,7 @@ s32 osPfsFileState(OSPfs* pfs, s32 file_no, OSPfsState* state) {
return PFS_ERR_INVALID;
}
+#if BUILD_VERSION >= VERSION_J
pages = 0;
next_page = dir.start_page;
bank = 0xFF;
@@ -51,4 +62,51 @@ s32 osPfsFileState(OSPfs* pfs, s32 file_no, OSPfsState* state) {
ret = __osPfsGetStatus(pfs->queue, pfs->channel);
return ret;
+#else
+ if (dir.start_page.ipage < pfs->inode_start_page) {
+ return PFS_ERR_INCONSISTENT;
+ }
+
+ pages = 0;
+ start_page = dir.start_page.inode_t.page;
+ bank = dir.start_page.inode_t.bank;
+
+ while (bank < pfs->banks) {
+ ERRCK(__osPfsRWInode(pfs, &inode, OS_READ, bank));
+ next_page = inode.inode_page[start_page];
+ pages++;
+
+ while (next_page.ipage >= pfs->inode_start_page) {
+ pages++;
+ next_page = inode.inode_page[next_page.inode_t.page];
+ if (next_page.inode_t.bank != bank) {
+ bank = next_page.inode_t.bank;
+ start_page = next_page.inode_t.page;
+ break;
+ }
+ }
+
+ if (next_page.ipage == PFS_EOF) {
+ break;
+ }
+ }
+
+ if (next_page.ipage != PFS_EOF) {
+ return PFS_ERR_INCONSISTENT;
+ }
+
+ state->file_size = pages * (PFS_ONE_PAGE * BLOCKSIZE);
+ state->company_code = dir.company_code;
+ state->game_code = dir.game_code;
+
+ for (j = 0; j < ARRLEN(state->game_name); j++) {
+ state->game_name[j] = dir.game_name[j];
+ }
+
+ for (j = 0; j < ARRLEN(state->ext_name); j++) {
+ state->ext_name[j] = dir.ext_name[j];
+ }
+
+ return 0;
+#endif
}
diff --git a/lib/ultralib/src/io/pfsfreeblocks.c b/lib/ultralib/src/io/pfsfreeblocks.c
index ad01f4f..68a54c6 100644
--- a/lib/ultralib/src/io/pfsfreeblocks.c
+++ b/lib/ultralib/src/io/pfsfreeblocks.c
@@ -9,8 +9,12 @@ s32 osPfsFreeBlocks(OSPfs* pfs, s32* bytes_not_used) {
u8 bank;
int offset;
- PFS_CHECK_STATUS;
+ PFS_CHECK_STATUS();
+#if BUILD_VERSION >= VERSION_J
ERRCK(__osCheckId(pfs));
+#else
+ PFS_CHECK_ID();
+#endif
for (bank = 0; bank < pfs->banks; bank++) {
ERRCK(__osPfsRWInode(pfs, &inode, OS_READ, bank));
offset = ((bank > 0) ? 1 : pfs->inode_start_page);
diff --git a/lib/ultralib/src/io/pfsgetlabel.c b/lib/ultralib/src/io/pfsgetlabel.c
index e8a62fd..0e4de49 100644
--- a/lib/ultralib/src/io/pfsgetlabel.c
+++ b/lib/ultralib/src/io/pfsgetlabel.c
@@ -8,7 +8,9 @@ s32 osPfsGetLabel(OSPfs* pfs, u8* label, int* len) {
return PFS_ERR_INVALID;
}
- PFS_CHECK_ID;
+ if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) {
+ return PFS_ERR_NEW_PACK;
+ }
for (i = 0; i < ARRLEN(pfs->label); i++) {
if (*(u8*)(u32)(i + pfs->label) == 0) {
diff --git a/lib/ultralib/src/io/pfsgetstatus.c b/lib/ultralib/src/io/pfsgetstatus.c
index 0fdcdaa..955412b 100644
--- a/lib/ultralib/src/io/pfsgetstatus.c
+++ b/lib/ultralib/src/io/pfsgetstatus.c
@@ -2,7 +2,11 @@
#include "controller.h"
#include "siint.h"
+#if BUILD_VERSION >= VERSION_J
void __osPfsRequestOneChannel(int channel, u8 cmd);
+#else
+void __osPfsRequestOneChannel(int channel);
+#endif
void __osPfsGetOneChannelData(int channel, OSContStatus* data);
s32 __osPfsGetStatus(OSMesgQueue* queue, int channel) {
@@ -10,9 +14,13 @@ s32 __osPfsGetStatus(OSMesgQueue* queue, int channel) {
OSMesg dummy;
OSContStatus data;
+#if BUILD_VERSION >= VERSION_J
__osPfsInodeCacheBank = 250;
__osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS);
+#else
+ __osPfsRequestOneChannel(channel);
+#endif
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
osRecvMesg(queue, &dummy, OS_MESG_BLOCK);
@@ -33,19 +41,31 @@ s32 __osPfsGetStatus(OSMesgQueue* queue, int channel) {
return ret;
}
+#if BUILD_VERSION >= VERSION_J
void __osPfsRequestOneChannel(int channel, u8 cmd) {
+#else
+void __osPfsRequestOneChannel(int channel) {
+#endif
u8* ptr;
__OSContRequesFormatShort requestformat;
int i;
+#if BUILD_VERSION >= VERSION_J
__osContLastCmd = CONT_CMD_END;
+#else
+ __osContLastCmd = CONT_CMD_REQUEST_STATUS;
+#endif
__osPfsPifRam.pifstatus = CONT_CMD_READ_BUTTON;
ptr = (u8*)&__osPfsPifRam;
requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX;
requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX;
+#if BUILD_VERSION >= VERSION_J
requestformat.cmd = cmd;
+#else
+ requestformat.cmd = CONT_CMD_REQUEST_STATUS;
+#endif
requestformat.typeh = CONT_CMD_NOP;
requestformat.typel = CONT_CMD_NOP;
requestformat.status = CONT_CMD_NOP;
diff --git a/lib/ultralib/src/io/pfsinitpak.c b/lib/ultralib/src/io/pfsinitpak.c
index 68fa5db..d3fde1f 100644
--- a/lib/ultralib/src/io/pfsinitpak.c
+++ b/lib/ultralib/src/io/pfsinitpak.c
@@ -2,9 +2,14 @@
#include "controller.h"
#include "siint.h"
+#if BUILD_VERSION >= VERSION_J
static s32 __osPfsCheckRamArea(OSPfs* pfs);
+#endif
s32 osPfsInitPak(OSMesgQueue* queue, OSPfs* pfs, int channel) {
+#if BUILD_VERSION < VERSION_J
+ int k;
+#endif
s32 ret = 0;
u16 sum;
u16 isum;
@@ -26,8 +31,10 @@ s32 osPfsInitPak(OSMesgQueue* queue, OSPfs* pfs, int channel) {
pfs->channel = channel;
pfs->status = 0;
+#if BUILD_VERSION >= VERSION_J
ERRCK(__osPfsCheckRamArea(pfs));
- ERRCK(__osPfsSelectBank(pfs, 0));
+#endif
+ ERRCK(SELECT_BANK(pfs, 0));
ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp));
__osIdCheckSum((u16*)temp, &sum, &isum);
@@ -37,18 +44,29 @@ s32 osPfsInitPak(OSMesgQueue* queue, OSPfs* pfs, int channel) {
ret = __osCheckPackId(pfs, id);
if (ret != 0) {
+#if BUILD_VERSION >= VERSION_J
pfs->status |= PFS_ID_BROKEN;
+#endif
return ret;
}
+
+#if BUILD_VERSION < VERSION_J
+ // Duplicated check
+ else if (ret != 0) {
+ return ret;
+ }
+#endif
}
if (!(id->deviceid & 1)) {
ret = __osRepairPackId(pfs, id, &newid);
if (ret != 0) {
+#if BUILD_VERSION >= VERSION_J
if (ret == PFS_ERR_ID_FATAL) {
pfs->status |= PFS_ID_BROKEN;
}
+#endif
return ret;
}
@@ -59,7 +77,13 @@ s32 osPfsInitPak(OSMesgQueue* queue, OSPfs* pfs, int channel) {
}
}
+#if BUILD_VERSION >= VERSION_J
bcopy(id, pfs->id, BLOCKSIZE);
+#else
+ for (k = 0; k < ARRLEN(pfs->id); k++) {
+ pfs->id[k] = ((u8 *)id)[k];
+ }
+#endif
pfs->version = id->version;
pfs->banks = id->banks;
@@ -77,6 +101,7 @@ s32 osPfsInitPak(OSMesgQueue* queue, OSPfs* pfs, int channel) {
return ret;
}
+#if BUILD_VERSION >= VERSION_J
static s32 __osPfsCheckRamArea(OSPfs* pfs) {
s32 i;
s32 ret = 0;
@@ -84,7 +109,7 @@ static s32 __osPfsCheckRamArea(OSPfs* pfs) {
u8 temp2[BLOCKSIZE];
u8 save[BLOCKSIZE];
- ERRCK(__osPfsSelectBank(pfs, PFS_ID_BANK_256K));
+ ERRCK(SELECT_BANK(pfs, PFS_ID_BANK_256K));
ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, save));
for (i = 0; i < BLOCKSIZE; i++) {
@@ -101,3 +126,4 @@ static s32 __osPfsCheckRamArea(OSPfs* pfs) {
ret = __osContRamWrite(pfs->queue, pfs->channel, 0, save, FALSE);
return ret;
}
+#endif
diff --git a/lib/ultralib/src/io/pfsnumfiles.c b/lib/ultralib/src/io/pfsnumfiles.c
index 9f52fb4..7fa352e 100644
--- a/lib/ultralib/src/io/pfsnumfiles.c
+++ b/lib/ultralib/src/io/pfsnumfiles.c
@@ -7,9 +7,13 @@ s32 osPfsNumFiles(OSPfs* pfs, s32* max_files, s32* files_used) {
__OSDir dir;
int files = 0;
- PFS_CHECK_STATUS;
+ PFS_CHECK_STATUS();
+#if BUILD_VERSION >= VERSION_J
ERRCK(__osCheckId(pfs));
- SET_ACTIVEBANK_TO_ZERO;
+#else
+ PFS_CHECK_ID();
+#endif
+ SET_ACTIVEBANK_TO_ZERO();
for (j = 0; j < pfs->dir_size; j++) {
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&dir));
@@ -21,6 +25,10 @@ s32 osPfsNumFiles(OSPfs* pfs, s32* max_files, s32* files_used) {
*files_used = files;
*max_files = pfs->dir_size;
+#if BUILD_VERSION >= VERSION_J
ret = __osPfsGetStatus(pfs->queue, pfs->channel);
return ret;
+#else
+ return 0;
+#endif
}
diff --git a/lib/ultralib/src/io/pfsreadwritefile.c b/lib/ultralib/src/io/pfsreadwritefile.c
index 7a6e691..17afe54 100644
--- a/lib/ultralib/src/io/pfsreadwritefile.c
+++ b/lib/ultralib/src/io/pfsreadwritefile.c
@@ -45,9 +45,9 @@ s32 osPfsReadWriteFile(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in
return PFS_ERR_INVALID;
}
- PFS_CHECK_STATUS;
- PFS_CHECK_ID;
- SET_ACTIVEBANK_TO_ZERO;
+ PFS_CHECK_STATUS();
+ PFS_CHECK_ID();
+ SET_ACTIVEBANK_TO_ZERO();
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir));
if (dir.company_code == 0 || dir.game_code == 0) {
@@ -86,7 +86,7 @@ s32 osPfsReadWriteFile(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in
}
if (pfs->activebank != cur_page.inode_t.bank) {
- ERRCK(__osPfsSelectBank(pfs, cur_page.inode_t.bank));
+ ERRCK(SELECT_BANK(pfs, cur_page.inode_t.bank));
}
blockno = cur_page.inode_t.page * PFS_ONE_PAGE + cur_block;
@@ -107,10 +107,18 @@ s32 osPfsReadWriteFile(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in
if (flag == PFS_WRITE && (dir.status & DIR_STATUS_OCCUPIED) == 0) {
dir.status |= DIR_STATUS_OCCUPIED;
- SET_ACTIVEBANK_TO_ZERO;
+#if BUILD_VERSION >= VERSION_J
+ SET_ACTIVEBANK_TO_ZERO();
+#else
+ ERRCK(SELECT_BANK(pfs, 0));
+#endif
ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir, FALSE));
}
+#if BUILD_VERSION >= VERSION_J
ret = __osPfsGetStatus(pfs->queue, pfs->channel);
return ret;
+#else
+ return 0;
+#endif
}
diff --git a/lib/ultralib/src/io/pfsreformat.c b/lib/ultralib/src/io/pfsreformat.c
index 7cd6391..687b456 100644
--- a/lib/ultralib/src/io/pfsreformat.c
+++ b/lib/ultralib/src/io/pfsreformat.c
@@ -23,7 +23,7 @@ s32 osPfsReFormat(OSPfs* pfs, OSMesgQueue* queue, int channel) {
__osSiRelAccess();
ERRCK(__osGetId(pfs));
- SET_ACTIVEBANK_TO_ZERO;
+ SET_ACTIVEBANK_TO_ZERO();
for (j = 0; j < ARRLEN(tmp_data); j++) {
tmp_data[j] = 0;
diff --git a/lib/ultralib/src/io/pfsrepairid.c b/lib/ultralib/src/io/pfsrepairid.c
index 01b5567..348f8b2 100644
--- a/lib/ultralib/src/io/pfsrepairid.c
+++ b/lib/ultralib/src/io/pfsrepairid.c
@@ -1,6 +1,8 @@
#include "PR/os_internal.h"
#include "controller.h"
+#if BUILD_VERSION >= VERSION_J
+
s32 osPfsRepairId(OSPfs* pfs) {
s32 ret = 0;
@@ -16,3 +18,56 @@ s32 osPfsRepairId(OSPfs* pfs) {
return ret;
}
+
+#else
+
+s32 osPfsRepairId(OSPfs *pfs) {
+ int k;
+ u16 sum;
+ u16 isum;
+ u8 temp[32];
+ __OSPackId newid;
+ s32 ret;
+ __OSPackId *id;
+
+ SET_ACTIVEBANK_TO_ZERO();
+ ERRCK(__osContRamRead(pfs->queue, pfs->channel, 1, (u8*)&temp));
+ __osIdCheckSum((u16*)&temp, &sum, &isum);
+ id = (__OSPackId*)&temp;
+
+ if (id->checksum != sum || id->inverted_checksum != isum) {
+ ret = __osCheckPackId(pfs, id);
+
+ if (ret == 10) {
+ ERRCK(__osRepairPackId(pfs, id, &newid));
+ id = &newid;
+ } else if (ret != 0) {
+ return ret;
+ }
+ }
+
+ if ((id->deviceid & 1) == 0) {
+ ERRCK(__osRepairPackId(pfs, id, &newid));
+ id = &newid;
+
+ if ((id->deviceid & 1) == 0) {
+ return PFS_ERR_DEVICE;
+ }
+ }
+
+ for (k = 0; k < ARRLEN(pfs->id); k++) {
+ pfs->id[k] = ((u8*)id)[k];
+ }
+
+ pfs->version = id->version;
+ pfs->banks = id->banks;
+ pfs->inode_start_page = pfs->banks * 2 + 3;
+ pfs->dir_size = 16;
+ pfs->inode_table = 8;
+ pfs->minode_table = (pfs->banks + 1) * PFS_ONE_PAGE;
+ pfs->dir_table = pfs->minode_table + pfs->banks * PFS_ONE_PAGE;
+ ERRCK(__osContRamRead(pfs->queue, pfs->channel, 7, pfs->label));
+ return 0;
+}
+
+#endif
diff --git a/lib/ultralib/src/io/pfssearchfile.c b/lib/ultralib/src/io/pfssearchfile.c
index a107852..4fa3c57 100644
--- a/lib/ultralib/src/io/pfssearchfile.c
+++ b/lib/ultralib/src/io/pfssearchfile.c
@@ -8,15 +8,20 @@ s32 osPfsFindFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8
s32 ret = 0;
int fail;
+#if BUILD_VERSION >= VERSION_J
if (!(pfs->status & PFS_INITIALIZED)) {
return PFS_ERR_INVALID;
}
-
ERRCK(__osCheckId(pfs));
+#else
+ PFS_CHECK_ID();
+#endif
for (j = 0; j < pfs->dir_size; j++) {
ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&dir));
+#if BUILD_VERSION >= VERSION_J
ERRCK(__osPfsGetStatus(pfs->queue, pfs->channel));
+#endif
if ((dir.company_code == company_code) && dir.game_code == game_code) {
fail = FALSE;
diff --git a/lib/ultralib/src/io/pfsselectbank.c b/lib/ultralib/src/io/pfsselectbank.c
index fb0ab48..7e33b2d 100644
--- a/lib/ultralib/src/io/pfsselectbank.c
+++ b/lib/ultralib/src/io/pfsselectbank.c
@@ -1,6 +1,7 @@
#include "PR/os_internal.h"
#include "controller.h"
+#if BUILD_VERSION >= VERSION_J
s32 __osPfsSelectBank(OSPfs* pfs, u8 bank) {
u8 temp[BLOCKSIZE];
int i;
@@ -18,3 +19,4 @@ s32 __osPfsSelectBank(OSPfs* pfs, u8 bank) {
return ret;
}
+#endif
diff --git a/lib/ultralib/src/io/pfssetlabel.c b/lib/ultralib/src/io/pfssetlabel.c
index 9724598..43308c7 100644
--- a/lib/ultralib/src/io/pfssetlabel.c
+++ b/lib/ultralib/src/io/pfssetlabel.c
@@ -5,11 +5,15 @@ s32 osPfsSetLabel(OSPfs* pfs, u8* label) {
int i;
s32 ret;
+#if BUILD_VERSION >= VERSION_J
if (!(pfs->status & PFS_INITIALIZED)) {
return PFS_ERR_INVALID;
}
ERRCK(__osCheckId(pfs));
+#else
+ PFS_CHECK_ID();
+#endif
if (label != NULL) {
for (i = 0; i < ARRLEN(pfs->label); i++) {
@@ -21,11 +25,17 @@ s32 osPfsSetLabel(OSPfs* pfs, u8* label) {
}
}
+#if BUILD_VERSION >= VERSION_J
if (pfs->activebank != 0) {
- ret = (__osPfsSelectBank(pfs, 0));
+ ret = SELECT_BANK(pfs, 0);
if (ret == 0) {
ret = (__osContRamWrite(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label, FALSE));
}
}
return ret;
+#else
+ SET_ACTIVEBANK_TO_ZERO();
+ ERRCK(__osContRamWrite(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label, FALSE));
+ return 0;
+#endif
}
diff --git a/lib/ultralib/src/io/piint.h b/lib/ultralib/src/io/piint.h
index 5551c4b..50a0858 100644
--- a/lib/ultralib/src/io/piint.h
+++ b/lib/ultralib/src/io/piint.h
@@ -100,6 +100,16 @@ extern OSPiHandle LeoDiskHandle;
extern OSMesgQueue __osPiAccessQueue;
extern u32 __osPiAccessQueueEnabled;
+// These symbols were all renamed in 2.0J.
+#if BUILD_VERSION < VERSION_J
+#define __osEPiRawStartDma osEPiRawStartDma
+#define __osEPiRawReadIo osEPiRawReadIo
+#define __osEPiRawWriteIo osEPiRawWriteIo
+#define __osPiRawStartDma osPiRawStartDma
+#define __osPiRawWriteIo osPiRawWriteIo
+#define __osPiRawReadIo osPiRawReadIo
+#endif
+
int __osPiDeviceBusy(void);
void __osDevMgrMain(void *);
void __osPiCreateAccessQueue(void);
@@ -124,6 +134,8 @@ OSMesgQueue *osPiGetCmdQueue(void);
if (cHandle->var != pihandle->var) \
IO_WRITE(reg, pihandle->var)
+#if BUILD_VERSION >= VERSION_J
+
#define EPI_SYNC(pihandle, stat, domain) \
\
WAIT_ON_IOBUSY(stat); \
@@ -153,4 +165,33 @@ OSMesgQueue *osPiGetCmdQueue(void);
cHandle->pulse = pihandle->pulse; \
}(void)0
+#else
+
+#define EPI_SYNC(pihandle, stat, domain) \
+ \
+ WAIT_ON_IOBUSY(stat); \
+ \
+ domain = pihandle->domain; \
+ if (__osCurrentHandle[domain] != pihandle) \
+ { \
+ OSPiHandle *cHandle = __osCurrentHandle[domain]; \
+ if (domain == PI_DOMAIN1) \
+ { \
+ UPDATE_REG(pihandle, PI_BSD_DOM1_LAT_REG, latency); \
+ UPDATE_REG(pihandle, PI_BSD_DOM1_PGS_REG, pageSize); \
+ UPDATE_REG(pihandle, PI_BSD_DOM1_RLS_REG, relDuration); \
+ UPDATE_REG(pihandle, PI_BSD_DOM1_PWD_REG, pulse); \
+ } \
+ else \
+ { \
+ UPDATE_REG(pihandle, PI_BSD_DOM2_LAT_REG, latency); \
+ UPDATE_REG(pihandle, PI_BSD_DOM2_PGS_REG, pageSize); \
+ UPDATE_REG(pihandle, PI_BSD_DOM2_RLS_REG, relDuration); \
+ UPDATE_REG(pihandle, PI_BSD_DOM2_PWD_REG, pulse); \
+ } \
+ __osCurrentHandle[domain] = pihandle; \
+ }(void)0
+
+#endif
+
#endif
diff --git a/lib/ultralib/src/io/pimgr.c b/lib/ultralib/src/io/pimgr.c
index 56a92ad..d98c6ad 100644
--- a/lib/ultralib/src/io/pimgr.c
+++ b/lib/ultralib/src/io/pimgr.c
@@ -22,9 +22,15 @@ static OSMesg piEventBuf[1];
OSDevMgr __osPiDevMgr = { 0 };
OSPiHandle* __osPiTable = NULL;
+#if BUILD_VERSION >= VERSION_J
OSPiHandle __Dom1SpeedParam ALIGNED(8);
OSPiHandle __Dom2SpeedParam ALIGNED(8);
OSPiHandle* __osCurrentHandle[2] ALIGNED(8) = { &__Dom1SpeedParam, &__Dom2SpeedParam };
+#else
+extern OSPiHandle CartRomHandle;
+extern OSPiHandle LeoDiskHandle;
+OSPiHandle* __osCurrentHandle[2] ALIGNED(8) = { &CartRomHandle, &LeoDiskHandle };
+#endif
void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgCnt) {
u32 savedMask;
diff --git a/lib/ultralib/src/io/pirawread.c b/lib/ultralib/src/io/pirawread.c
index 0fd6a2e..95d7082 100644
--- a/lib/ultralib/src/io/pirawread.c
+++ b/lib/ultralib/src/io/pirawread.c
@@ -39,11 +39,10 @@
-
-
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 46
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
@@ -56,9 +55,9 @@ s32 __osPiRawReadIo(u32 devAddr, u32* data) {
__osError(ERR_OSPIRAWREADIO, 1, devAddr);
return -1;
}
+#endif
assert(data != NULL);
-#endif
WAIT_ON_IOBUSY(stat);
*data = IO_READ((u32)osRomBase | devAddr);
diff --git a/lib/ultralib/src/io/sirawdma.c b/lib/ultralib/src/io/sirawdma.c
index e2dd03f..5fb5f8a 100644
--- a/lib/ultralib/src/io/sirawdma.c
+++ b/lib/ultralib/src/io/sirawdma.c
@@ -44,20 +44,26 @@
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 49
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
s32 __osSiRawStartDma(s32 direction, void* dramAddr) {
-#ifdef _DEBUG
assert(((u32)dramAddr & 0x3) == 0);
-#endif
+
+#if BUILD_VERSION >= VERSION_J
if (IO_READ(SI_STATUS_REG) & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) {
return -1;
}
+#else
+ if (__osSiDeviceBusy()) {
+ return -1;
+ }
+#endif
if (direction == OS_WRITE) {
osWritebackDCache(dramAddr, 64);
diff --git a/lib/ultralib/src/io/sirawread.c b/lib/ultralib/src/io/sirawread.c
index 0b605db..4ce8330 100644
--- a/lib/ultralib/src/io/sirawread.c
+++ b/lib/ultralib/src/io/sirawread.c
@@ -41,18 +41,18 @@
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 45
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
s32 __osSiRawReadIo(u32 devAddr, u32* data) {
-#ifdef _DEBUG
assert((devAddr & 0x3) == 0);
assert(data != NULL);
-#endif
+
if (__osSiDeviceBusy()) {
return -1;
}
diff --git a/lib/ultralib/src/io/sirawwrite.c b/lib/ultralib/src/io/sirawwrite.c
index 0a50ace..795d38a 100644
--- a/lib/ultralib/src/io/sirawwrite.c
+++ b/lib/ultralib/src/io/sirawwrite.c
@@ -41,17 +41,17 @@
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 46
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
s32 __osSiRawWriteIo(u32 devAddr, u32 data) {
-#ifdef _DEBUG
assert((devAddr & 0x3) == 0);
-#endif
+
if (__osSiDeviceBusy()) {
return -1;
}
diff --git a/lib/ultralib/src/io/sprawdma.c b/lib/ultralib/src/io/sprawdma.c
index 6224b1f..6d95a49 100644
--- a/lib/ultralib/src/io/sprawdma.c
+++ b/lib/ultralib/src/io/sprawdma.c
@@ -47,10 +47,10 @@
-
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 52
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
diff --git a/lib/ultralib/src/io/sprawread.c b/lib/ultralib/src/io/sprawread.c
index 4609ebc..5910a9e 100644
--- a/lib/ultralib/src/io/sprawread.c
+++ b/lib/ultralib/src/io/sprawread.c
@@ -40,18 +40,18 @@
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 45
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
s32 __osSpRawReadIo(u32 devAddr, u32* data) {
-#ifdef _DEBUG
assert((devAddr & 0x3) == 0);
assert(data != NULL);
-#endif
+
if (__osSpDeviceBusy()) {
return -1;
}
diff --git a/lib/ultralib/src/io/sprawwrite.c b/lib/ultralib/src/io/sprawwrite.c
index 66510d1..9ce3ebf 100644
--- a/lib/ultralib/src/io/sprawwrite.c
+++ b/lib/ultralib/src/io/sprawwrite.c
@@ -41,17 +41,17 @@
-
-
-
+// Adjust line numbers to match assert
+#if BUILD_VERSION < VERSION_J
+#line 45
+#endif
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
s32 __osSpRawWriteIo(u32 devAddr, u32 data) {
-#ifdef _DEBUG
assert((devAddr & 0x3) == 0);
-#endif
+
if (__osSpDeviceBusy()) {
return -1;
}
diff --git a/lib/ultralib/src/io/sptask.c b/lib/ultralib/src/io/sptask.c
index 6b5e903..8fbfeb2 100644
--- a/lib/ultralib/src/io/sptask.c
+++ b/lib/ultralib/src/io/sptask.c
@@ -4,6 +4,10 @@
#include "PR/rcp.h"
#include "../os/osint.h"
+#if BUILD_VERSION < VERSION_J
+#ident "$Revision: 1.4 $"
+#endif
+
#define _osVirtualToPhysical(ptr) \
if (ptr != NULL) { \
ptr = (void*)osVirtualToPhysical(ptr); \
diff --git a/lib/ultralib/src/io/vimgr.c b/lib/ultralib/src/io/vimgr.c
index 1f2e5e8..0fe51d5 100644
--- a/lib/ultralib/src/io/vimgr.c
+++ b/lib/ultralib/src/io/vimgr.c
@@ -6,7 +6,9 @@
#include "../os/osint.h"
OSDevMgr __osViDevMgr = { 0 };
+#if BUILD_VERSION >= VERSION_J
u32 __additional_scanline = 0;
+#endif
static OSThread viThread;
static unsigned char viThreadStack[OS_VIM_STACKSIZE] ALIGNED(16);
static OSMesgQueue viEventQueue ALIGNED(8);
@@ -31,7 +33,9 @@ void osCreateViManager(OSPri pri) {
return;
}
__osTimerServicesInit();
+#if BUILD_VERSION >= VERSION_J
__additional_scanline = 0;
+#endif
osCreateMesgQueue(&viEventQueue, viEventBuf, ARRLEN(viEventBuf));
viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE;
viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL;
diff --git a/lib/ultralib/src/io/visetspecial.c b/lib/ultralib/src/io/visetspecial.c
index f3bd773..0a288e5 100644
--- a/lib/ultralib/src/io/visetspecial.c
+++ b/lib/ultralib/src/io/visetspecial.c
@@ -6,9 +6,14 @@
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
+// This value was incorrectly calculated until being fixed in 2.0J
+#if BUILD_VERSION >= VERSION_J
#define OS_VI_SPECIAL_MAX \
(OS_VI_GAMMA_ON | OS_VI_GAMMA_OFF | OS_VI_GAMMA_DITHER_ON | OS_VI_GAMMA_DITHER_OFF | OS_VI_DIVOT_ON | \
OS_VI_DIVOT_OFF | OS_VI_DITHER_FILTER_ON | OS_VI_DITHER_FILTER_OFF)
+#else
+#define OS_VI_SPECIAL_MAX OS_VI_DITHER_FILTER_OFF
+#endif
void osViSetSpecialFeatures(u32 func) {
register u32 saveMask;
diff --git a/lib/ultralib/src/io/viswapcontext.c b/lib/ultralib/src/io/viswapcontext.c
index aac7cd9..2f6d2c6 100644
--- a/lib/ultralib/src/io/viswapcontext.c
+++ b/lib/ultralib/src/io/viswapcontext.c
@@ -10,7 +10,9 @@ void __osViSwapContext() {
register __OSViContext* vc;
u32 origin;
u32 hStart;
+#if BUILD_VERSION >= VERSION_J
u32 vStart;
+#endif
u32 nomValue;
u32 field;
@@ -35,7 +37,9 @@ void __osViSwapContext() {
vc->y.scale = vm->fldRegs[field].yScale;
}
+#if BUILD_VERSION >= VERSION_J
vStart = (vm->fldRegs[field].vStart - (__additional_scanline << 0x10)) + __additional_scanline;
+#endif
hStart = vm->comRegs.hStart;
if (vc->state & VI_STATE_BLACK) {
@@ -59,7 +63,11 @@ void __osViSwapContext() {
IO_WRITE(VI_H_SYNC_REG, vm->comRegs.hSync);
IO_WRITE(VI_LEAP_REG, vm->comRegs.leap);
IO_WRITE(VI_H_START_REG, hStart);
+#if BUILD_VERSION >= VERSION_J
IO_WRITE(VI_V_START_REG, vStart);
+#else
+ IO_WRITE(VI_V_START_REG, vm->fldRegs[field].vStart);
+#endif
IO_WRITE(VI_V_BURST_REG, vm->fldRegs[field].vBurst);
IO_WRITE(VI_INTR_REG, vm->fldRegs[field].vIntr);
IO_WRITE(VI_X_SCALE_REG, vc->x.scale);
diff --git a/lib/ultralib/src/io/vitbl.c b/lib/ultralib/src/io/vitbl.c
index 24dc787..476036e 100644
--- a/lib/ultralib/src/io/vitbl.c
+++ b/lib/ultralib/src/io/vitbl.c
@@ -2,7 +2,7 @@
#include "PR/rcp.h"
#include "../io/viint.h"
-OSViMode osViModeTable[56] = {
+OSViMode osViModeTable[] = {
{ OS_VI_NTSC_LPN1, // type
{
// comRegs
@@ -1302,6 +1302,7 @@ OSViMode osViModeTable[56] = {
BURST(4, 2, 14, 0), // vBurst
VINTR(2), // vIntr
} } },
+#if BUILD_VERSION >= VERSION_J
{ OS_VI_FPAL_LPN1, // type
{
// comRegs
@@ -1735,4 +1736,5 @@ OSViMode osViModeTable[56] = {
BURST(105, 2, 13, 0), // vBurst
VINTR(2), // vIntr
} } }
+#endif
};
diff --git a/lib/ultralib/src/libc/ldiv.c b/lib/ultralib/src/libc/ldiv.c
index b0d98c4..92388d3 100644
--- a/lib/ultralib/src/libc/ldiv.c
+++ b/lib/ultralib/src/libc/ldiv.c
@@ -1,3 +1,4 @@
+#include "os_version.h"
#include "stdlib.h"
// TODO: these come from headers
diff --git a/lib/ultralib/src/libc/syncprintf.c b/lib/ultralib/src/libc/syncprintf.c
index 867bd99..572ac73 100644
--- a/lib/ultralib/src/libc/syncprintf.c
+++ b/lib/ultralib/src/libc/syncprintf.c
@@ -2,9 +2,121 @@
#include "PR/os.h"
#include "PR/rdb.h"
#include "xstdio.h"
+#include "PR/rcp.h"
extern void* __printfunc;
+#if BUILD_VERSION <= VERSION_J
+
+#ifndef _FINALROM
+extern u32 __kmc_pt_mode;
+
+static void* proutSyncPrintf(void* str, const char* buf, size_t n) {
+ size_t sent = 0;
+
+ while (sent < n) {
+ sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT);
+ }
+ return 1;
+}
+
+static volatile unsigned int* stat = (unsigned*)0xbff08004;
+static volatile unsigned int* wport = (unsigned*)0xbff08000;
+static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG);
+
+static void rmonPutchar(char c) {
+ u32 data;
+
+ while (*piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
+ }
+
+ while (!(*stat & 4)) {
+ }
+
+ *wport = c;
+}
+
+static void* kmc_proutSyncPrintf(void* str, const char* buf, int n) {
+ int i;
+ char c;
+ char* p;
+ char* q;
+ char xbuf[128];
+ static int column = 0;
+
+ p = &xbuf;
+
+ for (i = 0; i < n; i++) {
+ c = *buf++;
+
+ switch (c) {
+ case '\n':
+ *p++ = '\n';
+ column = 0;
+ break;
+ case '\t':
+ do {
+ *p++ = ' ';
+ } while (++column % 8);
+ break;
+ default:
+ column++;
+ *p++ = c;
+ break;
+ }
+
+ if (c == '\n' || (p - xbuf) > 100) {
+ rmonPutchar((p - xbuf) - 1);
+
+ q = xbuf;
+ while (q != p) {
+ rmonPutchar(*q++);
+ }
+ p = xbuf;
+ }
+ }
+ if (p != xbuf) {
+ rmonPutchar((p - xbuf) - 1);
+
+ q = xbuf;
+ while (q != p) {
+ rmonPutchar(*q++);
+ }
+ }
+ return (void*)1;
+}
+#endif
+
+void osSyncPrintf(const char* fmt, ...) {
+ int ans;
+ va_list ap;
+
+#ifndef _FINALROM
+ va_start(ap, fmt);
+ if (__kmc_pt_mode) {
+ ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap);
+ } else {
+ ans = _Printf(proutSyncPrintf, NULL, fmt, ap);
+ }
+ va_end(ap);
+#endif
+}
+
+void rmonPrintf(const char* fmt, ...) {
+ int ans;
+ va_list ap;
+
+#ifndef _FINALROM
+ va_start(ap, fmt);
+ if (__kmc_pt_mode) {
+ ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap);
+ }
+ va_end(ap);
+#endif
+}
+
+#else
+
void __osSyncVPrintf(const char* fmt, va_list args) {
int ans;
@@ -38,3 +150,5 @@ void rmonPrintf(const char* fmt, ...) {
va_end(ap);
#endif
}
+
+#endif
diff --git a/lib/ultralib/src/log/delay.s b/lib/ultralib/src/log/delay.s
index bbfc7dd..631781a 100644
--- a/lib/ultralib/src/log/delay.s
+++ b/lib/ultralib/src/log/delay.s
@@ -1,4 +1,6 @@
-#ifndef _FINALROM
+#include "PR/os_version.h"
+
+#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J
#include "sys/asm.h"
#include "sys/regdef.h"
diff --git a/lib/ultralib/src/log/logfloat.c b/lib/ultralib/src/log/logfloat.c
index 01acab6..17db739 100644
--- a/lib/ultralib/src/log/logfloat.c
+++ b/lib/ultralib/src/log/logfloat.c
@@ -1,4 +1,6 @@
-#ifndef _FINALROM
+#include "os_version.h"
+
+#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J
#include "ultralog.h"
diff --git a/lib/ultralib/src/mgu/mtxcatl.c b/lib/ultralib/src/mgu/mtxcatl.c
index 86a978a..6054972 100644
--- a/lib/ultralib/src/mgu/mtxcatl.c
+++ b/lib/ultralib/src/mgu/mtxcatl.c
@@ -31,4 +31,14 @@ void guMtxCatL(Mtx *m, Mtx *n, Mtx *res)
guMtxF2L(resf, res);
}
+#if BUILD_VERSION < VERSION_K
+void guMtxXFML(Mtx *m, float x, float y, float z, float *ox, float *oy, float *oz)
+{
+ float mf[4][4];
+
+ guMtxL2F(mf, m);
+
+ guMtxXFMF(mf, x, y, z, ox, oy, oz);
+}
+#endif
/* End of file */
diff --git a/lib/ultralib/src/mgu/rotate.c b/lib/ultralib/src/mgu/rotate.c
index fec2443..1c09bd8 100644
--- a/lib/ultralib/src/mgu/rotate.c
+++ b/lib/ultralib/src/mgu/rotate.c
@@ -12,6 +12,7 @@
#include "../gu/guint.h"
#include "gu.h"
+#include "os_version.h"
void guRotateF(float mf[4][4], float a, float x, float y, float z)
{
@@ -19,9 +20,11 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z)
float sine;
float cosine;
float ab, bc, ca, t;
+#if BUILD_VERSION >= VERSION_K
float xxsine;
float yxsine;
float zxsine;
+#endif
guNormalize(&x, &y, &z);
a *= dtor;
@@ -34,9 +37,15 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z)
guMtxIdentF(mf);
+#if BUILD_VERSION >= VERSION_K
xxsine = x * sine;
yxsine = y * sine;
zxsine = z * sine;
+#else
+ #define xxsine (x * sine)
+ #define yxsine (y * sine)
+ #define zxsine (z * sine)
+#endif
t = x*x;
mf[0][0] = t+cosine*(1-t);
diff --git a/lib/ultralib/src/os/ackramromread.c b/lib/ultralib/src/os/ackramromread.c
index aa671bf..3de1f6f 100644
--- a/lib/ultralib/src/os/ackramromread.c
+++ b/lib/ultralib/src/os/ackramromread.c
@@ -1,7 +1,16 @@
#include "PR/os_internal.h"
+#include "PR/os_version.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
void osAckRamromRead() {
}
diff --git a/lib/ultralib/src/os/ackramromwrite.c b/lib/ultralib/src/os/ackramromwrite.c
index 8a29f60..a99e951 100644
--- a/lib/ultralib/src/os/ackramromwrite.c
+++ b/lib/ultralib/src/os/ackramromwrite.c
@@ -1,7 +1,15 @@
#include "PR/os_internal.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
void osAckRamromWrite() {
}
diff --git a/lib/ultralib/src/os/createthread.c b/lib/ultralib/src/os/createthread.c
index fdf0c20..7c17834 100644
--- a/lib/ultralib/src/os/createthread.c
+++ b/lib/ultralib/src/os/createthread.c
@@ -37,6 +37,7 @@ void osCreateThread(OSThread* t, OSId id, void (*entry)(void*), void* arg, void*
t->state = OS_STATE_STOPPED;
t->flags = 0;
+#if BUILD_VERSION >= VERSION_K
#ifndef _FINALROM
if (id < THPROF_IDMAX) {
t->thprof = &thprof[id];
@@ -44,6 +45,7 @@ void osCreateThread(OSThread* t, OSId id, void (*entry)(void*), void* arg, void*
t->thprof = &thprof[THPROF_IDMAX - 1];
}
#endif
+#endif
saveMask = __osDisableInt();
t->tlnext = __osActiveQueue;
diff --git a/lib/ultralib/src/os/destroythread.c b/lib/ultralib/src/os/destroythread.c
index 91ad92c..c668869 100644
--- a/lib/ultralib/src/os/destroythread.c
+++ b/lib/ultralib/src/os/destroythread.c
@@ -17,6 +17,7 @@ void osDestroyThread(OSThread* t) {
if (__osActiveQueue == t) {
__osActiveQueue = __osActiveQueue->tlnext;
} else {
+#if BUILD_VERSION >= VERSION_J || !defined(__GNUC__)
pred = __osActiveQueue;
while (pred->priority != -1) {
succ = pred->tlnext;
@@ -26,6 +27,18 @@ void osDestroyThread(OSThread* t) {
}
pred = succ;
}
+#else
+ pred = __osActiveQueue;
+ succ = pred->tlnext;
+ while (succ != NULL) {
+ if (succ == t) {
+ pred->tlnext = t->tlnext;
+ break;
+ }
+ pred = succ;
+ succ = pred->tlnext;
+ }
+#endif
}
if (t == __osRunningThread) {
diff --git a/lib/ultralib/src/os/exceptasm.h b/lib/ultralib/src/os/exceptasm.h
index 3e599ee..0d7def5 100644
--- a/lib/ultralib/src/os/exceptasm.h
+++ b/lib/ultralib/src/os/exceptasm.h
@@ -1,6 +1,8 @@
#ifndef _EXCEPTASM_H
#define _EXCEPTASM_H
+#include "PR/os_version.h"
+
#define MESG(type) (type << 3)
#define MQ_MTQUEUE 0
@@ -18,6 +20,10 @@
#define HWINTR_SP 0x04
/* __osHwInt struct size */
+#if BUILD_VERSION >= VERSION_J
#define HWINTR_SIZE 0x8
+#else
+#define HWINTR_SIZE 0x4
+#endif
#endif
diff --git a/lib/ultralib/src/os/exceptasm.s b/lib/ultralib/src/os/exceptasm.s
index 577aed5..b7699a8 100644
--- a/lib/ultralib/src/os/exceptasm.s
+++ b/lib/ultralib/src/os/exceptasm.s
@@ -6,7 +6,7 @@
#include "PR/rdb.h"
#include "exceptasm.h"
#include "threadasm.h"
-
+#include "PR/os_version.h"
#define KMC_CODE_ENTRY 0xBFF00014
#define KMC_WPORT 0xBFF08000
#define KMC_STAT 0xBFF08004
@@ -68,6 +68,7 @@ EXPORT(__osCauseTable_pt)
.data
+#if BUILD_VERSION >= VERSION_J
EXPORT(__osHwIntTable)
.word 0, 0
.word 0, 0
@@ -77,6 +78,14 @@ EXPORT(__osHwIntTable)
EXPORT(__osPiIntTable)
.word 0, 0
+#else
+EXPORT(__osHwIntTable)
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+#endif
#ifndef _FINALROM
__osRdb_DbgRead_Ct:
@@ -88,8 +97,10 @@ __osRdb_Mesg:
__os_Kdebug_Pkt:
.word 0
+#if BUILD_VERSION >= VERSION_K
__osPreviousThread:
.word 0
+#endif
#endif
.text
@@ -381,7 +392,7 @@ skip_kmc_mode:
savecontext:
move t0, k0
lw k0, __osRunningThread
-#ifndef _FINALROM
+#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K
sw k0, __osPreviousThread
#endif
ld t1, THREAD_GP1(t0)
@@ -548,6 +559,7 @@ STAY2(mtc0 t1, C0_COMPARE)
b next_interrupt
cart:
+#if BUILD_VERSION >= VERSION_J
and s0, s0, ~CAUSE_IP4
la t1, __osHwIntTable
add t1, HWINTR_SIZE
@@ -565,6 +577,26 @@ cart:
li a0, MESG(OS_EVENT_CART)
jal send_mesg
b next_interrupt
+#else
+ li a0, MESG(OS_EVENT_CART)
+ and s0, s0, ~CAUSE_IP4
+ la sp, leoDiskStack
+ addiu sp, 0x1000 - 0x10 # Stack size minus initial frame
+ li t2, HWINTR_SIZE
+ lw t2, __osHwIntTable(t2)
+
+ beqz t2, 1f
+
+ jalr t2
+ li a0, MESG(OS_EVENT_CART)
+
+ beqz v0, 1f
+ b redispatch
+
+1:
+ jal send_mesg
+ b next_interrupt
+#endif
rcp:
lw s1, PHYS_TO_K1(MI_INTR_REG)
@@ -641,6 +673,7 @@ pi:
li t1, PI_STATUS_CLR_INTR
sw t1, PHYS_TO_K1(PI_STATUS_REG)
+#if BUILD_VERSION >= VERSION_J
la t1, __osPiIntTable
lw t2, (t1)
beqz t2, 1f
@@ -651,9 +684,12 @@ pi:
bnez v0, 2f
1:
+#endif
li a0, MESG(OS_EVENT_PI)
jal send_mesg
+#if BUILD_VERSION >= VERSION_J
2:
+#endif
beqz s1, NoMoreRcpInts
dp:
@@ -816,7 +852,7 @@ END(handle_CpU)
LEAF(__osEnqueueAndYield)
lw a1, __osRunningThread
-#ifndef _FINALROM
+#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K
sw a1, __osPreviousThread
#endif
STAY2(mfc0 t0, C0_SR)
@@ -905,11 +941,11 @@ LEAF(__osPopThread)
sw t9, 0(a0)
jr ra
END(__osPopThread)
-
+#if BUILD_VERSION >= VERSION_K
LEAF(__osNop)
jr ra
END(__osNop)
-
+#endif
LEAF(__osDispatchThread)
la a0, __osRunQueue
jal __osPopThread
@@ -918,7 +954,7 @@ LEAF(__osDispatchThread)
sh t0, THREAD_STATE(v0)
move k0, v0
-#ifndef _FINALROM
+#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K
la t0, __osThprofFunc
lw t0, (t0)
beqz t0, __osDispatchThreadSave
@@ -928,6 +964,11 @@ LEAF(__osDispatchThread)
jalr t0
#endif
+/* There's another 1: label somewhere around here in version J and below */
+#if BUILD_VERSION < VERSION_K
+1:
+#endif
+
__osDispatchThreadSave:
lw k1, THREAD_SR(k0)
la t0, __OSGlobalIntMask
diff --git a/lib/ultralib/src/os/gethwinterrupt.c b/lib/ultralib/src/os/gethwinterrupt.c
index 21b46e7..46dc366 100644
--- a/lib/ultralib/src/os/gethwinterrupt.c
+++ b/lib/ultralib/src/os/gethwinterrupt.c
@@ -2,12 +2,20 @@
struct __osHwInt {
s32 (*handler)(void);
+#if BUILD_VERSION >= VERSION_J
void* stackEnd;
+#endif
};
extern struct __osHwInt __osHwIntTable[];
+#if BUILD_VERSION >= VERSION_J
void __osGetHWIntrRoutine(OSHWIntr interrupt, s32 (**handler)(void), void** stackEnd) {
+#else
+void __osGetHWIntrRoutine(OSHWIntr interrupt, s32 (**handler)(void)) {
+#endif
*handler = __osHwIntTable[interrupt].handler;
+#if BUILD_VERSION >= VERSION_J
*stackEnd = __osHwIntTable[interrupt].stackEnd;
+#endif
}
diff --git a/lib/ultralib/src/os/getmemsize.c b/lib/ultralib/src/os/getmemsize.c
index 44fbc19..814443d 100644
--- a/lib/ultralib/src/os/getmemsize.c
+++ b/lib/ultralib/src/os/getmemsize.c
@@ -6,6 +6,8 @@
#define SIZE_4MB 0x400000
#define SIZE_8MB 0x800000
+#if BUILD_VERSION >= VERSION_J
+
u32 osGetMemSize(void) {
vu32* ptr;
u32 size = SIZE_4MB;
@@ -33,3 +35,19 @@ u32 osGetMemSize(void) {
return size;
}
+
+#else
+
+u32 osGetMemSize(void) {
+ u32* memory;
+ u32 memsize = SIZE_4MB - STEP;
+ do {
+ memsize += STEP;
+ memory = (u32*)(memsize + K1BASE);
+ memory[0] = 0x12345678;
+ memory[STEP / 4 - 1] = 0x87654321;
+ } while (memory[0] == 0x12345678 && memory[STEP / 4 - 1] == 0x87654321);
+ return memsize;
+}
+
+#endif
diff --git a/lib/ultralib/src/os/initialize.c b/lib/ultralib/src/os/initialize.c
index 3edfe45..89f4b02 100644
--- a/lib/ultralib/src/os/initialize.c
+++ b/lib/ultralib/src/os/initialize.c
@@ -1,5 +1,7 @@
#include "PR/os_internal.h"
#include "PR/rcp.h"
+#include "PR/os_version.h"
+#include "../io/piint.h"
typedef struct {
/* 0x0 */ unsigned int inst1;
@@ -20,10 +22,29 @@ u32 __OSGlobalIntMask = OS_IM_ALL;
u32 __osFinalrom;
#else
u32 __kmc_pt_mode;
+#if BUILD_VERSION >= VERSION_K
void* __printfunc = NULL;
#endif
+#endif
+
+#if BUILD_VERSION >= VERSION_K
+
+#define INITIALIZE_FUNC __osInitialize_common
+#define SPEED_PARAM_FUNC __createSpeedParam
+#else
+
+#define INITIALIZE_FUNC osInitialize
+#define SPEED_PARAM_FUNC createSpeedParam
+#if BUILD_VERSION >= VERSION_J
+static void ptstart(void);
+static void SPEED_PARAM_FUNC(void);
+#endif
+extern __osExceptionVector __ptExceptionPreamble[];
-void __createSpeedParam(void) {
+#endif
+
+#if BUILD_VERSION >= VERSION_K
+void SPEED_PARAM_FUNC(void) {
__Dom1SpeedParam.type = DEVICE_TYPE_INIT;
__Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG);
__Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG);
@@ -36,9 +57,13 @@ void __createSpeedParam(void) {
__Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG);
__Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG);
}
+#endif
-void __osInitialize_common() {
+void INITIALIZE_FUNC() {
u32 pifdata;
+#if BUILD_VERSION < VERSION_K
+ u32 clock = 0;
+#endif
#ifdef _FINALROM
__osFinalrom = TRUE;
@@ -46,7 +71,9 @@ void __osInitialize_common() {
__osSetSR(__osGetSR() | SR_CU1); // enable fpu
__osSetFpcCsr(FPCSR_FS | FPCSR_EV); // flush denorm to zero, enable invalid operation
+#if BUILD_VERSION >= VERSION_K
__osSetWatchLo(0x4900000);
+#endif
while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)) { // last byte of joychannel ram
;
@@ -60,9 +87,19 @@ void __osInitialize_common() {
*(__osExceptionVector*)E_VEC = *__osExceptionPreamble;
osWritebackDCache((void*)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector));
osInvalICache((void*)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector));
- __createSpeedParam();
+#if BUILD_VERSION >= VERSION_J
+ SPEED_PARAM_FUNC();
osUnmapTLBAll();
osMapTLBRdb();
+#else
+ osMapTLBRdb();
+ osPiRawReadIo(4, &clock); // Read clock rate from the ROM header
+ clock &= ~0xf;
+ if (clock != 0)
+ {
+ osClockRate = clock;
+ }
+#endif
osClockRate = osClockRate * 3 / 4;
if (osResetType == 0) { // cold reset
@@ -77,6 +114,7 @@ void __osInitialize_common() {
osViClock = VI_NTSC_CLOCK;
}
+#if BUILD_VERSION >= VERSION_J
// Wait until there are no RCP interrupts
if (__osGetCause() & CAUSE_IP5) {
while (TRUE) {
@@ -87,8 +125,75 @@ void __osInitialize_common() {
IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON);
IO_WRITE(AI_DACRATE_REG, AI_MAX_DAC_RATE - 1);
IO_WRITE(AI_BITRATE_REG, AI_MAX_BIT_RATE - 1);
+#endif
+
+#if BUILD_VERSION < VERSION_K && !defined(_FINALROM)
+ if (!__kmc_pt_mode) {
+ int (*fnc)();
+#if BUILD_VERSION < VERSION_J
+ unsigned int c;
+ unsigned int c1;
+#endif
+ unsigned int* src;
+ unsigned int* dst;
+ unsigned int monadr;
+ volatile unsigned int* mon;
+ volatile unsigned int* stat;
+
+ stat = (unsigned*)0xbff08004;
+ mon = (unsigned*)0xBFF00000;
+ if (*mon != 0x4B4D4300) {
+ return;
+ }
+
+ src = (unsigned*)__ptExceptionPreamble;
+ dst = (unsigned*)E_VEC;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ src += 2;
+ dst += 2;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ *dst++ = *src++;
+
+ osWritebackDCache(E_VEC, 0x24);
+ osInvalICache(E_VEC, 0x24);
+
+ __kmc_pt_mode = TRUE;
+
+ if ((*stat & 0x10) == 0) {
+ monadr = *(mon + 1);
+ if (monadr != 0xBFF00000) {
+ unsigned int* src;
+ unsigned int* dst = monadr | 0x20000000;
+ unsigned int ct = 0x2000 / 4;
+
+ src = 0xBFF00000;
+
+ while (ct != 0) {
+ *dst++ = *src++;
+ ct--;
+ }
+ }
+ fnc = monadr + 8;
+ fnc(0x4B4D4300, 0);
+ }
+ }
+#endif
+}
+
+#if !defined(_FINALROM) && BUILD_VERSION < VERSION_J
+void ptstart() {
+
+}
+#elif !defined(_FINALROM) && BUILD_VERSION < VERSION_K
+static void ptstart() {
+
}
+#endif
+#if BUILD_VERSION >= VERSION_K
void __osInitialize_autodetect() {
#ifndef _FINALROM
if (__checkHardware_msp()) {
@@ -102,3 +207,18 @@ void __osInitialize_autodetect() {
}
#endif
}
+#elif BUILD_VERSION == VERSION_J
+static void SPEED_PARAM_FUNC(void) {
+ __Dom1SpeedParam.type = DEVICE_TYPE_INIT;
+ __Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG);
+ __Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG);
+ __Dom1SpeedParam.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG);
+ __Dom1SpeedParam.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG);
+
+ __Dom2SpeedParam.type = DEVICE_TYPE_INIT;
+ __Dom2SpeedParam.latency = IO_READ(PI_BSD_DOM2_LAT_REG);
+ __Dom2SpeedParam.pulse = IO_READ(PI_BSD_DOM2_PWD_REG);
+ __Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG);
+ __Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG);
+}
+#endif
diff --git a/lib/ultralib/src/os/initialize_isv.c b/lib/ultralib/src/os/initialize_isv.c
index 60c1385..50f6379 100644
--- a/lib/ultralib/src/os/initialize_isv.c
+++ b/lib/ultralib/src/os/initialize_isv.c
@@ -17,21 +17,20 @@ extern __osExceptionVector __isExpJP;
void MonitorInitBreak(void);
-typedef struct {
- /* 0x00 */ u32 magic; // IS64
- /* 0x04 */ u32 get;
- /* 0x08 */ u8 unk_08[0x14 - 0x08];
- /* 0x14 */ u32 put;
- /* 0x18 */ u8 unk_18[0x20 - 0x18];
- /* 0x20 */ u8 data[0x10000 - 0x20];
-} ISVDbg;
+#define ISV_BASE gISVDbgPrnAdrs
+#define ISV_MAGIC_ADDR (ISV_BASE + 0x00)
+#define ISV_GET_ADDR (ISV_BASE + 0x04)
+#define ISV_PUT_ADDR (ISV_BASE + 0x14)
+#define ISV_BUFFER (ISV_BASE + 0x20)
+
+#define ISV_BUFFER_LEN (0x10000 - 0x20)
#define IS64_MAGIC 'IS64'
__osExceptionVector ramOldVector ALIGNED(8);
u32 gISVFlag;
u16 gISVChk;
-ISVDbg* gISVDbgPrnAdrs;
+u32 gISVDbgPrnAdrs;
u32 leoComuBuffAdd;
static OSPiHandle* is_Handle;
@@ -39,9 +38,9 @@ static OSPiHandle* is_Handle;
void isPrintfInit(void) {
is_Handle = osCartRomInit();
- osEPiWriteIo(is_Handle, &gISVDbgPrnAdrs->put, 0);
- osEPiWriteIo(is_Handle, &gISVDbgPrnAdrs->get, 0);
- osEPiWriteIo(is_Handle, &gISVDbgPrnAdrs->magic, IS64_MAGIC);
+ osEPiWriteIo(is_Handle, ISV_PUT_ADDR, 0);
+ osEPiWriteIo(is_Handle, ISV_GET_ADDR, 0);
+ osEPiWriteIo(is_Handle, ISV_MAGIC_ADDR, IS64_MAGIC);
}
static void* is_proutSyncPrintf(void* arg, const u8* str, u32 count) {
@@ -49,25 +48,24 @@ static void* is_proutSyncPrintf(void* arg, const u8* str, u32 count) {
s32 p;
s32 start;
s32 end;
- u32* magic = &gISVDbgPrnAdrs->magic;
- if (gISVDbgPrnAdrs == NULL) {
+ if (gISVDbgPrnAdrs == 0) {
return 0;
}
- osEPiReadIo(is_Handle, (u32)magic, &data);
+ osEPiReadIo(is_Handle, ISV_MAGIC_ADDR, &data);
if (data != IS64_MAGIC) {
return 1;
}
- osEPiReadIo(is_Handle, (u32)&gISVDbgPrnAdrs->get, &data);
+ osEPiReadIo(is_Handle, ISV_GET_ADDR, &data);
p = data;
- osEPiReadIo(is_Handle, (u32)&gISVDbgPrnAdrs->put, &data);
+ osEPiReadIo(is_Handle, ISV_PUT_ADDR, &data);
start = data;
end = start + count;
- if (end >= 0xffe0) {
- end -= 0xffe0;
+ if (end >= ISV_BUFFER_LEN) {
+ end -= ISV_BUFFER_LEN;
if (p < end || start < p) {
return 1;
}
@@ -79,7 +77,7 @@ static void* is_proutSyncPrintf(void* arg, const u8* str, u32 count) {
while (count) {
if (*str != '\0') {
s32 shift = start & 3;
- u32 addr = (u32)&gISVDbgPrnAdrs->data[start & 0xFFFFFFC];
+ u32 addr = ISV_BUFFER + (start & 0xFFFFFFC);
shift = (3 - shift) * 8;
@@ -87,14 +85,14 @@ static void* is_proutSyncPrintf(void* arg, const u8* str, u32 count) {
osEPiWriteIo(is_Handle, addr, (data & ~(0xff << shift)) | (*str << shift));
start++;
- if (start >= 0xffe0) {
- start -= 0xffe0;
+ if (start >= ISV_BUFFER_LEN) {
+ start -= ISV_BUFFER_LEN;
}
}
count--;
str++;
}
- osEPiWriteIo(is_Handle, (u32)&gISVDbgPrnAdrs->put, start);
+ osEPiWriteIo(is_Handle, ISV_PUT_ADDR, start);
return 1;
}
@@ -105,7 +103,7 @@ int __checkHardware_isv(void) {
u32 save[4];
OSPiHandle* hnd = osCartRomInit();
- gISVDbgPrnAdrs = NULL;
+ gISVDbgPrnAdrs = 0;
leoComuBuffAdd = 0;
gISVFlag = IS64_MAGIC;
gISVChk = 0;
@@ -127,7 +125,7 @@ int __checkHardware_isv(void) {
data = 0;
osEPiWriteIo(hnd, 0xB0000100, data);
gISVChk |= 1;
- osEPiReadIo(hnd, 0xB0000104, (void*)&gISVDbgPrnAdrs);
+ osEPiReadIo(hnd, 0xB0000104, &gISVDbgPrnAdrs);
osEPiReadIo(hnd, 0xB0000108, &leoComuBuffAdd);
break;
}
@@ -151,7 +149,7 @@ void __osInitialize_isv(void) {
s32 pad2;
if (gISVFlag == IS64_MAGIC || __checkHardware_isv()) {
- if (gISVDbgPrnAdrs != NULL) {
+ if (gISVDbgPrnAdrs != 0) {
__printfunc = is_proutSyncPrintf;
isPrintfInit();
}
diff --git a/lib/ultralib/src/os/interrupt.s b/lib/ultralib/src/os/interrupt.s
index e8f02d0..01efe1a 100644
--- a/lib/ultralib/src/os/interrupt.s
+++ b/lib/ultralib/src/os/interrupt.s
@@ -1,10 +1,12 @@
#include "PR/R4300.h"
#include "sys/asm.h"
#include "sys/regdef.h"
+#include "PR/os_version.h"
.text
.set noreorder
LEAF(__osDisableInt)
+#if BUILD_VERSION >= VERSION_J
la t2, __OSGlobalIntMask
lw t3, (t2)
andi t3, 0xFF00
@@ -28,6 +30,15 @@ LEAF(__osDisableInt)
No_Change_Global_Int:
jr ra
nop
+#else
+ mfc0 t0, C0_SR
+ and t1, t0, ~SR_IE
+ mtc0 t1, C0_SR
+ andi v0, t0, SR_IE
+ nop
+ jr ra
+ nop
+#endif
END(__osDisableInt)
LEAF(__osRestoreInt)
diff --git a/lib/ultralib/src/os/osint.h b/lib/ultralib/src/os/osint.h
index 75b94ea..b73b609 100644
--- a/lib/ultralib/src/os/osint.h
+++ b/lib/ultralib/src/os/osint.h
@@ -44,7 +44,7 @@ extern OSProf *__osProfileList;
extern OSProf *__osProfileListEnd;
extern u32 __osProfileOverflowBin;
-extern __OSEventState __osEventStateTab[OS_NUM_EVENTS];
+extern __OSEventState __osEventStateTab[];
extern void __osTimerServicesInit(void);
diff --git a/lib/ultralib/src/os/seteventmesg.c b/lib/ultralib/src/os/seteventmesg.c
index 5a00bc9..f59308c 100644
--- a/lib/ultralib/src/os/seteventmesg.c
+++ b/lib/ultralib/src/os/seteventmesg.c
@@ -4,7 +4,9 @@
#include "osint.h"
__OSEventState __osEventStateTab[OS_NUM_EVENTS] ALIGNED(8);
+#if BUILD_VERSION >= VERSION_J
u32 __osPreNMI = FALSE;
+#endif
void osSetEventMesg(OSEvent event, OSMesgQueue* mq, OSMesg msg) {
register u32 saveMask;
@@ -24,12 +26,14 @@ void osSetEventMesg(OSEvent event, OSMesgQueue* mq, OSMesg msg) {
es->messageQueue = mq;
es->message = msg;
+#if BUILD_VERSION >= VERSION_J
if (event == OS_EVENT_PRENMI) {
if (__osShutdown && !__osPreNMI) {
osSendMesg(mq, msg, OS_MESG_NOBLOCK);
}
__osPreNMI = TRUE;
}
+#endif
__osRestoreInt(saveMask);
}
diff --git a/lib/ultralib/src/os/setfpccsr.s b/lib/ultralib/src/os/setfpccsr.s
index f288437..caeccaf 100644
--- a/lib/ultralib/src/os/setfpccsr.s
+++ b/lib/ultralib/src/os/setfpccsr.s
@@ -7,4 +7,4 @@ LEAF(__osSetFpcCsr)
STAY2(cfc1 v0, fcr31)
STAY2(ctc1 a0, fcr31)
jr ra
-END(__osSetSR) # @bug: Should be __osGetFpcCsr
+END(__osSetSR) # @bug: Should be __osSetFpcCsr
diff --git a/lib/ultralib/src/os/sethwinterrupt.c b/lib/ultralib/src/os/sethwinterrupt.c
index bb0ddba..9aafe1b 100644
--- a/lib/ultralib/src/os/sethwinterrupt.c
+++ b/lib/ultralib/src/os/sethwinterrupt.c
@@ -1,5 +1,8 @@
#include "PR/os_internal.h"
+// A stack frame was added to hardware interrupt handlers in 2.0J
+#if BUILD_VERSION >= VERSION_J
+
struct __osHwInt {
s32 (*handler)(void);
void* stackEnd;
@@ -14,3 +17,16 @@ void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void* stackE
__osHwIntTable[interrupt].stackEnd = stackEnd;
__osRestoreInt(saveMask);
}
+
+#else
+
+extern struct s32 (*__osHwIntTable[])(void);
+
+void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void)) {
+ register u32 saveMask = __osDisableInt();
+
+ __osHwIntTable[interrupt] = handler;
+ __osRestoreInt(saveMask);
+}
+
+#endif
diff --git a/lib/ultralib/src/os/settimer.c b/lib/ultralib/src/os/settimer.c
index 1eb7fbe..252f63c 100644
--- a/lib/ultralib/src/os/settimer.c
+++ b/lib/ultralib/src/os/settimer.c
@@ -5,10 +5,12 @@
int osSetTimer(OSTimer* t, OSTime countdown, OSTime interval, OSMesgQueue* mq, OSMesg msg) {
OSTime time;
+#if BUILD_VERSION >= VERSION_K
OSTimer* next;
u32 count;
u32 value;
u32 saveMask;
+#endif
#ifdef _DEBUG
if (!__osViDevMgr.active) {
@@ -24,6 +26,7 @@ int osSetTimer(OSTimer* t, OSTime countdown, OSTime interval, OSMesgQueue* mq, O
t->mq = mq;
t->msg = msg;
+#if BUILD_VERSION >= VERSION_K
saveMask = __osDisableInt();
if (__osTimerList->next == __osTimerList) {
@@ -42,6 +45,12 @@ int osSetTimer(OSTimer* t, OSTime countdown, OSTime interval, OSMesgQueue* mq, O
time = __osInsertTimer(t);
__osSetTimerIntr(__osTimerList->next->value);
__osRestoreInt(saveMask);
+#else
+ time = __osInsertTimer(t);
+ if (__osTimerList->next == t) {
+ __osSetTimerIntr(time);
+ }
+#endif
return 0;
}
diff --git a/lib/ultralib/src/os/testhost.c b/lib/ultralib/src/os/testhost.c
index 70514eb..c134317 100644
--- a/lib/ultralib/src/os/testhost.c
+++ b/lib/ultralib/src/os/testhost.c
@@ -1,4 +1,12 @@
#include "PR/os_internal.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
diff --git a/lib/ultralib/src/os/timerintr.c b/lib/ultralib/src/os/timerintr.c
index 46beadf..10dae50 100644
--- a/lib/ultralib/src/os/timerintr.c
+++ b/lib/ultralib/src/os/timerintr.c
@@ -102,9 +102,11 @@ void __osSetTimerIntr(OSTime tim) {
OSTime NewTime;
u32 savedMask;
+#if BUILD_VERSION >= VERSION_K
if (tim < 468) {
tim = 468;
}
+#endif
savedMask = __osDisableInt();
__osTimerCounter = osGetCount();
diff --git a/lib/ultralib/src/rg/printregion.c b/lib/ultralib/src/rg/printregion.c
index 2f84319..6db8f18 100644
--- a/lib/ultralib/src/rg/printregion.c
+++ b/lib/ultralib/src/rg/printregion.c
@@ -1,4 +1,5 @@
-#ifndef _FINALROM
+#include "os_version.h"
+#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J
#include "../os/osint.h"
#include "PR/rmon.h"
diff --git a/lib/ultralib/src/rmon/rmonbrk.c b/lib/ultralib/src/rmon/rmonbrk.c
index b3cf239..0eb3242 100644
--- a/lib/ultralib/src/rmon/rmonbrk.c
+++ b/lib/ultralib/src/rmon/rmonbrk.c
@@ -9,7 +9,15 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
#define TMP_BP 0
#define NUM_BREAKPOINTS 16
diff --git a/lib/ultralib/src/rmon/rmoncmds.c b/lib/ultralib/src/rmon/rmoncmds.c
index 5dd34d1..88600a6 100644
--- a/lib/ultralib/src/rmon/rmoncmds.c
+++ b/lib/ultralib/src/rmon/rmoncmds.c
@@ -6,7 +6,15 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
static int NotImplemented(KKHeader* dummy UNUSED) {
return TV_ERROR_ILLEGAL_CALL;
diff --git a/lib/ultralib/src/rmon/rmonmain.c b/lib/ultralib/src/rmon/rmonmain.c
index 8cb0c1b..564ac44 100644
--- a/lib/ultralib/src/rmon/rmonmain.c
+++ b/lib/ultralib/src/rmon/rmonmain.c
@@ -1,3 +1,13 @@
+#include "PR/os_version.h"
+
+#if BUILD_VERSION < VERSION_J
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
+
#ifndef _FINALROM
#include "dbgproto.h"
@@ -10,7 +20,9 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#endif
int __rmonActive = FALSE;
diff --git a/lib/ultralib/src/rmon/rmonmem.c b/lib/ultralib/src/rmon/rmonmem.c
index 0880fe9..a11051b 100644
--- a/lib/ultralib/src/rmon/rmonmem.c
+++ b/lib/ultralib/src/rmon/rmonmem.c
@@ -1,3 +1,13 @@
+#include "PR/os_version.h"
+
+#if BUILD_VERSION < VERSION_J
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
+
#ifndef _FINALROM
#include "dbgproto.h"
@@ -10,7 +20,9 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#endif
u8 __rmonUtilityBuffer[256] ALIGNED(8);
diff --git a/lib/ultralib/src/rmon/rmonmisc.c b/lib/ultralib/src/rmon/rmonmisc.c
index aec32d6..a1aa96c 100644
--- a/lib/ultralib/src/rmon/rmonmisc.c
+++ b/lib/ultralib/src/rmon/rmonmisc.c
@@ -8,7 +8,15 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
int __rmonSetFault(KKHeader* req) {
KKFaultRequest* request = (KKFaultRequest*)req;
diff --git a/lib/ultralib/src/rmon/rmonrcp.s b/lib/ultralib/src/rmon/rmonrcp.s
index 2128c9a..539f41d 100644
--- a/lib/ultralib/src/rmon/rmonrcp.s
+++ b/lib/ultralib/src/rmon/rmonrcp.s
@@ -1,4 +1,5 @@
-#ifndef _FINALROM
+#include "PR/os_version.h"
+#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J
#include "sys/asm.h"
#include "sys/regdef.h"
diff --git a/lib/ultralib/src/rmon/rmonregs.c b/lib/ultralib/src/rmon/rmonregs.c
index 06b3e2c..39cf5b2 100644
--- a/lib/ultralib/src/rmon/rmonregs.c
+++ b/lib/ultralib/src/rmon/rmonregs.c
@@ -6,15 +6,31 @@
#include "PR/sptask.h"
#include "rmonint.h"
#include "PR/rdb.h"
+#include "PR/os_version.h"
#include "macros.h"
// TODO: these come from headers
+#if BUILD_VERSION >= VERSION_K
#ident "$Revision: 1.4 $"
+// This revision was bumped down at K for some reason
#ident "$Revision: 3.70 $"
#ident "$Revision: 1.5 $"
#ident "$Revision: 1.2 $"
#ident "$Revision: 1.4 $"
+#elif BUILD_VERSION >= VERSION_J
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 3.71 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
static u32 RCPpc;
static u32 oldIMEMvalue;
diff --git a/lib/ultralib/src/rmon/rmonsio.c b/lib/ultralib/src/rmon/rmonsio.c
index c239376..3e45995 100644
--- a/lib/ultralib/src/rmon/rmonsio.c
+++ b/lib/ultralib/src/rmon/rmonsio.c
@@ -1,3 +1,13 @@
+#include "PR/os_version.h"
+
+#if BUILD_VERSION < VERSION_J
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
+
#ifndef _FINALROM
#include "PR/os_internal.h"
@@ -13,7 +23,9 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#endif
static OSMesgQueue IOmq ALIGNED(8);
static OSMesg IOmsgs;
diff --git a/lib/ultralib/src/rmon/rmontask.c b/lib/ultralib/src/rmon/rmontask.c
index f1c73f0..25757a7 100644
--- a/lib/ultralib/src/rmon/rmontask.c
+++ b/lib/ultralib/src/rmon/rmontask.c
@@ -9,7 +9,15 @@
#include "macros.h"
// TODO: this comes from a header
+#if BUILD_VERSION >= VERSION_J
#ident "$Revision: 1.4 $"
+#else
+#ident "$Revision: 3.70 $"
+#ident "$Revision: 1.5 $"
+#ident "$Revision: 1.2 $"
+#ident "$Revision: 1.4 $"
+#ident "$Revision: 1.3 $"
+#endif
void __rmonMaskIdleThreadInts(void) {
register OSThread* tptr = __osGetActiveQueue();
diff --git a/lib/ultralib/src/sp/sprite.c b/lib/ultralib/src/sp/sprite.c
index f0732b4..719a662 100644
--- a/lib/ultralib/src/sp/sprite.c
+++ b/lib/ultralib/src/sp/sprite.c
@@ -20,7 +20,7 @@
*/
#include <assert.h>
#include <sp.h>
-
+#include <PR/os_version.h>
// TODO: this comes from a header
#ident "$Revision: 1.17 $"
@@ -185,6 +185,7 @@ drawbitmap (Gfx **glp, Sprite *s, Bitmap *b,
if( b->buf != prev_bmbuf ) {
switch(s->bmsiz)
{
+#if BUILD_VERSION >= VERSION_J
case G_IM_SIZ_DD:
gDPLoadTextureTile_4b(gl++, b->buf, s->bmfmt, tex_width, tex_height,
b->s, b->t,
@@ -194,6 +195,7 @@ drawbitmap (Gfx **glp, Sprite *s, Bitmap *b,
s_mask, t_mask,
s_lod, t_lod);
break;
+#endif
case G_IM_SIZ_4b:
if (s->attr & SP_TEXSHUF) {
gDPLoadTextureBlock_4bS(gl++, b->buf, s->bmfmt,
@@ -722,6 +724,11 @@ spDraw ( Sprite *s )
gSPEndDisplayList ( gl++ );
+#if BUILD_VERSION >= VERSION_J
+#line 722
+#else
+#line 714
+#endif
assert((gl - ogl) < s->ndisplist);
s->rsp_dl_next = gl;
return( dl_start );
diff --git a/lib/ultralib/src/voice/voicecontread2.c b/lib/ultralib/src/voice/voicecontread2.c
index 3808c7b..a204ffc 100644
--- a/lib/ultralib/src/voice/voicecontread2.c
+++ b/lib/ultralib/src/voice/voicecontread2.c
@@ -5,16 +5,14 @@
#include "io/controller_voice.h"
#include "io/siint.h"
-#define READ2FORMAT(p) ((__OSVoiceRead2Format*)(ptr))
+#define READ2FORMAT(ptr) ((__OSVoiceRead2Format*)(ptr))
s32 __osVoiceContRead2(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
s32 ret = 0;
u8 status;
int i;
u8* ptr;
- int retry;
-
- retry = 2;
+ int retry = 2;
__osSiGetAccess();
@@ -26,7 +24,7 @@ s32 __osVoiceContRead2(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
__osContLastCmd = CONT_CMD_READ2_VOICE;
__osPfsLastChannel = channel;
- for (i = 0; i < channel; i++) { *ptr++ = 0; }
+ for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
__osPfsPifRam.pifstatus = CONT_CMD_EXE;
@@ -61,7 +59,7 @@ s32 __osVoiceContRead2(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
ret = CONT_ERR_CONTRFAIL;
}
} else {
- bcopy(&READ2FORMAT(ptr)->data, buffer, ARRLEN(READ2FORMAT(ptr)->data));
+ bcopy(READ2FORMAT(ptr)->data, buffer, ARRLEN(READ2FORMAT(ptr)->data));
}
} else {
ret = CONT_ERR_NO_CONTROLLER;
diff --git a/lib/ultralib/src/voice/voicecontread36.c b/lib/ultralib/src/voice/voicecontread36.c
index 6c1677e..c537aff 100644
--- a/lib/ultralib/src/voice/voicecontread36.c
+++ b/lib/ultralib/src/voice/voicecontread36.c
@@ -5,7 +5,7 @@
#include "io/controller_voice.h"
#include "io/siint.h"
-#define READ36FORMAT(p) ((__OSVoiceRead36Format*)(ptr))
+#define READ36FORMAT(ptr) ((__OSVoiceRead36Format*)(ptr))
s32 __osVoiceContRead36(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
s32 ret = 0;
@@ -24,7 +24,7 @@ s32 __osVoiceContRead36(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
__osContLastCmd = CONT_CMD_READ36_VOICE;
__osPfsLastChannel = channel;
- for (i = 0; i < channel; i++) { *ptr++ = 0; }
+ for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
__osPfsPifRam.pifstatus = CONT_CMD_EXE;
diff --git a/lib/ultralib/src/voice/voicecontwrite20.c b/lib/ultralib/src/voice/voicecontwrite20.c
index 53b78eb..d1a7446 100644
--- a/lib/ultralib/src/voice/voicecontwrite20.c
+++ b/lib/ultralib/src/voice/voicecontwrite20.c
@@ -5,18 +5,16 @@
#include "io/controller_voice.h"
#include "io/siint.h"
-#define WRITE20FORMAT(p) ((__OSVoiceWrite20Format*)(ptr))
+#define WRITE20FORMAT(ptr) ((__OSVoiceWrite20Format*)(ptr))
s32 __osVoiceContWrite20(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
s32 ret = 0;
u8 status;
int i;
u8* ptr;
- int retry;
+ int retry = 2;
u8 crc;
- retry = 2;
-
__osSiGetAccess();
do {
@@ -27,7 +25,7 @@ s32 __osVoiceContWrite20(OSMesgQueue* mq, int channel, u16 address, u8* buffer)
__osContLastCmd = CONT_CMD_WRITE20_VOICE;
__osPfsLastChannel = channel;
- for (i = 0; i < channel; i++) { *ptr++ = 0; }
+ for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
__osPfsPifRam.pifstatus = CONT_CMD_EXE;
@@ -45,15 +43,15 @@ s32 __osVoiceContWrite20(OSMesgQueue* mq, int channel, u16 address, u8* buffer)
WRITE20FORMAT(ptr)->addrh = address >> 3;
WRITE20FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address);
- bcopy(buffer, &WRITE20FORMAT(ptr)->data, 20);
+ bcopy(buffer, WRITE20FORMAT(ptr)->data, ARRLEN(WRITE20FORMAT(ptr)->data));
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
- crc = __osVoiceContDataCrc(buffer, 20);
+ crc = __osVoiceContDataCrc(buffer, ARRLEN(WRITE20FORMAT(ptr)->data));
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
- ret = (WRITE20FORMAT(ptr)->rxsize & 0xC0) >> 4;
+ ret = CHNL_ERR(*WRITE20FORMAT(ptr));
if (ret == 0) {
if (crc != WRITE20FORMAT(ptr)->datacrc) {
diff --git a/lib/ultralib/src/voice/voicecontwrite4.c b/lib/ultralib/src/voice/voicecontwrite4.c
index 949952c..6f00586 100644
--- a/lib/ultralib/src/voice/voicecontwrite4.c
+++ b/lib/ultralib/src/voice/voicecontwrite4.c
@@ -5,7 +5,7 @@
#include "io/controller_voice.h"
#include "io/siint.h"
-#define WRITE4FORMAT(p) ((__OSVoiceWrite4Format*)(ptr))
+#define WRITE4FORMAT(ptr) ((__OSVoiceWrite4Format*)(ptr))
s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
s32 ret = 0;
@@ -25,7 +25,7 @@ s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
__osContLastCmd = CONT_CMD_WRITE4_VOICE;
__osPfsLastChannel = channel;
- for (i = 0; i < channel; i++) { *ptr++ = 0; }
+ for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
__osPfsPifRam.pifstatus = CONT_CMD_EXE;
@@ -43,15 +43,15 @@ s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
WRITE4FORMAT(ptr)->addrh = address >> 3;
WRITE4FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address);
- bcopy(buffer, &WRITE4FORMAT(ptr)->data, 4);
+ bcopy(buffer, WRITE4FORMAT(ptr)->data, ARRLEN(WRITE4FORMAT(ptr)->data));
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
- crc = __osVoiceContDataCrc(buffer, 4);
+ crc = __osVoiceContDataCrc(buffer, ARRLEN(WRITE4FORMAT(ptr)->data));
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
- ret = (WRITE4FORMAT(ptr)->rxsize & 0xC0) >> 4;
+ ret = CHNL_ERR(*WRITE4FORMAT(ptr));
if (ret == 0) {
if (crc != WRITE4FORMAT(ptr)->datacrc) {
diff --git a/lib/ultralib/src/voice/voicegetstatus.c b/lib/ultralib/src/voice/voicegetstatus.c
index 966e539..e7328c1 100644
--- a/lib/ultralib/src/voice/voicegetstatus.c
+++ b/lib/ultralib/src/voice/voicegetstatus.c
@@ -17,7 +17,7 @@ s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) {
if (ret != CONT_ERR_CONTRFAIL) {
__osContPifRam.pifstatus = CONT_CMD_EXE;
- for (i = 0; i < port; i++, *ptr++ = 0) {
+ for (i = 0; i < port; i++, *ptr++ = CONT_CMD_REQUEST_STATUS) {
;
}
diff --git a/lib/ultralib/src/voice/voicesetadconverter.c b/lib/ultralib/src/voice/voicesetadconverter.c
index 7dcbaf0..d1c5eb2 100644
--- a/lib/ultralib/src/voice/voicesetadconverter.c
+++ b/lib/ultralib/src/voice/voicesetadconverter.c
@@ -5,7 +5,7 @@
#include "io/controller_voice.h"
#include "io/siint.h"
-#define SWRITEFORMAT(p) ((__OSVoiceSWriteFormat*)(p))
+#define SWRITEFORMAT(ptr) ((__OSVoiceSWriteFormat*)(ptr))
s32 __osVoiceSetADConverter(OSMesgQueue* mq, s32 channel, u8 data) {
s32 ret = 0;
@@ -24,7 +24,7 @@ s32 __osVoiceSetADConverter(OSMesgQueue* mq, s32 channel, u8 data) {
__osContLastCmd = CONT_CMD_SWRITE_VOICE;
__osPfsLastChannel = channel;
- for (i = 0; i < channel; i++) { *ptr++ = 0; }
+ for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
__osPfsPifRam.pifstatus = CONT_CMD_EXE;
diff --git a/lib/ultralib/src/voice/voicestopreaddata.c b/lib/ultralib/src/voice/voicestopreaddata.c
index b0f9cba..b43eb81 100644
--- a/lib/ultralib/src/voice/voicestopreaddata.c
+++ b/lib/ultralib/src/voice/voicestopreaddata.c
@@ -2,10 +2,13 @@
#include "io/controller.h"
#include "PR/os_voice.h"
#include "voiceinternal.h"
+#include "os_version.h"
s32 osVoiceStopReadData(OSVoiceHandle* hd) {
s32 ret;
+#if BUILD_VERSION >= VERSION_K
s32 i;
+#endif
u8 stat;
u8 temp[4];
@@ -24,7 +27,9 @@ s32 osVoiceStopReadData(OSVoiceHandle* hd) {
ret = __osVoiceContWrite4(hd->__mq, hd->__channel, 0, temp);
if (ret == 0) {
+#if BUILD_VERSION >= VERSION_K
i = 0;
+#endif
do {
ret = __osVoiceCheckResult(hd, &stat);
if (ret & 0xFF00) {
@@ -37,12 +42,18 @@ s32 osVoiceStopReadData(OSVoiceHandle* hd) {
} else {
hd->__mode = 0;
}
+#if BUILD_VERSION >= VERSION_K
i++;
} while ((ret == CONT_ERR_VOICE_NO_RESPONSE) && (i < 20));
+#else
+ } while ((ret == CONT_ERR_VOICE_NO_RESPONSE));
+#endif
}
+#if BUILD_VERSION >= VERSION_K
if (i >= 20) {
ret == CONT_ERR_VOICE_NO_RESPONSE;
}
+#endif
return ret;
}
diff --git a/lib/ultralib/tools/Makefile b/lib/ultralib/tools/Makefile
index 8b5487e..cf0d35e 100644
--- a/lib/ultralib/tools/Makefile
+++ b/lib/ultralib/tools/Makefile
@@ -32,9 +32,9 @@ $(GCC_DIR):
mkdir -p $@
$(IDO-5.3): | $(IDO_DIR)
- wget https://github.com/decompals/ido-static-recomp/releases/latest/download/ido-5.3-recomp-ubuntu-20.04.tar.gz
- tar xf ido-5.3-recomp-ubuntu-20.04.tar.gz -C $(IDO_DIR)
- $(RM) ido-5.3-recomp-ubuntu-20.04.tar.gz
+ wget https://github.com/decompals/ido-static-recomp/releases/latest/download/ido-5.3-recomp-linux.tar.gz
+ tar xf ido-5.3-recomp-linux.tar.gz -C $(IDO_DIR)
+ $(RM) ido-5.3-recomp-linux.tar.gz
$(IDO_DIR):
mkdir -p $@
diff --git a/lib/ultralib/tools/set_o32abi_bit.py b/lib/ultralib/tools/set_o32abi_bit.py
new file mode 100755
index 0000000..fc22d2c
--- /dev/null
+++ b/lib/ultralib/tools/set_o32abi_bit.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+import argparse, struct, sys
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument('file', help='input file')
+ args = parser.parse_args()
+
+ with open(args.file, 'r+b') as f:
+ magic = struct.unpack('>I', f.read(4))[0]
+ if magic != 0x7F454C46:
+ print('Error: Not an ELF file')
+ sys.exit(1)
+
+ f.seek(36)
+ flags = struct.unpack('>I', f.read(4))[0]
+ # if flags & 0xF0000000 != 0x20000000: # test for mips3
+ # print('Error: Architecture not mips3')
+ # sys.exit(1)
+
+ flags |= 0x00001000 # set EF_MIPS_ABI_O32
+ f.seek(36)
+ f.write(struct.pack('>I', flags))
+