diff --git a/.gitignore b/.gitignore index 909e221..505b924 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,28 @@ -# Generated by splat +.splat/ asm/ bin/ assets/ - -# Build directory build/ -.vscode/ +linker_scripts/*/auto/ +linker_scripts/*/pokestadium.ld +*_auto.ld +pokestadium.ld +pokestadium-*yaml + __pycache__/ +.make_options +ctx.c +ctx.c.m2c *.o + *.z64 -*.ld -*.csv +*.n64 +*.v64 +*.plf +*.sym +.venv -undefined_funcs_auto.txt -undefined_syms_auto.txt - -# qemu-irix compilers -tools/ido5.3_compiler/ -tools/ido7.1_compiler/ - -# diffing directory -expected/ - -# misc -.DS_Store +.vscode/* +!.vscode/c_cpp_properties.json diff --git a/.gitmodules b/.gitmodules index f77ca51..4a33b83 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "tools/n64splat"] path = tools/n64splat url = https://github.com/ethteck/n64splat.git -[submodule "tools/asmproc"] - path = tools/asmproc - url = https://github.com/simonlindholm/asm-processor.git diff --git a/Makefile b/Makefile index 21d9ba4..c8ea8ab 100644 --- a/Makefile +++ b/Makefile @@ -1,427 +1,359 @@ -BASEROM = baserom.z64 -TARGET = pokestadium -NON_MATCHING ?= 0 -RUN_CC_CHECK ?= 1 -WERROR ?= 0 +# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'. +# It is also possible to override the settings in Defaults in a file called .make_options as 'SETTING=value'. -# Fail early if baserom does not exist -ifeq ($(wildcard $(BASEROM)),) -$(error Baserom `$(BASEROM)' not found.) -endif +-include .make_options -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Linux) - HOST_OS := linux -else ifeq ($(UNAME_S),Darwin) - HOST_OS := macos +MAKEFLAGS += --no-builtin-rules + +# Ensure the build fails if a piped command fails +SHELL = /bin/bash +.SHELLFLAGS = -o pipefail -c + +# OS Detection +ifeq ($(OS),Windows_NT) +$(error Native Windows is currently unsupported for building this repository, use WSL instead c:) else - $(error Unsupported host/building OS <$(UNAME_S)>) + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + DETECTED_OS = linux + MAKE = make + VENV_BIN_DIR = bin + endif + ifeq ($(UNAME_S),Darwin) + DETECTED_OS = macos + MAKE = gmake + VENV_BIN_DIR = bin + endif endif -FRAGMENT_DIRS := \ - fragments/1/ \ - fragments/2/ \ - fragments/3/ \ - fragments/4/ \ - fragments/5/ \ - fragments/6/ \ - fragments/7/ \ - fragments/8/ \ - fragments/9/ \ - fragments/10/ \ - fragments/11/ \ - fragments/12/ \ - fragments/13/ \ - fragments/14/ \ - fragments/15/ \ - fragments/16/ \ - fragments/17/ \ - fragments/18/ \ - fragments/19/ \ - fragments/20/ \ - fragments/21/ \ - fragments/22/ \ - fragments/23/ \ - fragments/24/ \ - fragments/25/ \ - fragments/26/ \ - fragments/27/ \ - fragments/28/ \ - fragments/29/ \ - fragments/30/ \ - fragments/31/ \ - fragments/32/ \ - fragments/33/ \ - fragments/34/ \ - fragments/35/ \ - fragments/36/ \ - fragments/37/ \ - fragments/38/ \ - fragments/39/ \ - fragments/40/ \ - fragments/41/ \ - fragments/42/ \ - fragments/43/ \ - fragments/44/ \ - fragments/45/ \ - fragments/46/ \ - fragments/47/ \ - fragments/48/ \ - fragments/49/ \ - fragments/50/ \ - fragments/51/ \ - fragments/52/ \ - fragments/53/ \ - fragments/54/ \ - fragments/55/ \ - fragments/56/ \ - fragments/57/ \ - fragments/58/ \ - fragments/59/ \ - fragments/60/ \ - fragments/61/ \ - fragments/62/ \ - fragments/63/ \ - fragments/64/ \ - fragments/65/ \ - fragments/66/ \ - fragments/67/ \ - fragments/68/ \ - fragments/69/ \ - fragments/70/ \ - fragments/71/ \ - fragments/72/ \ - fragments/73/ \ - fragments/74/ \ - fragments/75/ \ - fragments/76/ \ - fragments/77/ +#### Defaults #### +# Target game version. Currently only the following version is supported: +# us N64 US (default) +VERSION ?= us +# If COMPARE is 1, check the output md5sum after building +COMPARE ?= 1 +# If NON_MATCHING is 1, define the NON_MATCHING C flag when building +NON_MATCHING ?= 0 +# if WERROR is 1, pass -Werror to CC_CHECK, so warnings would be treated as errors +WERROR ?= 0 +# Keep .mdebug section in build +KEEP_MDEBUG ?= 1 +# Check code syntax with host compiler +RUN_CC_CHECK ?= 1 +CC_CHECK_COMP ?= gcc +# Dump build object files +OBJDUMP_BUILD ?= 0 +# Number of threads to compress with +N_THREADS ?= $(shell nproc) +# Not meant to be used by normal users. Toggles some options to improve the use of the warning checker system +WARNINGS_CHECK ?= 0 +# Disassembles matched functions and migrated data as well +FULL_DISASM ?= 0 +# Python virtual environment +VENV ?= .venv +# Python interpreter +PYTHON ?= $(VENV)/$(VENV_BIN_DIR)/python3 +# Emulator w/ flags +N64_EMULATOR ?= +# Set prefix to mips binutils binaries (mips-linux-gnu-ld => 'mips-linux-gnu-') - Change at your own risk! +# In nearly all cases, not having 'mips-linux-gnu-*' binaries on the PATH is indicative of missing dependencies +MIPS_BINUTILS_PREFIX ?= mips-linux-gnu- + +TARGET := pokestadium + +BASEROM_DIR := baseroms/$(VERSION) +BASEROM := $(BASEROM_DIR)/baserom.z64 + +ULTRALIB_VERSION := I_P +ULTRALIB_TARGET := libultra_rom + +### Output ### BUILD_DIR := build -ROM := $(TARGET).z64 -ELF := $(BUILD_DIR)/$(TARGET).elf -LD_SCRIPT := $(TARGET).ld -LD_MAP := $(BUILD_DIR)/$(TARGET).map -# TODO: Recursively make fragment folders correctly. -ASM_DIRS := asm asm/os asm/libleo asm/libultra asm/libultra/os asm/libultra/io asm/libultra/gu asm/libultra/libc asm/libultra/al asm/data -DATA_DIRS := bin assets -SRC_DIRS := $(shell find src -type d) +ROM := $(BUILD_DIR)/$(TARGET)-$(VERSION).z64 +ELF := $(ROM:.z64=.elf) +MAP := $(ROM:.z64=.map) +LDSCRIPT := $(ROM:.z64=.ld) -# Append FRAGMENT_DIRS to each dirs. -ASM_DIRS += $(addprefix asm/,$(FRAGMENT_DIRS)) -ASM_DIRS += $(addprefix asm/data/,$(FRAGMENT_DIRS)) -DATA_DIRS += $(addprefix assets/,$(FRAGMENT_DIRS)) -C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) -S_FILES := $(foreach dir,$(ASM_DIRS),$(wildcard $(dir)/*.s)) -DATA_FILES := $(foreach dir,$(DATA_DIRS),$(wildcard $(dir)/*.bin)) +#### Setup #### -# Object files -O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.c.o)) \ - $(foreach file,$(S_FILES),$(BUILD_DIR)/$(file:.s=.s.o)) \ - $(foreach file,$(DATA_FILES),$(BUILD_DIR)/$(file:.bin=.bin.o)) \ +BUILD_DEFINES ?= -DECOMP_C_OBJS := $(filter %.c.o,$(filter-out $(BUILD_DIR)/src/libultra%,$(O_FILES))) -DECOMP_POKE_STADIUM := $(filter %.c.o,$(filter-out $(BUILD_DIR)/src/libleo%,$(DECOMP_C_OBJS))) -DECOMP_LIBLEO := $(filter $(BUILD_DIR)/src/libleo/%.c.o,$(O_FILES)) - -DEP_FILES := $(O_FILES:.o=.d) $(DECOMP_C_OBJS:.o=.asmproc.d) - -SPLAT_YAML := splat.yaml -SPLAT = $(PYTHON) tools/n64splat/split.py $(SPLAT_YAML) - -##################### Compiler Options ####################### -findcmd = $(shell type $(1) >/dev/null 2>/dev/null; echo $$?) - -ifeq ($(call findcmd,mips-linux-gnu-ld),0) - CROSS := mips-linux-gnu- -else ifeq ($(call findcmd,mips64-elf-ld),0) - CROSS := mips64-elf- -else ifeq ($(call findcmd,mips-elf-ld),0) - CROSS := mips-elf- +ifeq ($(VERSION),us) + BUILD_DEFINES += -DVERSION_US=1 else - $(error Missing cross compilation toolchain) +$(error Invalid VERSION variable detected. Please use 'us') endif -AS = $(CROSS)as -LD = $(CROSS)ld -OBJDUMP = $(CROSS)objdump -OBJCOPY = $(CROSS)objcopy -ifeq ($(HOST_OS),macos) - CPP := clang -E -P -x c -else - CPP := cpp + +ifeq ($(NON_MATCHING),1) + BUILD_DEFINES += -DNON_MATCHING -DAVOID_UB + COMPARE := 0 endif -#CC := $(QEMU_IRIX) -L tools/ido7.1_compiler tools/ido7.1_compiler/usr/bin/cc -#CC_OLD := $(QEMU_IRIX) -L tools/ido5.3_compiler tools/ido5.3_compiler/usr/bin/cc +MAKE = make +CPPFLAGS += -fno-dollars-in-identifiers -P +LDFLAGS := --no-check-sections --accept-unknown-input-arch --emit-relocs --whole-archive -CC = tools/ido_recomp/$(HOST_OS)/7.1/cc -CC_OLD = tools/ido_recomp/$(HOST_OS)/5.3/cc -ASMPROC = python3 tools/asmproc/build.py -ASMPROC_FLAGS := +ifeq ($(DETECTED_OS), macos) + CPPFLAGS += -xc++ +endif -MIPS_VERSION := -mips2 +#### Tools #### +ifneq ($(shell type $(MIPS_BINUTILS_PREFIX)ld >/dev/null 2>/dev/null; echo $$?), 0) +$(error Unable to find $(MIPS_BINUTILS_PREFIX)ld. Please install or build MIPS binutils, commonly mips-linux-gnu. (or set MIPS_BINUTILS_PREFIX if your MIPS binutils install uses another prefix)) +endif -OPTFLAGS := -O2 -OBJDUMP_FLAGS := -d -r -z -Mreg-names=32 +CC := tools/ido/$(DETECTED_OS)/7.1/cc +CC_OLD := tools/ido/$(DETECTED_OS)/5.3/cc -# include locations -INC_DIRS := include include/PR include/audio . -IINCS := $(foreach d,$(INC_DIRS),-I$d) -# defines for SGI IDO -CDEFS := -D_LANGUAGE_C -DF3DEX_GBI_2 -DNDEBUG +AS := $(MIPS_BINUTILS_PREFIX)as +LD := $(MIPS_BINUTILS_PREFIX)ld +OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy +OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump +NM := $(MIPS_BINUTILS_PREFIX)nm +AR := ar +CPP := cpp +ICONV := iconv +CAT := cat + +ASM_PROC := $(PYTHON) tools/asm-processor/build.py +ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=global-with-filename + +SPLAT := $(PYTHON) -m splat split +SPLAT_YAML := $(TARGET)-$(VERSION).yaml + +IINC := -Iinclude -Isrc -Iassets/$(VERSION) -I. -I$(BUILD_DIR) +IINC += -Ilib/ultralib/include -Ilib/ultralib/include/PR -Ilib/ultralib/include/ido +IINC += -Iinclude/ + +ifeq ($(KEEP_MDEBUG),0) + RM_MDEBUG = $(OBJCOPY) --remove-section .mdebug $@ +else + RM_MDEBUG = @: +endif + +# Check code syntax with host compiler +CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label +# Have CC_CHECK pretend to be a MIPS compiler +MIPS_BUILTIN_DEFS := -DMIPSEB -D_MIPS_FPSET=16 -D_MIPS_ISA=2 -D_ABIO32=1 -D_MIPS_SIM=_ABIO32 -D_MIPS_SZINT=32 -D_MIPS_SZPTR=32 ifneq ($(RUN_CC_CHECK),0) - CHECK_WARNINGS := -Wall -Wextra -Wno-unknown-pragmas - CHECK_DEFS := -D_MIPS_SZLONG=32 -DNON_MATCHING - CHECK_FLAGS := -fno-builtin -funsigned-char -fdiagnostics-color -std=gnu89 $(CDEFS) $(CHECK_DEFS) $(IINCS) -nostdinc - CC_CHECK := gcc -fsyntax-only - - ifeq ($(HOST_OS),linux) - CC_CHECK += -m32 - endif - - ifneq ($(WERROR),0) - CHECK_WARNINGS += -Werror +# The -MMD flags additionaly creates a .d file with the same name as the .o file. + CC_CHECK := $(CC_CHECK_COMP) + CC_CHECK_FLAGS := -MMD -MP -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -m32 -DNON_MATCHING -DAVOID_UB -DCC_CHECK=1 + ifneq ($(WERROR), 0) + CHECK_WARNINGS += -Werror endif else - CC_CHECK := @: + CC_CHECK := @: endif -######################## Flags ############################# -ASFLAGS = -EB -mtune=vr4300 -march=vr4300 $(IINCS) -32 +CFLAGS += -G 0 -non_shared -Xcpluscomm -nostdinc -Wab,-r4300_mul -# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Surpress the warnings with -woff. -CFLAGS = -G 0 -non_shared -Xfullwarn -Xcpluscomm $(IINCS) -Wab,-r4300_mul $(CDEFS) -woff 624,649,838,712,516,513,596,564,594,807 $(MIPS_VERSION) +WARNINGS := -fullwarn -verbose -woff 624,649,838,712,516,513,596,564,594 +ASFLAGS := -march=vr4300 -32 -G0 +COMMON_DEFINES := -D_MIPS_SZLONG=32 +GBI_DEFINES := -DF3DEX_GBI_2 +RELEASE_DEFINES := -DNDEBUG -D_FINALROM +AS_DEFINES := -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_ULTRA64 +C_DEFINES := -DLANGUAGE_C -D_LANGUAGE_C +LIBULTRA_DEFINES := -DBUILD_VERSION=VERSION_$(ULTRALIB_VERSION) +ENDIAN := -EB -LDFLAGS = -T undefined_syms.txt -T undefined_syms_auto.txt -T undefined_funcs_auto.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/$(TARGET).map --no-check-sections +OPTFLAGS := -O2 +MIPS_VERSION := -mips2 +ICONV_FLAGS := --from-code=UTF-8 --to-code=EUC-JP -######################## Targets ############################# +# Use relocations and abi fpr names in the dump +OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32 -Mno-aliases -$(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(DATA_DIRS) $(COMPRESSED_DIRS) $(MAP_DIRS) $(BGM_DIRS),$(shell mkdir -p build/$(dir))) +ifneq ($(OBJDUMP_BUILD), 0) + OBJDUMP_CMD = $(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s) + OBJCOPY_BIN = $(OBJCOPY) -O binary $@ $@.bin + LIBDUMP_CMD = $(AR) xo --output $(@:.a=) $@ +else + OBJDUMP_CMD = @: + OBJCOPY_BIN = @: + LIBDUMP_CMD = @: +endif -# The reimplementations of the string functions need to treat char as signed. -build/src/hal_libc.c.o: CFLAGS += -signed +SPLAT_FLAGS ?= +ifneq ($(WARNINGS_CHECK), 0) + SPLAT_FLAGS += --stdout-only +endif -# Libultra O1 files -build/src/libultra/os/sendmesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/stopthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/recvmesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/destroythread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/dequeuethread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/createthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/virtualtophysical.c.o: OPTFLAGS := -O1 -build/src/libultra/os/initialize.c.o: OPTFLAGS := -O1 -build/src/libultra/os/epilinkhandle.c.o: OPTFLAGS := -O1 -build/src/libultra/os/getmemsize.c.o: OPTFLAGS := -O1 -build/src/libultra/os/seteventmesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/createmesgqueue.c.o: OPTFLAGS := -O1 -build/src/libultra/os/jammesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/setthreadpri.c.o: OPTFLAGS := -O1 -build/src/libultra/os/gettime.c.o: OPTFLAGS := -O1 -build/src/libultra/os/timerintr.c.o: OPTFLAGS := -O1 -build/src/libultra/os/setglobalintmask.c.o: OPTFLAGS := -O1 -build/src/libultra/os/resetglobalintmask.c.o: OPTFLAGS := -O1 -build/src/libultra/os/settime.c.o: OPTFLAGS := -O1 -build/src/libultra/os/yieldthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/settimer.c.o: OPTFLAGS := -O1 -build/src/libultra/os/startthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/sethwinterrupt.c.o: OPTFLAGS := -O1 -build/src/libultra/io/pigetcmdq.c.o: OPTFLAGS := -O1 -build/src/libultra/io/sptask.c.o: OPTFLAGS := -O1 -build/src/libultra/io/controller.c.o: OPTFLAGS := -O1 -build/src/libultra/io/conteeplongread.c.o: OPTFLAGS := -O1 -build/src/libultra/io/viblack.c.o: OPTFLAGS := -O1 -build/src/libultra/io/visetmode.c.o: OPTFLAGS := -O1 -build/src/libultra/io/virepeatline.c.o: OPTFLAGS := -O1 -build/src/libultra/io/pfsisplug.c.o: OPTFLAGS := -O1 -build/src/libultra/io/epidma.c.o: OPTFLAGS := -O1 -build/src/libultra/io/dpctr.c.o: OPTFLAGS := -O1 -build/src/libultra/io/conteeplongwrite.c.o: OPTFLAGS := -O1 -build/src/libultra/io/si.c.o: OPTFLAGS := -O1 -build/src/libultra/io/sp.c.o: OPTFLAGS := -O1 -build/src/libultra/io/viswapbuf.c.o: OPTFLAGS := -O1 -build/src/libultra/io/sptaskyielded.c.o: OPTFLAGS := -O1 -build/src/libultra/io/vi.c.o: OPTFLAGS := -O1 -build/src/libultra/io/visetevent.c.o: OPTFLAGS := -O1 -build/src/libultra/io/aisetnextbuf.c.o: OPTFLAGS := -O1 -build/src/libultra/io/ai.c.o: OPTFLAGS := -O1 -build/src/libultra/io/vigetcurrframebuf.c.o: OPTFLAGS := -O1 -build/src/libultra/io/spsetpc.c.o: OPTFLAGS := -O1 -build/src/libultra/libc/ll.c.o: OPTFLAGS := -O1 -build/src/libultra/libc/ll.c.o: MIPS_VERSION := -mips3 -32 -build/src/libultra/libc/llcvt.c.o: OPTFLAGS := -O1 -build/src/libultra/libc/llcvt.c.o: MIPS_VERSION := -mips3 -32 +ifneq ($(FULL_DISASM), 0) + SPLAT_FLAGS += --disassemble-all +endif -# cheap hack. TODO: Make the override better -build/src/libultra/io/gbpakpower.c.o: OPTFLAGS += -Wo,-loopunroll,0 -build/src/libultra/io/gbpakinit.c.o: OPTFLAGS += -Wo,-loopunroll,0 -build/src/libultra/io/gbpakselectbank.c.o: OPTFLAGS += -Wo,-loopunroll,0 +#### Files #### -build/src/C030.c.o: OPTFLAGS += -Wo,-loopunroll,0 +$(shell mkdir -p asm/$(VERSION) assets/$(VERSION) linker_scripts/$(VERSION)/auto) -# Libultra misc -build/src/libultra/gu/scale.c.o: CC := $(CC_OLD) -build/src/libultra/gu/scale.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/translate.c.o: CC := $(CC_OLD) -build/src/libultra/gu/translate.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/mtxcatf.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxcatf.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/mtxcatl.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxcatl.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/rotateRPY.c.o: CC := $(CC_OLD) -build/src/libultra/gu/rotateRPY.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/rotate.c.o: CC := $(CC_OLD) -build/src/libultra/gu/rotate.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/ortho.c.o: CC := $(CC_OLD) -build/src/libultra/gu/ortho.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/sinf.c.o: CC := $(CC_OLD) -build/src/libultra/gu/cosf.c.o: CC := $(CC_OLD) -build/src/libultra/gu/random.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xprintf.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xprintf.c.o: OPTFLAGS := -O3 -build/src/libultra/libc/xldtob.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xldtob.c.o: OPTFLAGS := -O3 -build/src/libultra/libc/xlitob.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xlitob.c.o: OPTFLAGS := -O3 -build/src/libultra/libc/string.c.o: CC := $(CC_OLD) -build/src/libultra/libc/string.c.o: OPTFLAGS := -O3 -build/src/libultra/io/controller.c.o: CC := $(CC_OLD) -build/src/libultra/io/contreaddata.c.o: CC := $(CC_OLD) -build/src/libultra/io/devmgr.c.o: CC := $(CC_OLD) -build/src/libultra/os/initialize.c.o: CC := $(CC_OLD) -build/src/libultra/io/pfsgetstatus.c.o: CC := $(CC_OLD) -build/src/libultra/io/epiread.c.o: CC := $(CC_OLD) -build/src/libultra/al/reverb.c.o: CC := $(CC_OLD) -build/src/libultra/al/bnkf.c.o: CC := $(CC_OLD) -build/src/libultra/al/bnkf.c.o: OPTFLAGS := -O3 -build/src/libultra/al/load.c.o: CC := $(CC_OLD) -build/src/libultra/al/load.c.o: OPTFLAGS := -O3 -build/src/libultra/al/synthesizer.c.o: CC := $(CC_OLD) -build/src/libultra/al/drvrNew.c.o: CC := $(CC_OLD) -build/src/libultra/al/mainbus.c.o: CC := $(CC_OLD) -build/src/libultra/al/mainbus.c.o: OPTFLAGS := -O3 -build/src/libultra/al/auxbus.c.o: CC := $(CC_OLD) -build/src/libultra/al/auxbus.c.o: OPTFLAGS := -O3 -build/src/libultra/al/env.c.o: CC := $(CC_OLD) -build/src/libultra/al/resample.c.o: CC := $(CC_OLD) -build/src/libultra/al/resample.c.o: OPTFLAGS := -O3 -build/src/libultra/al/save.c.o: CC := $(CC_OLD) -build/src/libultra/al/heapalloc.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxutil.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxutil.c.o: OPTFLAGS := -O3 -build/src/libultra/io/pfsisplug.c.o: CC := $(CC_OLD) -build/src/libultra/io/conteepprobe.c.o: CC := $(CC_OLD) -build/src/libultra/io/conteepwrite.c.o: CC := $(CC_OLD) -build/src/libultra/io/conteepread.c.o: CC := $(CC_OLD) -build/src/libultra/io/contpfs.c.o: CC := $(CC_OLD) -build/src/libultra/io/viswapcontext.c.o: CC := $(CC_OLD) -build/src/libultra/io/contramwrite.c.o: CC := $(CC_OLD) -build/src/libultra/io/contramread.c.o: CC := $(CC_OLD) -build/src/libultra/io/crc.c.o: CC := $(CC_OLD) -build/src/libultra/libc/ldiv.c.o: CC := $(CC_OLD) -build/src/libultra/io/vimgr.c.o: CC := $(CC_OLD) -build/src/libultra/io/visetxscale.c.o: CC := $(CC_OLD) -build/src/libultra/io/visetxscale.c.o: OPTFLAGS := -O1 -build/src/libultra/io/visetyscale.c.o: CC := $(CC_OLD) -build/src/libultra/io/visetyscale.c.o: OPTFLAGS := -O1 -build/src/libultra/al/synallocfx.c.o: CC := $(CC_OLD) -build/src/libultra/al/synallocfx.c.o: OPTFLAGS := -O3 +ULTRALIB_DIR := lib/ultralib +ULTRALIB_LIB := $(ULTRALIB_DIR)/build/$(ULTRALIB_VERSION)/$(ULTRALIB_TARGET)/$(ULTRALIB_TARGET).a +LIBULTRA_DIR := lib/libultra +LIBULTRA_LIB := $(BUILD_DIR)/$(LIBULTRA_DIR).a -build/src/libultra/io/gbpakcheckconnector.c.o: CC := $(CC_OLD) -build/src/libultra/io/gbpakreadid.c.o: CC := $(CC_OLD) -build/src/libultra/io/gbpakreadwrite.c.o: CC := $(CC_OLD) -build/src/libultra/io/gbpakselectbank.c.o: CC := $(CC_OLD) +SRC_DIRS := $(shell find src -type d) +ASM_DIRS := $(shell find asm/$(VERSION) -type d -not -path "asm/$(VERSION)/nonmatchings/*" -not -path "asm/$(VERSION)/lib/*") +ASSET_DIRS := $(shell find assets/$(VERSION) -type d) +LIB_DIRS := $(foreach f, $(LIBULTRA_DIR), $f) -# run ASM-processor on non-libultra source files -$(DECOMP_POKE_STADIUM): CC := $(ASMPROC) $(ASMPROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- -$(DECOMP_LIBLEO): CC := $(ASMPROC) $(ASMPROC_FLAGS) $(CC_OLD) -- $(AS) $(ASFLAGS) -- +C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) +S_FILES := $(foreach dir,$(ASM_DIRS) $(SRC_DIRS),$(wildcard $(dir)/*.s)) +BIN_FILES := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.bin)) +O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \ + $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \ + $(foreach f,$(BIN_FILES:.bin=.o),$(BUILD_DIR)/$f) -# turn off syntax checking errors for libultra -build/src/libultra/al/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/gu/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/io/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/libc/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/os/%.c.o: CHECK_WARNINGS := -w +ASSET_PNGS := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.png)) +ASSET_BINS := $(foreach f,$(ASSET_PNGS:.png=.bin),$(BUILD_DIR)/$f) +ASSET_INC_C := $(foreach f,$(ASSET_PNGS:.png=.inc.c),$(BUILD_DIR)/$f) -######################## Build ############################# -default: all +# Automatic dependency files +DEP_FILES := $(O_FILES:.o=.d) \ + $(O_FILES:.o=.asmproc.d) -LD_SCRIPT = $(TARGET).ld +# create build directories +$(shell mkdir -p $(BUILD_DIR)/linker_scripts/$(VERSION) $(BUILD_DIR)/linker_scripts/$(VERSION)/auto $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_DIRS) $(LIB_DIRS),$(BUILD_DIR)/$(dir))) + + +# directory flags +build/src/boot/O2/%.o: OPTFLAGS := -O2 +build/src/boot/libc/%.o: OPTFLAGS := -O2 +build/src/boot/libc64/%.o: OPTFLAGS := -O2 +build/src/boot/libm/%.o: OPTFLAGS := -O2 +build/src/boot/libu64/%.o: OPTFLAGS := -O2 + +# per-file flags + +build/src/boot/fault.o: CFLAGS += -trapuv +build/src/boot/fault_drawer.o: CFLAGS += -trapuv +build/src/C030.o: OPTFLAGS += -Wo,-loopunroll,0 +build/src/hal_libc.o: CFLAGS += -signed + +# cc & asm-processor +build/src/libleo/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC_OLD) -- $(AS) $(ASFLAGS) -- +build/src/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- + + +#### Main Targets ### + +all: rom rom: $(ROM) - -all: $(BUILD_DIR) $(BUILD_DIR)/$(ROM) verify - -distclean: - rm -rf asm bin assets $(BUILD_DIR) undefined_syms_auto.txt undefined_funcs_auto.txt +ifneq ($(COMPARE),0) + @md5sum $(ROM) + @md5sum -c $(BASEROM_DIR)/checksum.md5 +endif clean: - rm -rf $(BUILD_DIR) + $(RM) -r $(BUILD_DIR) -submodules: - git submodule update --init --recursive +libclean: + $(MAKE) -C lib/ultralib clean VERSION=$(ULTRALIB_VERSION) TARGET=$(ULTRALIB_TARGET) + $(RM) -rf $(BUILD_DIR)/lib + $(RM) -r build/$(TARGET)-$(VERSION).elf + $(RM) -r build/$(TARGET)-$(VERSION).ld + $(RM) -r build/$(TARGET)-$(VERSION).map + $(RM) -r build/$(TARGET)-$(VERSION).z64 -split: - rm -rf $(DATA_DIRS) $(ASM_DIRS) && ./tools/n64splat/split.py $(SPLAT_YAML) +distclean: clean libclean + $(RM) -r $(BUILD_DIR) asm/ assets/ .splat/ + $(RM) -r linker_scripts/$(VERSION)/auto $(LDSCRIPT) + $(MAKE) -C tools distclean -tools: - make -s -C tools +venv: + test -d $(VENV) || python3 -m venv $(VENV) + $(PYTHON) -m pip install -U pip + $(PYTHON) -m pip install -U -r requirements.txt -expected: +setup: + $(MAKE) -C tools WARNINGS_CHECK=$(WARNINGS_CHECK) + +extract: + $(RM) -r asm/$(VERSION) assets/$(VERSION) + $(CAT) yamls/$(VERSION)/header.yaml yamls/$(VERSION)/rom.yaml > $(SPLAT_YAML) + $(SPLAT) $(SPLAT_FLAGS) $(SPLAT_YAML) + +lib: $(ULTRALIB_LIB) + +diff-init: rom $(RM) -r expected/ mkdir -p expected/ cp -r $(BUILD_DIR) expected/$(BUILD_DIR) -setup: distclean submodules split +init: distclean + $(MAKE) venv + $(MAKE) setup + $(MAKE) extract + $(MAKE) all + $(MAKE) diff-init -$(BUILD_DIR): - echo $(C_FILES) - mkdir $(BUILD_DIR) +run: $(ROM) +ifeq ($(N64_EMULATOR),) + $(error Emulator path not set. Set N64_EMULATOR in the Makefile, .make_options, or define it as an environment variable) +endif + $(N64_EMULATOR) $< -$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) - @mkdir -p $(shell dirname $@) - $(CPP) -P -DBUILD_DIR=$(BUILD_DIR) -o $@ $< +.PHONY: all rom clean libclean distclean venv setup extract lib diff-init init run +.DEFAULT_GOAL := rom +# Prevent removing intermediate files +.SECONDARY: -$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf - $(OBJCOPY) $< $@ -O binary --gap-fill 0xFF -$(BUILD_DIR)/$(TARGET).elf: $(O_FILES) $(BUILD_DIR)/$(LD_SCRIPT) - @$(LD) $(LDFLAGS) -o $@ +#### Various Recipes #### -$(BUILD_DIR)/%.c.o: %.c - $(CC_CHECK) $(CHECK_FLAGS) $(CHECK_WARNINGS) -MMD -MP -MT $@ -MF $(@:.o=.d) $< - $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< +$(ROM): $(ELF) + $(OBJCOPY) -O binary --gap-fill=0xFF $< $@ +# TODO: update rom header checksum -$(BUILD_DIR)/src/libultra/libc/ll.c.o: src/libultra/libc/ll.c - $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< - python3 tools/set_o32abi_bit.py $@ - @$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s) +# TODO: avoid using auto/undefined +$(ELF): $(O_FILES) $(LIBULTRA_LIB) $(LDSCRIPT) $(BUILD_DIR)/linker_scripts/$(VERSION)/hardware_regs.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/undefined_syms.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/unused_syms.ld $(BUILD_DIR)/linker_scripts/common_undef_syms.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_syms_auto.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_funcs_auto.ld + $(LD) $(LDFLAGS) -T $(LDSCRIPT) \ + -T $(BUILD_DIR)/linker_scripts/$(VERSION)/hardware_regs.ld -T $(BUILD_DIR)/linker_scripts/$(VERSION)/undefined_syms.ld \ + -T $(BUILD_DIR)/linker_scripts/$(VERSION)/unused_syms.ld -T $(BUILD_DIR)/linker_scripts/common_undef_syms.ld \ + -T $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_syms_auto.ld -T $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_funcs_auto.ld \ + -Map $(MAP) $(LIBULTRA_LIB) -o $@ -$(BUILD_DIR)/src/libultra/libc/llcvt.c.o: src/libultra/libc/llcvt.c - $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< - python3 tools/set_o32abi_bit.py $@ - @$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s) +$(LDSCRIPT): linker_scripts/$(VERSION)/$(TARGET).ld + cp $< $@ -$(BUILD_DIR)/%.s.o: %.s - iconv --from UTF-8 --to EUC-JP $^ | $(AS) $(ASFLAGS) -o $@ +$(BUILD_DIR)/%.ld: %.ld + $(CPP) $(CPPFLAGS) $(BUILD_DEFINES) $(IINC) $< > $@ -$(BUILD_DIR)/%.bin.o: %.bin - $(LD) -r -b binary -o $@ $< +$(LIBULTRA_LIB): $(ULTRALIB_LIB) + cp $< $@ + $(LIBDUMP_CMD) -# final z64 updates checksum -$(BUILD_DIR)/$(ROM): $(BUILD_DIR)/$(TARGET).bin - @cp $< $@ +$(ULTRALIB_LIB): + $(MAKE) -C lib/ultralib VERSION=$(ULTRALIB_VERSION) TARGET=$(ULTRALIB_TARGET) FIXUPS=1 CROSS=$(MIPS_BINUTILS_PREFIX) CC=../../$(CC_OLD) -verify: $(BUILD_DIR)/$(ROM) - md5sum -c checksum.md5 +$(BUILD_DIR)/%.o: %.bin + $(OBJCOPY) -I binary -O elf32-big $< $@ -.PHONY: all clean distclean default split setup +$(BUILD_DIR)/%.o: %.s + $(ICONV) $(ICONV_FLAGS) $< | $(AS) $(ASFLAGS) $(ENDIAN) $(IINC) -I $(dir $*) -o $@ + $(OBJDUMP_CMD) -print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true +$(BUILD_DIR)/%.o: %.c + $(CC_CHECK) $(CC_CHECK_FLAGS) $(IINC) -I $(dir $*) $(CHECK_WARNINGS) $(BUILD_DEFINES) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(LIBULTRA_DEFINES) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $< + $(CC) -c $(CFLAGS) $(BUILD_DEFINES) $(IINC) $(WARNINGS) $(MIPS_VERSION) $(ENDIAN) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(LIBULTRA_DEFINES) $(C_DEFINES) $(OPTFLAGS) -o $@ $< + $(OBJDUMP_CMD) + $(RM_MDEBUG) + +# Add these as a dependency for .o files +asset_files: $(ASSET_INC_C) +$(O_FILES): | asset_files +.PHONY: asset_files -include $(DEP_FILES) + +# Print target for debugging +print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/baseroms/us/checksum.md5 b/baseroms/us/checksum.md5 new file mode 100644 index 0000000..cc70fbf --- /dev/null +++ b/baseroms/us/checksum.md5 @@ -0,0 +1 @@ +ed1378bc12115f71209a77844965ba50 build/pokestadium-us.z64 diff --git a/checksum.md5 b/checksum.md5 deleted file mode 100644 index 127df43..0000000 --- a/checksum.md5 +++ /dev/null @@ -1 +0,0 @@ -ed1378bc12115f71209a77844965ba50 build/pokestadium.z64 diff --git a/diff.py b/diff.py old mode 100644 new mode 100755 diff --git a/diff_settings.py b/diff_settings.py index 7b9d48b..de171f8 100644 --- a/diff_settings.py +++ b/diff_settings.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 def apply(config, args): - config['baseimg'] = 'baserom.z64' - config['myimg'] = 'build/pokestadium.z64' - config['mapfile'] = 'build/pokestadium.map' + config['baseimg'] = 'baseroms/us/baserom.z64' + config['myimg'] = 'build/pokestadium-us.z64' + config['mapfile'] = 'build/pokestadium-us.map' config['source_directories'] = ['.'] diff --git a/include/common.h b/include/global.h similarity index 100% rename from include/common.h rename to include/global.h diff --git a/include/macro.inc b/include/macro.inc index 5369a20..1ee4aa4 100644 --- a/include/macro.inc +++ b/include/macro.inc @@ -1,9 +1,87 @@ .macro glabel label + .global \label + .type \label, @function + \label: +.endm + +.macro dlabel label .global \label \label: .endm .macro jlabel label .global \label + .type \label, @function \label: .endm + +# COP0 register aliases + +.set Index, $0 +.set Random, $1 +.set EntryLo0, $2 +.set EntryLo1, $3 +.set Context, $4 +.set PageMask, $5 +.set Wired, $6 +.set Reserved07, $7 +.set BadVaddr, $8 +.set Count, $9 +.set EntryHi, $10 +.set Compare, $11 +.set Status, $12 +.set Cause, $13 +.set EPC, $14 +.set PRevID, $15 +.set Config, $16 +.set LLAddr, $17 +.set WatchLo, $18 +.set WatchHi, $19 +.set XContext, $20 +.set Reserved21, $21 +.set Reserved22, $22 +.set Reserved23, $23 +.set Reserved24, $24 +.set Reserved25, $25 +.set PErr, $26 +.set CacheErr, $27 +.set TagLo, $28 +.set TagHi, $29 +.set ErrorEPC, $30 +.set Reserved31, $31 + + +# Float register aliases (o32 ABI, odd ones are rarely used) + +.set $fv0, $f0 +.set $fv0f, $f1 +.set $fv1, $f2 +.set $fv1f, $f3 +.set $ft0, $f4 +.set $ft0f, $f5 +.set $ft1, $f6 +.set $ft1f, $f7 +.set $ft2, $f8 +.set $ft2f, $f9 +.set $ft3, $f10 +.set $ft3f, $f11 +.set $fa0, $f12 +.set $fa0f, $f13 +.set $fa1, $f14 +.set $fa1f, $f15 +.set $ft4, $f16 +.set $ft4f, $f17 +.set $ft5, $f18 +.set $ft5f, $f19 +.set $fs0, $f20 +.set $fs0f, $f21 +.set $fs1, $f22 +.set $fs1f, $f23 +.set $fs2, $f24 +.set $fs2f, $f25 +.set $fs3, $f26 +.set $fs3f, $f27 +.set $fs4, $f28 +.set $fs4f, $f29 +.set $fs5, $f30 +.set $fs5f, $f31 diff --git a/include/ultra64/controller.h b/include/ultra64/controller.h index 55e7f32..62cad58 100644 --- a/include/ultra64/controller.h +++ b/include/ultra64/controller.h @@ -153,9 +153,7 @@ s32 __osCheckPackId(OSPfs* pfs, __OSPackId* check); s32 __osGetId(OSPfs *pfs); s32 __osCheckId(OSPfs *pfs); s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank); -s32 __osPfsSelectBank(OSPfs *pfs, u8 bank); s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page); -s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u8 bank, __OSInodeUnit *last_page); 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); @@ -166,7 +164,7 @@ void __osPfsGetInitData(u8* pattern, OSContStatus* data); u8 __osContAddressCrc(u16 addr); u8 __osContDataCrc(u8 *data); s32 __osPfsGetStatus(OSMesgQueue *queue, int channel); -s32 __osGbpakSelectBank(OSPfs *pfs, u8 bank); +s32 __osGbpakSetBank(OSPfs *pfs, u8 bank); extern u8 __osContLastCmd; extern OSTimer __osEepromTimer; @@ -183,13 +181,6 @@ extern u8 __osMaxControllers; if (ret != 0) \ return ret; -#define SET_ACTIVEBANK_TO_ZERO \ - if (pfs->activebank != 0) \ - { \ - pfs->activebank = 0; \ - ERRCK(__osPfsSelectBank(pfs)) \ - } - #define PFS_CHECK_ID \ if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) \ return PFS_ERR_NEW_PACK; diff --git a/lib/ultralib/.github/workflows/ci_egcs.txt b/lib/ultralib/.github/workflows/ci_egcs.txt new file mode 100644 index 0000000..b6d8fe7 --- /dev/null +++ b/lib/ultralib/.github/workflows/ci_egcs.txt @@ -0,0 +1,42 @@ +# CI file for EGCS builds +# TODO: rename to `ci_egcs.yml` when the repo has EGCS / iQue support + +name: Build EGCS libultra + +# Build on every branch push, tag push, and pull request change: +on: [push, pull_request_target] + +jobs: + build_repo: + name: Build repo + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + version: [ique_v1.5] + suffix: [_rom] # [~, _d, _rom] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Install package requirements + run: sudo apt-get install -y build-essential python3 + + - name: Get extra dependencies + uses: actions/checkout@v3 + with: + repository: ${{ secrets.SECRETREPO }} + token: ${{ secrets.SECRETTOKEN }} + path: deps_repo + - name: Get the dependency + run: cp deps_repo/libultra/${{ matrix.version }}/* . + + - name: Setup + run: make setup -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} + + - name: Build libultra${{ matrix.suffix }} ${{ matrix.version }} + run: make -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} diff --git a/lib/ultralib/.github/workflows/ci_gcc.yml b/lib/ultralib/.github/workflows/ci_gcc.yml new file mode 100644 index 0000000..31efff8 --- /dev/null +++ b/lib/ultralib/.github/workflows/ci_gcc.yml @@ -0,0 +1,41 @@ +# CI file for GCC/KMC builds + +name: Build GCC libgultra + +# Build on every branch push, tag push, and pull request change: +on: [push, pull_request_target] + +jobs: + build_repo: + name: Build repo + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + version: [I, J, K, L] # [H, I, I_patch, J, K, L] + suffix: [~, _d, _rom] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Install package requirements + run: sudo apt-get install -y build-essential python3 + + - name: Get extra dependencies + uses: actions/checkout@v3 + with: + repository: ${{ secrets.SECRETREPO }} + token: ${{ secrets.SECRETTOKEN }} + path: deps_repo + - name: Get the dependency + run: cp deps_repo/libultra/${{ matrix.version }}/* base/${{ matrix.version }} + + - name: Setup + run: make setup -j $(nproc) TARGET=libgultra${{ matrix.suffix }} VERSION=${{ matrix.version }} + + - name: Build libgultra${{ matrix.suffix }} ${{ matrix.version }} + run: make -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 new file mode 100644 index 0000000..1410108 --- /dev/null +++ b/lib/ultralib/.github/workflows/ci_ido.yml @@ -0,0 +1,41 @@ +# CI file for IDO builds + +name: Build IDO libultra + +# Build on every branch push, tag push, and pull request change: +on: [push, pull_request_target] + +jobs: + build_repo: + name: Build repo + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + version: [I, J, K, L] # [E, F, G, H, I, I_patch, J, K, L] + suffix: [~, _rom] # [~, _d, _rom] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Install package requirements + run: sudo apt-get install -y build-essential python3 binutils-mips-linux-gnu + + - name: Get extra dependencies + uses: actions/checkout@v3 + with: + repository: ${{ secrets.SECRETREPO }} + token: ${{ secrets.SECRETTOKEN }} + path: deps_repo + - name: Get the dependency + run: cp deps_repo/libultra/${{ matrix.version }}/* base/${{ matrix.version }} + + - name: Setup + run: make setup -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} + + - name: Build libultra${{ matrix.suffix }} ${{ matrix.version }} + run: make -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} diff --git a/lib/ultralib/.gitignore b/lib/ultralib/.gitignore new file mode 100644 index 0000000..1193e99 --- /dev/null +++ b/lib/ultralib/.gitignore @@ -0,0 +1,29 @@ +# Cache files +__pycache__/ +.pyc +.DS_Store + +# Text editor remnants +.vscode/ +.vs/ +.idea/ +CMakeLists.txt +cmake-build-debug +venv/ +.venv + +# Project-specific ignores +base_*/ +build/ +expected/ +notes/ +tools/gcc +tools/ido +*.elf +*.o +*.a + +# Tool artifacts +ctx.c + +libultra_collection/ diff --git a/lib/ultralib/.gitrepo b/lib/ultralib/.gitrepo new file mode 100644 index 0000000..f9183f9 --- /dev/null +++ b/lib/ultralib/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = git@github.com:decompals/ultralib.git + branch = main + commit = 299d7faf8798cbe75e3247ccdf4e65c09f5270dd + parent = a10bb11ed6784c6a16a09b7eb17657d2e1bb303c + method = merge + cmdver = 0.4.6 diff --git a/lib/ultralib/Makefile b/lib/ultralib/Makefile new file mode 100644 index 0000000..19624e3 --- /dev/null +++ b/lib/ultralib/Makefile @@ -0,0 +1,235 @@ +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 := extracted/$(VERSION)/$(TARGET) +BASE_AR := base/$(VERSION)/$(TARGET).a +BUILD_ROOT := build +BUILD_DIR := $(BUILD_ROOT)/$(VERSION)/$(TARGET) +BUILD_AR := $(BUILD_DIR)/$(TARGET).a + +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_I_P := 7 +VERSION_J := 8 +VERSION_K := 9 +VERSION_L := 10 + +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) +-include Makefile.ido +else +$(error Invalid Target) +endif + +ifeq ($(findstring _rom,$(TARGET)),_rom) +CPPFLAGS += -D_FINALROM +endif + +SRC_DIRS := $(shell find src -type d) +C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) +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 I_P 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 +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 ($(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) +COMPARE_OBJ = $(CROSS)objcopy -p --strip-debug $(WORKING_DIR)/$(@:.marker=.o) $(WORKING_DIR)/$(@:.marker=.cmp.o) && \ + cmp $(BASE_DIR)/.cmp/$(@F:.marker=.cmp.o) $(WORKING_DIR)/$(@:.marker=.cmp.o) && echo "$(@:.marker=.o): OK" +COMPARE_AR = echo "$@: Cannot compare archive currently" +endif +else +COMPARE_OBJ := +COMPARE_AR := +AR_OLD := $(AR) +endif + +BASE_OBJS := $(wildcard $(BASE_DIR)/*.o) + +# 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 $(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 ($(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) + @$(COMPARE_AR) + @echo "Matched: $(NUM_OBJS_MATCHED)/$(NUM_OBJS)" +endif + +clean: + $(RM) -rf $(BUILD_DIR) + +distclean: + $(MAKE) -C tools distclean + $(RM) -rf extracted/ $(BUILD_ROOT) + +setup: + $(MAKE) -C tools +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 ($(COMPARE),0) +# change file timestamps to match original + @touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o) + @$(COMPARE_OBJ) + @touch $@ +endif + +GBIDEFINE := -DF3DEX_GBI + +$(BUILD_DIR)/src/gu/parse_gbi.marker: GBIDEFINE := -DF3D_GBI +$(BUILD_DIR)/src/gu/us2dex_emu.marker: GBIDEFINE := +$(BUILD_DIR)/src/gu/us2dex2_emu.marker: GBIDEFINE := +$(BUILD_DIR)/src/sp/sprite.marker: GBIDEFINE := -DF3D_GBI +$(BUILD_DIR)/src/sp/spriteex.marker: GBIDEFINE := +$(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) + +$(C_MARKER_FILES): $(BUILD_DIR)/%.marker: %.c + cd $( + +/* + * Segment base addresses and sizes + */ +#define KUBASE 0 +#define KUSIZE 0x80000000 +#define K0BASE 0x80000000 +#define K0SIZE 0x20000000 +#define K1BASE 0xA0000000 +#define K1SIZE 0x20000000 +#define K2BASE 0xC0000000 +#define K2SIZE 0x20000000 + +/* + * Exception vectors + */ +#define SIZE_EXCVEC 0x80 /* Size of an exc. vec */ +#define UT_VEC K0BASE /* utlbmiss vector */ +#define R_VEC (K1BASE+0x1fc00000) /* reset vector */ +#define XUT_VEC (K0BASE+0x80) /* extended address tlbmiss */ +#define ECC_VEC (K0BASE+0x100) /* Ecc exception vector */ +#define E_VEC (K0BASE+0x180) /* Gen. exception vector */ + +/* + * Address conversion macros + */ +#ifdef _LANGUAGE_ASSEMBLY + +#define K0_TO_K1(x) ((x)|0xA0000000) /* kseg0 to kseg1 */ +#define K1_TO_K0(x) ((x)&0x9FFFFFFF) /* kseg1 to kseg0 */ +#define K0_TO_PHYS(x) ((x)&0x1FFFFFFF) /* kseg0 to physical */ +#define K1_TO_PHYS(x) ((x)&0x1FFFFFFF) /* kseg1 to physical */ +#define KDM_TO_PHYS(x) ((x)&0x1FFFFFFF) /* direct mapped to physical */ +#define PHYS_TO_K0(x) ((x)|0x80000000) /* physical to kseg0 */ +#define PHYS_TO_K1(x) ((x)|0xA0000000) /* physical to kseg1 */ + +#else /* _LANGUAGE_C */ + +#define K0_TO_K1(x) ((u32)(x)|0xA0000000) /* kseg0 to kseg1 */ +#define K1_TO_K0(x) ((u32)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */ +#define K0_TO_PHYS(x) ((u32)(x)&0x1FFFFFFF) /* kseg0 to physical */ +#define K1_TO_PHYS(x) ((u32)(x)&0x1FFFFFFF) /* kseg1 to physical */ +#define KDM_TO_PHYS(x) ((u32)(x)&0x1FFFFFFF) /* direct mapped to physical */ +#define PHYS_TO_K0(x) ((u32)(x)|0x80000000) /* physical to kseg0 */ +#define PHYS_TO_K1(x) ((u32)(x)|0xA0000000) /* physical to kseg1 */ + +#endif /* _LANGUAGE_ASSEMBLY */ + +/* + * Address predicates + */ +#define IS_KSEG0(x) ((u32)(x) >= K0BASE && (u32)(x) < K1BASE) +#define IS_KSEG1(x) ((u32)(x) >= K1BASE && (u32)(x) < K2BASE) +#define IS_KSEGDM(x) ((u32)(x) >= K0BASE && (u32)(x) < K2BASE) +#define IS_KSEG2(x) ((u32)(x) >= K2BASE && (u32)(x) < KPTE_SHDUBASE) +#define IS_KPTESEG(x) ((u32)(x) >= KPTE_SHDUBASE) +#define IS_KUSEG(x) ((u32)(x) < K0BASE) + +/* + * TLB size constants + */ + +#define NTLBENTRIES 31 /* entry 31 is reserved by rdb */ + +#define TLBHI_VPN2MASK 0xffffe000 +#define TLBHI_VPN2SHIFT 13 +#define TLBHI_PIDMASK 0xff +#define TLBHI_PIDSHIFT 0 +#define TLBHI_NPID 255 /* 255 to fit in 8 bits */ + +#define TLBLO_PFNMASK 0x3fffffc0 +#define TLBLO_PFNSHIFT 6 +#define TLBLO_CACHMASK 0x38 /* cache coherency algorithm */ +#define TLBLO_CACHSHIFT 3 +#define TLBLO_UNCACHED 0x10 /* not cached */ +#define TLBLO_NONCOHRNT 0x18 /* Cacheable non-coherent */ +#define TLBLO_EXLWR 0x28 /* Exclusive write */ +#define TLBLO_D 0x4 /* writeable */ +#define TLBLO_V 0x2 /* valid bit */ +#define TLBLO_G 0x1 /* global access bit */ + +#define TLBINX_PROBE 0x80000000 +#define TLBINX_INXMASK 0x3f +#define TLBINX_INXSHIFT 0 + +#define TLBRAND_RANDMASK 0x3f +#define TLBRAND_RANDSHIFT 0 + +#define TLBWIRED_WIREDMASK 0x3f + +#define TLBCTXT_BASEMASK 0xff800000 +#define TLBCTXT_BASESHIFT 23 +#define TLBCTXT_BASEBITS 9 + +#define TLBCTXT_VPNMASK 0x7ffff0 +#define TLBCTXT_VPNSHIFT 4 + +#define TLBPGMASK_4K 0x0 +#define TLBPGMASK_16K 0x6000 +#define TLBPGMASK_64K 0x1e000 + +/* + * Status register + */ +#define SR_CUMASK 0xf0000000 /* coproc usable bits */ + +#define SR_CU3 0x80000000 /* Coprocessor 3 usable */ +#define SR_CU2 0x40000000 /* Coprocessor 2 usable */ +#define SR_CU1 0x20000000 /* Coprocessor 1 usable */ +#define SR_CU0 0x10000000 /* Coprocessor 0 usable */ +#define SR_RP 0x08000000 /* Reduced power (quarter speed) */ +#define SR_FR 0x04000000 /* MIPS III FP register mode */ +#define SR_RE 0x02000000 /* Reverse endian */ +#define SR_ITS 0x01000000 /* Instruction trace support */ +#define SR_BEV 0x00400000 /* Use boot exception vectors */ +#define SR_TS 0x00200000 /* TLB shutdown */ +#define SR_SR 0x00100000 /* Soft reset occured */ +#define SR_CH 0x00040000 /* Cache hit for last 'cache' op */ +#define SR_CE 0x00020000 /* Create ECC */ +#define SR_DE 0x00010000 /* ECC of parity does not cause error */ + +/* + * Interrupt enable bits + * (NOTE: bits set to 1 enable the corresponding level interrupt) + */ +#define SR_IMASK 0x0000ff00 /* Interrupt mask */ +#define SR_IMASK8 0x00000000 /* mask level 8 */ +#define SR_IMASK7 0x00008000 /* mask level 7 */ +#define SR_IMASK6 0x0000c000 /* mask level 6 */ +#define SR_IMASK5 0x0000e000 /* mask level 5 */ +#define SR_IMASK4 0x0000f000 /* mask level 4 */ +#define SR_IMASK3 0x0000f800 /* mask level 3 */ +#define SR_IMASK2 0x0000fc00 /* mask level 2 */ +#define SR_IMASK1 0x0000fe00 /* mask level 1 */ +#define SR_IMASK0 0x0000ff00 /* mask level 0 */ + +#define SR_IBIT8 0x00008000 /* bit level 8 */ +#define SR_IBIT7 0x00004000 /* bit level 7 */ +#define SR_IBIT6 0x00002000 /* bit level 6 */ +#define SR_IBIT5 0x00001000 /* bit level 5 */ +#define SR_IBIT4 0x00000800 /* bit level 4 */ +#define SR_IBIT3 0x00000400 /* bit level 3 */ +#define SR_IBIT2 0x00000200 /* bit level 2 */ +#define SR_IBIT1 0x00000100 /* bit level 1 */ + +#define SR_IMASKSHIFT 8 + +#define SR_KX 0x00000080 /* extended-addr TLB vec in kernel */ +#define SR_SX 0x00000040 /* xtended-addr TLB vec supervisor */ +#define SR_UX 0x00000020 /* xtended-addr TLB vec in user mode */ +#define SR_KSU_MASK 0x00000018 /* mode mask */ +#define SR_KSU_USR 0x00000010 /* user mode */ +#define SR_KSU_SUP 0x00000008 /* supervisor mode */ +#define SR_KSU_KER 0x00000000 /* kernel mode */ +#define SR_ERL 0x00000004 /* Error level, 1=>cache error */ +#define SR_EXL 0x00000002 /* Exception level, 1=>exception */ +#define SR_IE 0x00000001 /* interrupt enable, 1=>enable */ + +/* + * Cause Register + */ +#define CAUSE_BD 0x80000000 /* Branch delay slot */ +#define CAUSE_CEMASK 0x30000000 /* coprocessor error */ +#define CAUSE_CESHIFT 28 + +/* Interrupt pending bits */ +#define CAUSE_IP8 0x00008000 /* External level 8 pending - COMPARE */ +#define CAUSE_IP7 0x00004000 /* External level 7 pending - INT4 */ +#define CAUSE_IP6 0x00002000 /* External level 6 pending - INT3 */ +#define CAUSE_IP5 0x00001000 /* External level 5 pending - INT2 */ +#define CAUSE_IP4 0x00000800 /* External level 4 pending - INT1 */ +#define CAUSE_IP3 0x00000400 /* External level 3 pending - INT0 */ +#define CAUSE_SW2 0x00000200 /* Software level 2 pending */ +#define CAUSE_SW1 0x00000100 /* Software level 1 pending */ + +#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */ +#define CAUSE_IPSHIFT 8 + +#define CAUSE_EXCMASK 0x0000007C /* Cause code bits */ + +#define CAUSE_EXCSHIFT 2 + +/* Cause register exception codes */ + +#define EXC_CODE(x) ((x)<<2) + +/* Hardware exception codes */ +#define EXC_INT EXC_CODE(0) /* interrupt */ +#define EXC_MOD EXC_CODE(1) /* TLB mod */ +#define EXC_RMISS EXC_CODE(2) /* Read TLB Miss */ +#define EXC_WMISS EXC_CODE(3) /* Write TLB Miss */ +#define EXC_RADE EXC_CODE(4) /* Read Address Error */ +#define EXC_WADE EXC_CODE(5) /* Write Address Error */ +#define EXC_IBE EXC_CODE(6) /* Instruction Bus Error */ +#define EXC_DBE EXC_CODE(7) /* Data Bus Error */ +#define EXC_SYSCALL EXC_CODE(8) /* SYSCALL */ +#define EXC_BREAK EXC_CODE(9) /* BREAKpoint */ +#define EXC_II EXC_CODE(10) /* Illegal Instruction */ +#define EXC_CPU EXC_CODE(11) /* CoProcessor Unusable */ +#define EXC_OV EXC_CODE(12) /* OVerflow */ +#define EXC_TRAP EXC_CODE(13) /* Trap exception */ +#define EXC_VCEI EXC_CODE(14) /* Virt. Coherency on Inst. fetch */ +#define EXC_FPE EXC_CODE(15) /* Floating Point Exception */ +#define EXC_WATCH EXC_CODE(23) /* Watchpoint reference */ +#define EXC_VCED EXC_CODE(31) /* Virt. Coherency on data read */ + +/* C0_PRID Defines */ +#define C0_IMPMASK 0xff00 +#define C0_IMPSHIFT 8 +#define C0_REVMASK 0xff +#define C0_MAJREVMASK 0xf0 +#define C0_MAJREVSHIFT 4 +#define C0_MINREVMASK 0xf + +/* + * Coprocessor 0 operations + */ +#define C0_READI 0x1 /* read ITLB entry addressed by C0_INDEX */ +#define C0_WRITEI 0x2 /* write ITLB entry addressed by C0_INDEX */ +#define C0_WRITER 0x6 /* write ITLB entry addressed by C0_RAND */ +#define C0_PROBE 0x8 /* probe for ITLB entry addressed by TLBHI */ +#define C0_RFE 0x10 /* restore for exception */ + +/* + * 'cache' instruction definitions + */ + +/* Target cache */ +#define CACH_PI 0x0 /* specifies primary inst. cache */ +#define CACH_PD 0x1 /* primary data cache */ +#define CACH_SI 0x2 /* secondary instruction cache */ +#define CACH_SD 0x3 /* secondary data cache */ + +/* Cache operations */ +#define C_IINV 0x0 /* index invalidate (inst, 2nd inst) */ +#define C_IWBINV 0x0 /* index writeback inval (d, sd) */ +#define C_ILT 0x4 /* index load tag (all) */ +#define C_IST 0x8 /* index store tag (all) */ +#define C_CDX 0xc /* create dirty exclusive (d, sd) */ +#define C_HINV 0x10 /* hit invalidate (all) */ +#define C_HWBINV 0x14 /* hit writeback inv. (d, sd) */ +#define C_FILL 0x14 /* fill (i) */ +#define C_HWB 0x18 /* hit writeback (i, d, sd) */ +#define C_HSV 0x1c /* hit set virt. (si, sd) */ + +/* + * Cache size definitions + */ +#define ICACHE_SIZE 0x4000 /* 16K */ +#define ICACHE_LINESIZE 32 /* 8 words */ +#define ICACHE_LINEMASK (ICACHE_LINESIZE-1) + +#define DCACHE_SIZE 0x2000 /* 8K */ +#define DCACHE_LINESIZE 16 /* 4 words */ +#define DCACHE_LINEMASK (DCACHE_LINESIZE-1) + +/* + * C0_CONFIG register definitions + */ +#define CONFIG_CM 0x80000000 /* 1 == Master-Checker enabled */ +#define CONFIG_EC 0x70000000 /* System Clock ratio */ +#define CONFIG_EC_1_1 0x6 /* System Clock ratio 1 :1 */ +#define CONFIG_EC_3_2 0x7 /* System Clock ratio 1.5 :1 */ +#define CONFIG_EC_2_1 0x0 /* System Clock ratio 2 :1 */ +#define CONFIG_EC_3_1 0x1 /* System Clock ratio 3 :1 */ +#define CONFIG_EP 0x0f000000 /* Transmit Data Pattern */ +#define CONFIG_SB 0x00c00000 /* Secondary cache block size */ + +#define CONFIG_SS 0x00200000 /* Split scache: 0 == I&D combined */ +#define CONFIG_SW 0x00100000 /* scache port: 0==128, 1==64 */ +#define CONFIG_EW 0x000c0000 /* System Port width: 0==64, 1==32 */ +#define CONFIG_SC 0x00020000 /* 0 -> 2nd cache present */ +#define CONFIG_SM 0x00010000 /* 0 -> Dirty Shared Coherency enabled*/ +#define CONFIG_BE 0x00008000 /* Endian-ness: 1 --> BE */ +#define CONFIG_EM 0x00004000 /* 1 -> ECC mode, 0 -> parity */ +#define CONFIG_EB 0x00002000 /* Block order:1->sequent,0->subblock */ + +#define CONFIG_IC 0x00000e00 /* Primary Icache size */ +#define CONFIG_DC 0x000001c0 /* Primary Dcache size */ +#define CONFIG_IB 0x00000020 /* Icache block size */ +#define CONFIG_DB 0x00000010 /* Dcache block size */ +#define CONFIG_CU 0x00000008 /* Update on Store-conditional */ +#define CONFIG_K0 0x00000007 /* K0SEG Coherency algorithm */ + +#define CONFIG_UNCACHED 0x00000002 /* K0 is uncached */ +#define CONFIG_NONCOHRNT 0x00000003 +#define CONFIG_COHRNT_EXLWR 0x00000005 +#define CONFIG_SB_SHFT 22 /* shift SB to bit position 0 */ +#define CONFIG_IC_SHFT 9 /* shift IC to bit position 0 */ +#define CONFIG_DC_SHFT 6 /* shift DC to bit position 0 */ +#define CONFIG_BE_SHFT 15 /* shift BE to bit position 0 */ + +/* + * C0_TAGLO definitions for setting/getting cache states and physaddr bits + */ +#define SADDRMASK 0xFFFFE000 /* 31..13 -> scache paddr bits 35..17 */ +#define SVINDEXMASK 0x00000380 /* 9..7: prim virt index bits 14..12 */ +#define SSTATEMASK 0x00001c00 /* bits 12..10 hold scache line state */ +#define SINVALID 0x00000000 /* invalid --> 000 == state 0 */ +#define SCLEANEXCL 0x00001000 /* clean exclusive --> 100 == state 4 */ +#define SDIRTYEXCL 0x00001400 /* dirty exclusive --> 101 == state 5 */ +#define SECC_MASK 0x0000007f /* low 7 bits are ecc for the tag */ +#define SADDR_SHIFT 4 /* shift STagLo (31..13) to 35..17 */ + +#define PADDRMASK 0xFFFFFF00 /* PTagLo31..8->prim paddr bits35..12 */ +#define PADDR_SHIFT 4 /* roll bits 35..12 down to 31..8 */ +#define PSTATEMASK 0x00C0 /* bits 7..6 hold primary line state */ +#define PINVALID 0x0000 /* invalid --> 000 == state 0 */ +#define PCLEANEXCL 0x0080 /* clean exclusive --> 10 == state 2 */ +#define PDIRTYEXCL 0x00C0 /* dirty exclusive --> 11 == state 3 */ +#define PPARITY_MASK 0x0001 /* low bit is parity bit (even). */ + +/* + * C0_CACHE_ERR definitions. + */ +#define CACHERR_ER 0x80000000 /* 0: inst ref, 1: data ref */ +#define CACHERR_EC 0x40000000 /* 0: primary, 1: secondary */ +#define CACHERR_ED 0x20000000 /* 1: data error */ +#define CACHERR_ET 0x10000000 /* 1: tag error */ +#define CACHERR_ES 0x08000000 /* 1: external ref, e.g. snoop*/ +#define CACHERR_EE 0x04000000 /* error on SysAD bus */ +#define CACHERR_EB 0x02000000 /* complicated, see spec. */ +#define CACHERR_EI 0x01000000 /* complicated, see spec. */ +#define CACHERR_SIDX_MASK 0x003ffff8 /* secondary cache index */ +#define CACHERR_PIDX_MASK 0x00000007 /* primary cache index */ +#define CACHERR_PIDX_SHIFT 12 /* bits 2..0 are paddr14..12 */ + +/* R4000 family supports hardware watchpoints: + * C0_WATCHLO: + * bits 31..3 are bits 31..3 of physaddr to watch + * bit 2: reserved; must be written as 0. + * bit 1: when set causes a watchpoint trap on load accesses to paddr. + * bit 0: when set traps on stores to paddr; + * C0_WATCHHI + * bits 31..4 are reserved and must be written as zeros. + * bits 3..0 are bits 35..32 of the physaddr to watch + */ +#define WATCHLO_WTRAP 0x00000001 +#define WATCHLO_RTRAP 0x00000002 +#define WATCHLO_ADDRMASK 0xfffffff8 +#define WATCHLO_VALIDMASK 0xfffffffb +#define WATCHHI_VALIDMASK 0x0000000f + +/* + * Coprocessor 0 registers + */ +#ifdef _LANGUAGE_ASSEMBLY +#define C0_INX $0 +#define C0_RAND $1 +#define C0_ENTRYLO0 $2 +#define C0_ENTRYLO1 $3 +#define C0_CONTEXT $4 +#define C0_PAGEMASK $5 /* page mask */ +#define C0_WIRED $6 /* # wired entries in tlb */ +#define C0_BADVADDR $8 +#define C0_COUNT $9 /* free-running counter */ +#define C0_ENTRYHI $10 +#define C0_SR $12 +#define C0_CAUSE $13 +#define C0_EPC $14 +#define C0_PRID $15 /* revision identifier */ +#define C0_COMPARE $11 /* counter comparison reg. */ +#define C0_CONFIG $16 /* hardware configuration */ +#define C0_LLADDR $17 /* load linked address */ +#define C0_WATCHLO $18 /* watchpoint */ +#define C0_WATCHHI $19 /* watchpoint */ +#define C0_ECC $26 /* S-cache ECC and primary parity */ +#define C0_CACHE_ERR $27 /* cache error status */ +#define C0_TAGLO $28 /* cache operations */ +#define C0_TAGHI $29 /* cache operations */ +#define C0_ERROR_EPC $30 /* ECC error prg. counter */ + +# else /* ! _LANGUAGE_ASSEMBLY */ + +#define C0_INX 0 +#define C0_RAND 1 +#define C0_ENTRYLO0 2 +#define C0_ENTRYLO1 3 +#define C0_CONTEXT 4 +#define C0_PAGEMASK 5 /* page mask */ +#define C0_WIRED 6 /* # wired entries in tlb */ +#define C0_BADVADDR 8 +#define C0_COUNT 9 /* free-running counter */ +#define C0_ENTRYHI 10 +#define C0_SR 12 +#define C0_CAUSE 13 +#define C0_EPC 14 +#define C0_PRID 15 /* revision identifier */ +#define C0_COMPARE 11 /* counter comparison reg. */ +#define C0_CONFIG 16 /* hardware configuration */ +#define C0_LLADDR 17 /* load linked address */ +#define C0_WATCHLO 18 /* watchpoint */ +#define C0_WATCHHI 19 /* watchpoint */ +#define C0_ECC 26 /* S-cache ECC and primary parity */ +#define C0_CACHE_ERR 27 /* cache error status */ +#define C0_TAGLO 28 /* cache operations */ +#define C0_TAGHI 29 /* cache operations */ +#define C0_ERROR_EPC 30 /* ECC error prg. counter */ + +#endif /* _LANGUAGE_ASSEMBLY */ + +/* + * floating-point status register + */ +#define FPCSR_FS 0x01000000 /* flush denorm to zero */ +#define FPCSR_C 0x00800000 /* condition bit */ +#define FPCSR_CE 0x00020000 /* cause: unimplemented operation */ +#define FPCSR_CV 0x00010000 /* cause: invalid operation */ +#define FPCSR_CZ 0x00008000 /* cause: division by zero */ +#define FPCSR_CO 0x00004000 /* cause: overflow */ +#define FPCSR_CU 0x00002000 /* cause: underflow */ +#define FPCSR_CI 0x00001000 /* cause: inexact operation */ +#define FPCSR_EV 0x00000800 /* enable: invalid operation */ +#define FPCSR_EZ 0x00000400 /* enable: division by zero */ +#define FPCSR_EO 0x00000200 /* enable: overflow */ +#define FPCSR_EU 0x00000100 /* enable: underflow */ +#define FPCSR_EI 0x00000080 /* enable: inexact operation */ +#define FPCSR_FV 0x00000040 /* flag: invalid operation */ +#define FPCSR_FZ 0x00000020 /* flag: division by zero */ +#define FPCSR_FO 0x00000010 /* flag: overflow */ +#define FPCSR_FU 0x00000008 /* flag: underflow */ +#define FPCSR_FI 0x00000004 /* flag: inexact operation */ +#define FPCSR_RM_MASK 0x00000003 /* rounding mode mask */ +#define FPCSR_RM_RN 0x00000000 /* round to nearest */ +#define FPCSR_RM_RZ 0x00000001 /* round to zero */ +#define FPCSR_RM_RP 0x00000002 /* round to positive infinity */ +#define FPCSR_RM_RM 0x00000003 /* round to negative infinity */ + +#endif /* __R4300_H */ diff --git a/lib/ultralib/include/PR/abi.h b/lib/ultralib/include/PR/abi.h new file mode 100644 index 0000000..e121526 --- /dev/null +++ b/lib/ultralib/include/PR/abi.h @@ -0,0 +1,410 @@ +#ifndef _ABI_H_ +#define _ABI_H_ + +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.32 $ + * $Date: 1997/02/11 08:16:37 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/abi.h,v $ + * + **************************************************************************/ + +/* + * Header file for the Audio Binary Interface. + * This is included in the Media Binary Interface file + * mbi.h. + * + * This file follows the framework used for graphics. + * + */ + +/* Audio commands: */ +#define A_SPNOOP 0 +#define A_ADPCM 1 +#define A_CLEARBUFF 2 +#define A_ENVMIXER 3 +#define A_LOADBUFF 4 +#define A_RESAMPLE 5 +#define A_SAVEBUFF 6 +#define A_SEGMENT 7 +#define A_SETBUFF 8 +#define A_SETVOL 9 +#define A_DMEMMOVE 10 +#define A_LOADADPCM 11 +#define A_MIXER 12 +#define A_INTERLEAVE 13 +#define A_POLEF 14 +#define A_SETLOOP 15 + +#define ACMD_SIZE 32 +/* + * Audio flags + */ + +#define A_INIT 0x01 +#define A_CONTINUE 0x00 +#define A_LOOP 0x02 +#define A_OUT 0x02 +#define A_LEFT 0x02 +#define A_RIGHT 0x00 +#define A_VOL 0x04 +#define A_RATE 0x00 +#define A_AUX 0x08 +#define A_NOAUX 0x00 +#define A_MAIN 0x00 +#define A_MIX 0x10 + +/* + * BEGIN C-specific section: (typedef's) + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * Data Structures. + */ + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int gain:16; + unsigned int addr; +} Aadpcm; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int gain:16; + unsigned int addr; +} Apolef; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pad1:16; + unsigned int addr; +} Aenvelope; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int dmem:16; + unsigned int pad2:16; + unsigned int count:16; +} Aclearbuff; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int pad2:16; + unsigned int inL:16; + unsigned int inR:16; +} Ainterleave; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:24; + unsigned int addr; +} Aloadbuff; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pad1:16; + unsigned int addr; +} Aenvmixer; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int gain:16; + unsigned int dmemi:16; + unsigned int dmemo:16; +} Amixer; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int dmem2:16; + unsigned int addr; +} Apan; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pitch:16; + unsigned int addr; +} Aresample; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pad1:16; + unsigned int addr; +} Areverb; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:24; + unsigned int addr; +} Asavebuff; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:24; + unsigned int pad2:2; + unsigned int number:4; + unsigned int base:24; +} Asegment; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int dmemin:16; + unsigned int dmemout:16; + unsigned int count:16; +} Asetbuff; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int vol:16; + unsigned int voltgt:16; + unsigned int volrate:16; +} Asetvol; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int dmemin:16; + unsigned int dmemout:16; + unsigned int count:16; +} Admemmove; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int count:16; + unsigned int addr; +} Aloadadpcm; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int pad2:16; + unsigned int addr; +} Asetloop; + +/* + * Generic Acmd Packet + */ + +typedef struct { + unsigned int w0; + unsigned int w1; +} Awords; + +typedef union { + Awords words; + Aadpcm adpcm; + Apolef polef; + Aclearbuff clearbuff; + Aenvelope envelope; + Ainterleave interleave; + Aloadbuff loadbuff; + Aenvmixer envmixer; + Aresample resample; + Areverb reverb; + Asavebuff savebuff; + Asegment segment; + Asetbuff setbuff; + Asetvol setvol; + Admemmove dmemmove; + Aloadadpcm loadadpcm; + Amixer mixer; + Asetloop setloop; + long long int force_union_align; /* dummy, force alignment */ +} Acmd; + +/* + * ADPCM State + */ +#define ADPCMVSIZE 8 +#define ADPCMFSIZE 16 +typedef short ADPCM_STATE[ADPCMFSIZE]; + +/* + * Pole filter state + */ +typedef short POLEF_STATE[4]; + +/* + * Resampler state + */ +typedef short RESAMPLE_STATE[16]; + +/* + * Resampler constants + */ +#define UNITY_PITCH 0x8000 +#define MAX_RATIO 1.99996 /* within .03 cents of +1 octave */ + +/* + * Enveloper/Mixer state + */ +typedef short ENVMIX_STATE[40]; + +/* + * Macros to assemble the audio command list + */ + +#define aADPCMdec(pkt, f, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ADPCM, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aPoleFilter(pkt, f, g, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_POLEF, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(g, 0, 16)); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aClearBuffer(pkt, d, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_CLEARBUFF, 24, 8) | _SHIFTL(d, 0, 24); \ + _a->words.w1 = (unsigned int)(c); \ +} + +#define aEnvMixer(pkt, f, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aInterleave(pkt, l, r) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \ + _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \ +} + +#define aLoadBuffer(pkt, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aMix(pkt, f, g, i, o) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_MIXER, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(g, 0, 16)); \ + _a->words.w1 = _SHIFTL(i,16, 16) | _SHIFTL(o, 0, 16); \ +} + +#define aPan(pkt, f, d, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_PAN, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(d, 0, 16)); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aResample(pkt, f, p, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_RESAMPLE, 24, 8) | _SHIFTL(f, 16, 8) |\ + _SHIFTL(p, 0, 16)); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aSaveBuffer(pkt, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \ + _a->words.w1 = (unsigned int)(s); \ +} + +#define aSegment(pkt, s, b) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SEGMENT, 24, 8); \ + _a->words.w1 = _SHIFTL(s, 24, 8) | _SHIFTL(b, 0, 24); \ +} + +#define aSetBuffer(pkt, f, i, o, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETBUFF, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(i, 0, 16)); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ +} + +#define aSetVolume(pkt, f, v, t, r) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 16) | \ + _SHIFTL(v, 0, 16)); \ + _a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \ +} + +#define aSetLoop(pkt, a) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + _a->words.w0 = _SHIFTL(A_SETLOOP, 24, 8); \ + _a->words.w1 = (unsigned int)(a); \ +} + +#define aDMEMMove(pkt, i, o, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_DMEMMOVE, 24, 8) | _SHIFTL(i, 0, 24); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ +} + +#define aLoadADPCM(pkt, c, d) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADADPCM, 24, 8) | _SHIFTL(c, 0, 24); \ + _a->words.w1 = (unsigned int) d; \ +} + +#endif /* _LANGUAGE_C */ + +#endif /* !_ABI_H_ */ + + + diff --git a/lib/ultralib/include/PR/gbi.h b/lib/ultralib/include/PR/gbi.h new file mode 100644 index 0000000..e3881e9 --- /dev/null +++ b/lib/ultralib/include/PR/gbi.h @@ -0,0 +1,4585 @@ +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ +/************************************************************************** + * + * $Revision: 1.141 $ + * $Date: 1999/09/03 03:43:08 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gbi.h,v $ + * + **************************************************************************/ + +#ifndef _GBI_H_ +#define _GBI_H_ + +#include + +/* + * To use the F3DEX ucodes, define F3DEX_GBI before include this file. + * + * #define F3DEX_GBI + * #include + * + * or + * + * cc -c -DF3DEX_GBI -I.... foo.c + * + */ + +/************************************************************************** + * + * Graphics Binary Interface + * + **************************************************************************/ + +/* + * Graphics Commands, 'xxx' parts may be generated from ucode + * + * The command format is + * + * |00xxxxxx| = DMA 0,..,127 + * |10xxxxxx| = Immediate Mode -65,..,-128 + * |11xxxxxx| = RDP cmds -1,..,-64 + * + * Note: in order for the RSP microcode to process RDP commands opaquely, + * we need to further identify those RDP commands that need DRAM address + * "fixup". To do this, we have the dummy command G_RDP_ADDR_FIXUP, and + * all |RDP commands| less than this are commands with embedded DRAM + * addresses. Further, the format of these commands should be similar so + * only one fixup routine is needed. + * + * Further explanation: + * The names of the commands are somewhat misleading. Here is clarification: + * + * - a 'DMA' type command has a pointer to additional data and + * causes a DMA transfer to bring that into DMEM. + * + * - an 'Immediate' type command isn't really 'immediate', in the + * traditional sense. This just means that the entire command fits + * in the 64-bit word, and the ucode can execute it 'immediately' + * without additional memory transfers. + * + * - an 'RDP' command is identified as such because the RDP + * commands can be passed-thru the RSP and sent to the RDP + * directly. One further confusing thing, is that some 'DP' + * macros below actually generate immediate commands, not + * not direct DP commands. + * + * IMPLEMENTATION NOTE: + * There is another group of RDP commands that includes the triangle commands + * generated by the RSP code. These are the raw commands the rasterizer + * hardware chews on, with slope info, etc. They will follow the RDP + * ordering... + * + * IMPLEMENTATION NOTE: + * The RDP hardware has some of these bit patterns wired up. If the hardware + * changes, we must adjust this table, likewise we can't change/add things + * once the hardware is frozen. (actually, the RDP hardware only looks at + * the lower 6 bits of the command byte) + * + */ + +/* Private macro to wrap other macros in do {...} while (0) */ +#define _DW(macro) do {macro} while (0) + +#ifdef F3DEX_GBI_2 +# ifndef F3DEX_GBI +# define F3DEX_GBI +# endif +#define G_NOOP 0x00 +#define G_RDPHALF_2 0xf1 +#define G_SETOTHERMODE_H 0xe3 +#define G_SETOTHERMODE_L 0xe2 +#define G_RDPHALF_1 0xe1 +#define G_SPNOOP 0xe0 +#define G_ENDDL 0xdf +#define G_DL 0xde +#define G_LOAD_UCODE 0xdd +#define G_MOVEMEM 0xdc +#define G_MOVEWORD 0xdb +#define G_MTX 0xda +#define G_GEOMETRYMODE 0xd9 +#define G_POPMTX 0xd8 +#define G_TEXTURE 0xd7 +#define G_DMA_IO 0xd6 +#define G_SPECIAL_1 0xd5 +#define G_SPECIAL_2 0xd4 +#define G_SPECIAL_3 0xd3 + +#define G_VTX 0x01 +#define G_MODIFYVTX 0x02 +#define G_CULLDL 0x03 +#define G_BRANCH_Z 0x04 +#define G_TRI1 0x05 +#define G_TRI2 0x06 +#define G_QUAD 0x07 +#define G_LINE3D 0x08 +#else /* F3DEX_GBI_2 */ + +/* DMA commands: */ +#define G_SPNOOP 0 /* handle 0 gracefully */ +#define G_MTX 1 +#define G_RESERVED0 2 /* not implemeted */ +#define G_MOVEMEM 3 /* move a block of memory (up to 4 words) to dmem */ +#define G_VTX 4 +#define G_RESERVED1 5 /* not implemeted */ +#define G_DL 6 +#define G_RESERVED2 7 /* not implemeted */ +#define G_RESERVED3 8 /* not implemeted */ +#define G_SPRITE2D_BASE 9 /* sprite command */ + +/* IMMEDIATE commands: */ +#define G_IMMFIRST -65 +#define G_TRI1 (G_IMMFIRST-0) +#define G_CULLDL (G_IMMFIRST-1) +#define G_POPMTX (G_IMMFIRST-2) +#define G_MOVEWORD (G_IMMFIRST-3) +#define G_TEXTURE (G_IMMFIRST-4) +#define G_SETOTHERMODE_H (G_IMMFIRST-5) +#define G_SETOTHERMODE_L (G_IMMFIRST-6) +#define G_ENDDL (G_IMMFIRST-7) +#define G_SETGEOMETRYMODE (G_IMMFIRST-8) +#define G_CLEARGEOMETRYMODE (G_IMMFIRST-9) +#define G_LINE3D (G_IMMFIRST-10) +#define G_RDPHALF_1 (G_IMMFIRST-11) +#define G_RDPHALF_2 (G_IMMFIRST-12) +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define G_MODIFYVTX (G_IMMFIRST-13) +# define G_TRI2 (G_IMMFIRST-14) +# define G_BRANCH_Z (G_IMMFIRST-15) +# define G_LOAD_UCODE (G_IMMFIRST-16) +#else +# define G_RDPHALF_CONT (G_IMMFIRST-13) +#endif + +/* We are overloading 2 of the immediate commands + to keep the byte alignment of dmem the same */ + +#define G_SPRITE2D_SCALEFLIP (G_IMMFIRST-1) +#define G_SPRITE2D_DRAW (G_IMMFIRST-2) + +/* RDP commands: */ +#define G_NOOP 0xc0 /* 0 */ + +#endif /* F3DEX_GBI_2 */ + +/* RDP commands: */ +#define G_SETCIMG 0xff /* -1 */ +#define G_SETZIMG 0xfe /* -2 */ +#define G_SETTIMG 0xfd /* -3 */ +#define G_SETCOMBINE 0xfc /* -4 */ +#define G_SETENVCOLOR 0xfb /* -5 */ +#define G_SETPRIMCOLOR 0xfa /* -6 */ +#define G_SETBLENDCOLOR 0xf9 /* -7 */ +#define G_SETFOGCOLOR 0xf8 /* -8 */ +#define G_SETFILLCOLOR 0xf7 /* -9 */ +#define G_FILLRECT 0xf6 /* -10 */ +#define G_SETTILE 0xf5 /* -11 */ +#define G_LOADTILE 0xf4 /* -12 */ +#define G_LOADBLOCK 0xf3 /* -13 */ +#define G_SETTILESIZE 0xf2 /* -14 */ +#define G_LOADTLUT 0xf0 /* -16 */ +#define G_RDPSETOTHERMODE 0xef /* -17 */ +#define G_SETPRIMDEPTH 0xee /* -18 */ +#define G_SETSCISSOR 0xed /* -19 */ +#define G_SETCONVERT 0xec /* -20 */ +#define G_SETKEYR 0xeb /* -21 */ +#define G_SETKEYGB 0xea /* -22 */ +#define G_RDPFULLSYNC 0xe9 /* -23 */ +#define G_RDPTILESYNC 0xe8 /* -24 */ +#define G_RDPPIPESYNC 0xe7 /* -25 */ +#define G_RDPLOADSYNC 0xe6 /* -26 */ +#define G_TEXRECTFLIP 0xe5 /* -27 */ +#define G_TEXRECT 0xe4 /* -28 */ + + +/* + * The following commands are the "generated" RDP commands; the user + * never sees them, the RSP microcode generates them. + * + * The layout of the bits is magical, to save work in the ucode. + * These id's are -56, -52, -54, -50, -55, -51, -53, -49, ... + * edge, shade, texture, zbuff bits: estz + */ +#define G_TRI_FILL 0xc8 /* fill triangle: 11001000 */ +#define G_TRI_SHADE 0xcc /* shade triangle: 11001100 */ +#define G_TRI_TXTR 0xca /* texture triangle: 11001010 */ +#define G_TRI_SHADE_TXTR 0xce /* shade, texture triangle: 11001110 */ +#define G_TRI_FILL_ZBUFF 0xc9 /* fill, zbuff triangle: 11001001 */ +#define G_TRI_SHADE_ZBUFF 0xcd /* shade, zbuff triangle: 11001101 */ +#define G_TRI_TXTR_ZBUFF 0xcb /* texture, zbuff triangle: 11001011 */ +#define G_TRI_SHADE_TXTR_ZBUFF 0xcf /* shade, txtr, zbuff trngl: 11001111 */ + +/* + * A TRI_FILL triangle is just the edges. You need to set the DP + * to use primcolor, in order to see anything. (it is NOT a triangle + * that gets rendered in 'fill mode'. Triangles can't be rendered + * in 'fill mode') + * + * A TRI_SHADE is a gouraud triangle that has colors interpolated. + * Flat-shaded triangles (from the software) are still gouraud shaded, + * it's just the colors are all the same and the deltas are 0. + * + * Other triangle types, and combinations are more obvious. + */ + +/* masks to build RDP triangle commands: */ +#define G_RDP_TRI_FILL_MASK 0x08 +#define G_RDP_TRI_SHADE_MASK 0x04 +#define G_RDP_TRI_TXTR_MASK 0x02 +#define G_RDP_TRI_ZBUFF_MASK 0x01 + +/* + * HACK: + * This is a dreadful hack. For version 1.0 hardware, there are still + * some 'bowtie' hangs. This parameter can be increased to avoid + * the hangs. Every increase of 4 chops one scanline off of every + * triangle. Values of 4,8,12 should be sufficient to avoid any + * bowtie hang. + * + * Change this value, then recompile ALL of your program (including static + * display lists!) + * + * THIS WILL BE REMOVED FOR HARDWARE VERSION 2.0! + */ +#define BOWTIE_VAL 0 + + +/* gets added to RDP command, in order to test for addres fixup: */ +#define G_RDP_ADDR_FIXUP 3 /* |RDP cmds| <= this, do addr fixup */ +#ifdef _LANGUAGE_ASSEMBLY +#define G_RDP_TEXRECT_CHECK ((-1*G_TEXRECTFLIP)& 0xff) +#endif + +/* macros for command parsing: */ +#define GDMACMD(x) (x) +#define GIMMCMD(x) (G_IMMFIRST-(x)) +#define GRDPCMD(x) (0xff-(x)) + +#define G_DMACMDSIZ 128 +#define G_IMMCMDSIZ 64 +#define G_RDPCMDSIZ 64 + +/* + * Coordinate shift values, number of bits of fraction + */ +#define G_TEXTURE_IMAGE_FRAC 2 +#define G_TEXTURE_SCALE_FRAC 16 +#define G_SCALE_FRAC 8 +#define G_ROTATE_FRAC 16 + +/* + * Parameters to graphics commands + */ + +/* + * Data packing macros + */ + +/* + * Maximum z-buffer value, used to initialize the z-buffer. + * Note : this number is NOT the viewport z-scale constant. + * See the comment next to G_MAXZ for more info. + */ +#define G_MAXFBZ 0x3fff /* 3b exp, 11b mantissa */ + +#define GPACK_RGBA5551(r, g, b, a) ((((r)<<8) & 0xf800) | \ + (((g)<<3) & 0x7c0) | \ + (((b)>>2) & 0x3e) | ((a) & 0x1)) +#define GPACK_ZDZ(z, dz) ((z) << 2 | (dz)) + +/* + * G_MTX: parameter flags + */ +#ifdef F3DEX_GBI_2 +# define G_MTX_MODELVIEW 0x00 /* matrix types */ +# define G_MTX_PROJECTION 0x04 +# define G_MTX_MUL 0x00 /* concat or load */ +# define G_MTX_LOAD 0x02 +# define G_MTX_NOPUSH 0x00 /* push or not */ +# define G_MTX_PUSH 0x01 +#else /* F3DEX_GBI_2 */ +# define G_MTX_MODELVIEW 0x00 /* matrix types */ +# define G_MTX_PROJECTION 0x01 +# define G_MTX_MUL 0x00 /* concat or load */ +# define G_MTX_LOAD 0x02 +# define G_MTX_NOPUSH 0x00 /* push or not */ +# define G_MTX_PUSH 0x04 +#endif /* F3DEX_GBI_2 */ + +/* + * flags for G_SETGEOMETRYMODE + * (this rendering state is maintained in RSP) + * + * DO NOT USE THE LOW 8 BITS OF GEOMETRYMODE: + * The weird bit-ordering is for the micro-code: the lower byte + * can be OR'd in with G_TRI_SHADE (11001100) to construct + * the triangle command directly. Don't break it... + * + * DO NOT USE THE HIGH 8 BITS OF GEOMETRYMODE: + * The high byte is OR'd with 0x703 to form the clip code mask. + * If it is set to 0x04, this will cause near clipping to occur. + * If it is zero, near clipping will not occur. + * + * Further explanation: + * G_SHADE is necessary in order to see the color that you passed + * down with the vertex. If G_SHADE isn't set, you need to set the DP + * appropriately and use primcolor to see anything. + * + * G_SHADING_SMOOTH enabled means use all 3 colors of the triangle. + * If it is not set, then do 'flat shading', where only one vertex color + * is used (and all 3 vertices are set to that same color by the ucode) + * See the man page for gSP1Triangle(). + * + */ +#define G_ZBUFFER 0x00000001 +#define G_SHADE 0x00000004 /* enable Gouraud interp */ +/* rest of low byte reserved for setup ucode */ +#ifdef F3DEX_GBI_2 +# define G_TEXTURE_ENABLE 0x00000000 /* Ignored */ +# define G_SHADING_SMOOTH 0x00200000 /* flat or smooth shaded */ +# define G_CULL_FRONT 0x00000200 +# define G_CULL_BACK 0x00000400 +# define G_CULL_BOTH 0x00000600 /* To make code cleaner */ +#else +# define G_TEXTURE_ENABLE 0x00000002 /* Microcode use only */ +# define G_SHADING_SMOOTH 0x00000200 /* flat or smooth shaded */ +# define G_CULL_FRONT 0x00001000 +# define G_CULL_BACK 0x00002000 +# define G_CULL_BOTH 0x00003000 /* To make code cleaner */ +#endif +#define G_FOG 0x00010000 +#define G_LIGHTING 0x00020000 +#define G_TEXTURE_GEN 0x00040000 +#define G_TEXTURE_GEN_LINEAR 0x00080000 +#define G_LOD 0x00100000 /* NOT IMPLEMENTED */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define G_CLIPPING 0x00800000 +#else +# define G_CLIPPING 0x00000000 +#endif + +#ifdef _LANGUAGE_ASSEMBLY +#define G_FOG_H (G_FOG/0x10000) +#define G_LIGHTING_H (G_LIGHTING/0x10000) +#define G_TEXTURE_GEN_H (G_TEXTURE_GEN/0x10000) +#define G_TEXTURE_GEN_LINEAR_H (G_TEXTURE_GEN_LINEAR/0x10000) +#define G_LOD_H (G_LOD/0x10000) /* NOT IMPLEMENTED */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define G_CLIPPING_H (G_CLIPPING/0x10000) +#endif +#endif + +/* Need these defined for Sprite Microcode */ +#ifdef _LANGUAGE_ASSEMBLY +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +#define G_TX_NOMIRROR 0 +#define G_TX_WRAP 0 +#define G_TX_MIRROR 0x1 +#define G_TX_CLAMP 0x2 +#define G_TX_NOMASK 0 +#define G_TX_NOLOD 0 +#endif + +/* + * G_SETIMG fmt: set image formats + */ +#define G_IM_FMT_RGBA 0 +#define G_IM_FMT_YUV 1 +#define G_IM_FMT_CI 2 +#define G_IM_FMT_IA 3 +#define G_IM_FMT_I 4 + +/* + * G_SETIMG siz: set image pixel size + */ +#define G_IM_SIZ_4b 0 +#define G_IM_SIZ_8b 1 +#define G_IM_SIZ_16b 2 +#define G_IM_SIZ_32b 3 +#define G_IM_SIZ_DD 5 + +#define G_IM_SIZ_4b_BYTES 0 +#define G_IM_SIZ_4b_TILE_BYTES G_IM_SIZ_4b_BYTES +#define G_IM_SIZ_4b_LINE_BYTES G_IM_SIZ_4b_BYTES + +#define G_IM_SIZ_8b_BYTES 1 +#define G_IM_SIZ_8b_TILE_BYTES G_IM_SIZ_8b_BYTES +#define G_IM_SIZ_8b_LINE_BYTES G_IM_SIZ_8b_BYTES + +#define G_IM_SIZ_16b_BYTES 2 +#define G_IM_SIZ_16b_TILE_BYTES G_IM_SIZ_16b_BYTES +#define G_IM_SIZ_16b_LINE_BYTES G_IM_SIZ_16b_BYTES + +#define G_IM_SIZ_32b_BYTES 4 +#define G_IM_SIZ_32b_TILE_BYTES 2 +#define G_IM_SIZ_32b_LINE_BYTES 2 + +#define G_IM_SIZ_4b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_8b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_16b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_32b_LOAD_BLOCK G_IM_SIZ_32b + +#define G_IM_SIZ_4b_SHIFT 2 +#define G_IM_SIZ_8b_SHIFT 1 +#define G_IM_SIZ_16b_SHIFT 0 +#define G_IM_SIZ_32b_SHIFT 0 + +#define G_IM_SIZ_4b_INCR 3 +#define G_IM_SIZ_8b_INCR 1 +#define G_IM_SIZ_16b_INCR 0 +#define G_IM_SIZ_32b_INCR 0 + +/* + * G_SETCOMBINE: color combine modes + */ +/* Color combiner constants: */ +#define G_CCMUX_COMBINED 0 +#define G_CCMUX_TEXEL0 1 +#define G_CCMUX_TEXEL1 2 +#define G_CCMUX_PRIMITIVE 3 +#define G_CCMUX_SHADE 4 +#define G_CCMUX_ENVIRONMENT 5 +#define G_CCMUX_CENTER 6 +#define G_CCMUX_SCALE 6 +#define G_CCMUX_COMBINED_ALPHA 7 +#define G_CCMUX_TEXEL0_ALPHA 8 +#define G_CCMUX_TEXEL1_ALPHA 9 +#define G_CCMUX_PRIMITIVE_ALPHA 10 +#define G_CCMUX_SHADE_ALPHA 11 +#define G_CCMUX_ENV_ALPHA 12 +#define G_CCMUX_LOD_FRACTION 13 +#define G_CCMUX_PRIM_LOD_FRAC 14 +#define G_CCMUX_NOISE 7 +#define G_CCMUX_K4 7 +#define G_CCMUX_K5 15 +#define G_CCMUX_1 6 +#define G_CCMUX_0 31 + +/* Alpha combiner constants: */ +#define G_ACMUX_COMBINED 0 +#define G_ACMUX_TEXEL0 1 +#define G_ACMUX_TEXEL1 2 +#define G_ACMUX_PRIMITIVE 3 +#define G_ACMUX_SHADE 4 +#define G_ACMUX_ENVIRONMENT 5 +#define G_ACMUX_LOD_FRACTION 0 +#define G_ACMUX_PRIM_LOD_FRAC 6 +#define G_ACMUX_1 6 +#define G_ACMUX_0 7 + +/* typical CC cycle 1 modes */ +#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE +#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE +#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE +#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0 +#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0 +#define G_CC_MODULATERGB G_CC_MODULATEI +#define G_CC_MODULATERGBA G_CC_MODULATEIA +#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA +#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0 +#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0 +#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM +#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM +#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM +#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE +#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0 +#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_ADDRGB 1, 0, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_ADDRGBDECALA 1, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE +#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0 + +/* oddball modes */ +#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0 +#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0 +#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +/* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */ +#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0 + +/* typical CC cycle 1 modes, usually followed by other cycle 2 modes */ +#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0 + +/* + * One-cycle color convert operation + */ +#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE + +/* + * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock. + * Therefore, CC looks for step1 results in TEXEL1 + */ +#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0 + +/* typical CC cycle 2 modes */ +#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED +#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE +#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0 +#define G_CC_MODULATERGB2 G_CC_MODULATEI2 +#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2 +#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0 +#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2 +#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2 +#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE +/* + * ? +#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE +*/ +#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0 +#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0 +#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE +#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED +#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0 +#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED + +/* + * G_SETOTHERMODE_L sft: shift count + */ +#define G_MDSFT_ALPHACOMPARE 0 +#define G_MDSFT_ZSRCSEL 2 +#define G_MDSFT_RENDERMODE 3 +#define G_MDSFT_BLENDER 16 + +/* + * G_SETOTHERMODE_H sft: shift count + */ +#define G_MDSFT_BLENDMASK 0 /* unsupported */ +#define G_MDSFT_ALPHADITHER 4 +#define G_MDSFT_RGBDITHER 6 + +#define G_MDSFT_COMBKEY 8 +#define G_MDSFT_TEXTCONV 9 +#define G_MDSFT_TEXTFILT 12 +#define G_MDSFT_TEXTLUT 14 +#define G_MDSFT_TEXTLOD 16 +#define G_MDSFT_TEXTDETAIL 17 +#define G_MDSFT_TEXTPERSP 19 +#define G_MDSFT_CYCLETYPE 20 +#define G_MDSFT_COLORDITHER 22 /* unsupported in HW 2.0 */ +#define G_MDSFT_PIPELINE 23 + +/* G_SETOTHERMODE_H gPipelineMode */ +#define G_PM_1PRIMITIVE (1 << G_MDSFT_PIPELINE) +#define G_PM_NPRIMITIVE (0 << G_MDSFT_PIPELINE) + +/* G_SETOTHERMODE_H gSetCycleType */ +#define G_CYC_1CYCLE (0 << G_MDSFT_CYCLETYPE) +#define G_CYC_2CYCLE (1 << G_MDSFT_CYCLETYPE) +#define G_CYC_COPY (2 << G_MDSFT_CYCLETYPE) +#define G_CYC_FILL (3 << G_MDSFT_CYCLETYPE) + +/* G_SETOTHERMODE_H gSetTexturePersp */ +#define G_TP_NONE (0 << G_MDSFT_TEXTPERSP) +#define G_TP_PERSP (1 << G_MDSFT_TEXTPERSP) + +/* G_SETOTHERMODE_H gSetTextureDetail */ +#define G_TD_CLAMP (0 << G_MDSFT_TEXTDETAIL) +#define G_TD_SHARPEN (1 << G_MDSFT_TEXTDETAIL) +#define G_TD_DETAIL (2 << G_MDSFT_TEXTDETAIL) + +/* G_SETOTHERMODE_H gSetTextureLOD */ +#define G_TL_TILE (0 << G_MDSFT_TEXTLOD) +#define G_TL_LOD (1 << G_MDSFT_TEXTLOD) + +/* G_SETOTHERMODE_H gSetTextureLUT */ +#define G_TT_NONE (0 << G_MDSFT_TEXTLUT) +#define G_TT_RGBA16 (2 << G_MDSFT_TEXTLUT) +#define G_TT_IA16 (3 << G_MDSFT_TEXTLUT) + +/* G_SETOTHERMODE_H gSetTextureFilter */ +#define G_TF_POINT (0 << G_MDSFT_TEXTFILT) +#define G_TF_AVERAGE (3 << G_MDSFT_TEXTFILT) +#define G_TF_BILERP (2 << G_MDSFT_TEXTFILT) + +/* G_SETOTHERMODE_H gSetTextureConvert */ +#define G_TC_CONV (0 << G_MDSFT_TEXTCONV) +#define G_TC_FILTCONV (5 << G_MDSFT_TEXTCONV) +#define G_TC_FILT (6 << G_MDSFT_TEXTCONV) + +/* G_SETOTHERMODE_H gSetCombineKey */ +#define G_CK_NONE (0 << G_MDSFT_COMBKEY) +#define G_CK_KEY (1 << G_MDSFT_COMBKEY) + +/* G_SETOTHERMODE_H gSetColorDither */ +#define G_CD_MAGICSQ (0 << G_MDSFT_RGBDITHER) +#define G_CD_BAYER (1 << G_MDSFT_RGBDITHER) +#define G_CD_NOISE (2 << G_MDSFT_RGBDITHER) + +#ifndef _HW_VERSION_1 +#define G_CD_DISABLE (3 << G_MDSFT_RGBDITHER) +#define G_CD_ENABLE G_CD_NOISE /* HW 1.0 compatibility mode */ +#else +#define G_CD_ENABLE (1 << G_MDSFT_COLORDITHER) +#define G_CD_DISABLE (0 << G_MDSFT_COLORDITHER) +#endif + +/* G_SETOTHERMODE_H gSetAlphaDither */ +#define G_AD_PATTERN (0 << G_MDSFT_ALPHADITHER) +#define G_AD_NOTPATTERN (1 << G_MDSFT_ALPHADITHER) +#define G_AD_NOISE (2 << G_MDSFT_ALPHADITHER) +#define G_AD_DISABLE (3 << G_MDSFT_ALPHADITHER) + +/* G_SETOTHERMODE_L gSetAlphaCompare */ +#define G_AC_NONE (0 << G_MDSFT_ALPHACOMPARE) +#define G_AC_THRESHOLD (1 << G_MDSFT_ALPHACOMPARE) +#define G_AC_DITHER (3 << G_MDSFT_ALPHACOMPARE) + +/* G_SETOTHERMODE_L gSetDepthSource */ +#define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL) +#define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL) + +/* G_SETOTHERMODE_L gSetRenderMode */ +#define AA_EN 0x8 +#define Z_CMP 0x10 +#define Z_UPD 0x20 +#define IM_RD 0x40 +#define CLR_ON_CVG 0x80 +#define CVG_DST_CLAMP 0 +#define CVG_DST_WRAP 0x100 +#define CVG_DST_FULL 0x200 +#define CVG_DST_SAVE 0x300 +#define ZMODE_OPA 0 +#define ZMODE_INTER 0x400 +#define ZMODE_XLU 0x800 +#define ZMODE_DEC 0xc00 +#define CVG_X_ALPHA 0x1000 +#define ALPHA_CVG_SEL 0x2000 +#define FORCE_BL 0x4000 +#define TEX_EDGE 0x0000 /* used to be 0x8000 */ + +#define G_BL_CLR_IN 0 +#define G_BL_CLR_MEM 1 +#define G_BL_CLR_BL 2 +#define G_BL_CLR_FOG 3 +#define G_BL_1MA 0 +#define G_BL_A_MEM 1 +#define G_BL_A_IN 0 +#define G_BL_A_FOG 1 +#define G_BL_A_SHADE 2 +#define G_BL_1 2 +#define G_BL_0 3 + +#define GBL_c1(m1a, m1b, m2a, m2b) \ + (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 +#define GBL_c2(m1a, m1b, m2a, m2b) \ + (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 + +#define RM_AA_ZB_OPA_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_SURF(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_DECAL(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | \ + ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_DECAL(clk) \ + AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \ + ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_DECAL(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ALPHA_CVG_SEL | ZMODE_INTER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ + ALPHA_CVG_SEL | ZMODE_INTER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_INTER(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + FORCE_BL | ZMODE_INTER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_XLU_LINE(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_DEC_LINE(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_TEX_EDGE(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_TEX_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_SUB_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_PCL_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_TEX_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_SUB_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + + +#define RM_AA_OPA_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_OPA_SURF(clk) \ + AA_EN | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_XLU_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \ + ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_XLU_LINE(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_DEC_LINE(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_TEX_EDGE(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_SUB_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_PCL_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_OPA_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_TEX_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_SUB_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + + +#define RM_ZB_OPA_SURF(clk) \ + Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | \ + ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_ZB_XLU_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OPA_DECAL(clk) \ + Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_ZB_XLU_DECAL(clk) \ + Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_CLD_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OVL_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_PCL_SURF(clk) \ + Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \ + G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + + +#define RM_OPA_SURF(clk) \ + CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_XLU_SURF(clk) \ + IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_TEX_EDGE(clk) \ + CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL |\ + ZMODE_OPA | TEX_EDGE | AA_EN | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_CLD_SURF(clk) \ + IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_PCL_SURF(clk) \ + CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \ + G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_ADD(clk) \ + IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) + +#define RM_NOOP(clk) \ + GBL_c##clk(0, 0, 0, 0) + +#define RM_VISCVG(clk) \ + IM_RD | FORCE_BL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) + +/* for rendering to an 8-bit framebuffer */ +#define RM_OPA_CI(clk) \ + CVG_DST_CLAMP | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + + + +#define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1) +#define G_RM_AA_ZB_OPA_SURF2 RM_AA_ZB_OPA_SURF(2) +#define G_RM_AA_ZB_XLU_SURF RM_AA_ZB_XLU_SURF(1) +#define G_RM_AA_ZB_XLU_SURF2 RM_AA_ZB_XLU_SURF(2) +#define G_RM_AA_ZB_OPA_DECAL RM_AA_ZB_OPA_DECAL(1) +#define G_RM_AA_ZB_OPA_DECAL2 RM_AA_ZB_OPA_DECAL(2) +#define G_RM_AA_ZB_XLU_DECAL RM_AA_ZB_XLU_DECAL(1) +#define G_RM_AA_ZB_XLU_DECAL2 RM_AA_ZB_XLU_DECAL(2) +#define G_RM_AA_ZB_OPA_INTER RM_AA_ZB_OPA_INTER(1) +#define G_RM_AA_ZB_OPA_INTER2 RM_AA_ZB_OPA_INTER(2) +#define G_RM_AA_ZB_XLU_INTER RM_AA_ZB_XLU_INTER(1) +#define G_RM_AA_ZB_XLU_INTER2 RM_AA_ZB_XLU_INTER(2) +#define G_RM_AA_ZB_XLU_LINE RM_AA_ZB_XLU_LINE(1) +#define G_RM_AA_ZB_XLU_LINE2 RM_AA_ZB_XLU_LINE(2) +#define G_RM_AA_ZB_DEC_LINE RM_AA_ZB_DEC_LINE(1) +#define G_RM_AA_ZB_DEC_LINE2 RM_AA_ZB_DEC_LINE(2) +#define G_RM_AA_ZB_TEX_EDGE RM_AA_ZB_TEX_EDGE(1) +#define G_RM_AA_ZB_TEX_EDGE2 RM_AA_ZB_TEX_EDGE(2) +#define G_RM_AA_ZB_TEX_INTER RM_AA_ZB_TEX_INTER(1) +#define G_RM_AA_ZB_TEX_INTER2 RM_AA_ZB_TEX_INTER(2) +#define G_RM_AA_ZB_SUB_SURF RM_AA_ZB_SUB_SURF(1) +#define G_RM_AA_ZB_SUB_SURF2 RM_AA_ZB_SUB_SURF(2) +#define G_RM_AA_ZB_PCL_SURF RM_AA_ZB_PCL_SURF(1) +#define G_RM_AA_ZB_PCL_SURF2 RM_AA_ZB_PCL_SURF(2) +#define G_RM_AA_ZB_OPA_TERR RM_AA_ZB_OPA_TERR(1) +#define G_RM_AA_ZB_OPA_TERR2 RM_AA_ZB_OPA_TERR(2) +#define G_RM_AA_ZB_TEX_TERR RM_AA_ZB_TEX_TERR(1) +#define G_RM_AA_ZB_TEX_TERR2 RM_AA_ZB_TEX_TERR(2) +#define G_RM_AA_ZB_SUB_TERR RM_AA_ZB_SUB_TERR(1) +#define G_RM_AA_ZB_SUB_TERR2 RM_AA_ZB_SUB_TERR(2) + +#define G_RM_RA_ZB_OPA_SURF RM_RA_ZB_OPA_SURF(1) +#define G_RM_RA_ZB_OPA_SURF2 RM_RA_ZB_OPA_SURF(2) +#define G_RM_RA_ZB_OPA_DECAL RM_RA_ZB_OPA_DECAL(1) +#define G_RM_RA_ZB_OPA_DECAL2 RM_RA_ZB_OPA_DECAL(2) +#define G_RM_RA_ZB_OPA_INTER RM_RA_ZB_OPA_INTER(1) +#define G_RM_RA_ZB_OPA_INTER2 RM_RA_ZB_OPA_INTER(2) + +#define G_RM_AA_OPA_SURF RM_AA_OPA_SURF(1) +#define G_RM_AA_OPA_SURF2 RM_AA_OPA_SURF(2) +#define G_RM_AA_XLU_SURF RM_AA_XLU_SURF(1) +#define G_RM_AA_XLU_SURF2 RM_AA_XLU_SURF(2) +#define G_RM_AA_XLU_LINE RM_AA_XLU_LINE(1) +#define G_RM_AA_XLU_LINE2 RM_AA_XLU_LINE(2) +#define G_RM_AA_DEC_LINE RM_AA_DEC_LINE(1) +#define G_RM_AA_DEC_LINE2 RM_AA_DEC_LINE(2) +#define G_RM_AA_TEX_EDGE RM_AA_TEX_EDGE(1) +#define G_RM_AA_TEX_EDGE2 RM_AA_TEX_EDGE(2) +#define G_RM_AA_SUB_SURF RM_AA_SUB_SURF(1) +#define G_RM_AA_SUB_SURF2 RM_AA_SUB_SURF(2) +#define G_RM_AA_PCL_SURF RM_AA_PCL_SURF(1) +#define G_RM_AA_PCL_SURF2 RM_AA_PCL_SURF(2) +#define G_RM_AA_OPA_TERR RM_AA_OPA_TERR(1) +#define G_RM_AA_OPA_TERR2 RM_AA_OPA_TERR(2) +#define G_RM_AA_TEX_TERR RM_AA_TEX_TERR(1) +#define G_RM_AA_TEX_TERR2 RM_AA_TEX_TERR(2) +#define G_RM_AA_SUB_TERR RM_AA_SUB_TERR(1) +#define G_RM_AA_SUB_TERR2 RM_AA_SUB_TERR(2) + +#define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1) +#define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2) + +#define G_RM_ZB_OPA_SURF RM_ZB_OPA_SURF(1) +#define G_RM_ZB_OPA_SURF2 RM_ZB_OPA_SURF(2) +#define G_RM_ZB_XLU_SURF RM_ZB_XLU_SURF(1) +#define G_RM_ZB_XLU_SURF2 RM_ZB_XLU_SURF(2) +#define G_RM_ZB_OPA_DECAL RM_ZB_OPA_DECAL(1) +#define G_RM_ZB_OPA_DECAL2 RM_ZB_OPA_DECAL(2) +#define G_RM_ZB_XLU_DECAL RM_ZB_XLU_DECAL(1) +#define G_RM_ZB_XLU_DECAL2 RM_ZB_XLU_DECAL(2) +#define G_RM_ZB_CLD_SURF RM_ZB_CLD_SURF(1) +#define G_RM_ZB_CLD_SURF2 RM_ZB_CLD_SURF(2) +#define G_RM_ZB_OVL_SURF RM_ZB_OVL_SURF(1) +#define G_RM_ZB_OVL_SURF2 RM_ZB_OVL_SURF(2) +#define G_RM_ZB_PCL_SURF RM_ZB_PCL_SURF(1) +#define G_RM_ZB_PCL_SURF2 RM_ZB_PCL_SURF(2) + +#define G_RM_OPA_SURF RM_OPA_SURF(1) +#define G_RM_OPA_SURF2 RM_OPA_SURF(2) +#define G_RM_XLU_SURF RM_XLU_SURF(1) +#define G_RM_XLU_SURF2 RM_XLU_SURF(2) +#define G_RM_CLD_SURF RM_CLD_SURF(1) +#define G_RM_CLD_SURF2 RM_CLD_SURF(2) +#define G_RM_TEX_EDGE RM_TEX_EDGE(1) +#define G_RM_TEX_EDGE2 RM_TEX_EDGE(2) +#define G_RM_PCL_SURF RM_PCL_SURF(1) +#define G_RM_PCL_SURF2 RM_PCL_SURF(2) +#define G_RM_ADD RM_ADD(1) +#define G_RM_ADD2 RM_ADD(2) +#define G_RM_NOOP RM_NOOP(1) +#define G_RM_NOOP2 RM_NOOP(2) +#define G_RM_VISCVG RM_VISCVG(1) +#define G_RM_VISCVG2 RM_VISCVG(2) +#define G_RM_OPA_CI RM_OPA_CI(1) +#define G_RM_OPA_CI2 RM_OPA_CI(2) + + +#define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA) +#define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA) +#define G_RM_PASS GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +/* + * G_SETCONVERT: K0-5 + */ +#define G_CV_K0 175 +#define G_CV_K1 -43 +#define G_CV_K2 -89 +#define G_CV_K3 222 +#define G_CV_K4 114 +#define G_CV_K5 42 + +/* + * G_SETSCISSOR: interlace mode + */ +#define G_SC_NON_INTERLACE 0 +#define G_SC_ODD_INTERLACE 3 +#define G_SC_EVEN_INTERLACE 2 + +/* flags to inhibit pushing of the display list (on branch) */ +#define G_DL_PUSH 0x00 +#define G_DL_NOPUSH 0x01 + +/* + * BEGIN C-specific section: (typedef's) + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * Data Structures + * + * NOTE: + * The DMA transfer hardware requires 64-bit aligned, 64-bit multiple- + * sized transfers. This important hardware optimization is unfortunately + * reflected in the programming interface, with some structures + * padded and alignment enforced. + * + * Since structures are aligned to the boundary of the "worst-case" + * element, we can't depend on the C compiler to align things + * properly. + * + * 64-bit structure alignment is enforced by wrapping structures with + * unions that contain a dummy "long long int". Why this works is + * explained in the ANSI C Spec, or on page 186 of the second edition + * of K&R, "The C Programming Language". + * + * The price we pay for this is a little awkwardness referencing the + * structures through the union. There is no memory penalty, since + * all the structures are at least 64-bits the dummy alignment field + * does not increase the size of the union. + * + * Static initialization of these union structures works because + * the ANSI C spec states that static initialization for unions + * works by using the first union element. We put the dummy alignment + * field last for this reason. + * + * (it's possible a newer 64-bit compiler from MIPS might make this + * easier with a flag, but we can't wait for it...) + * + */ + +/* + * Vertex (set up for use with colors) + */ +typedef struct { + short ob[3]; /* x, y, z */ + unsigned short flag; + short tc[2]; /* texture coord */ + unsigned char cn[4]; /* color & alpha */ +} Vtx_t; + +/* + * Vertex (set up for use with normals) + */ +typedef struct { + short ob[3]; /* x, y, z */ + unsigned short flag; + short tc[2]; /* texture coord */ + signed char n[3]; /* normal */ + unsigned char a; /* alpha */ +} Vtx_tn; + +typedef union { + Vtx_t v; /* Use this one for colors */ + Vtx_tn n; /* Use this one for normals */ + long long int force_structure_alignment; +} Vtx; + +/* + * Sprite structure + */ + +typedef struct { + void *SourceImagePointer; + void *TlutPointer; + short Stride; + short SubImageWidth; + short SubImageHeight; + char SourceImageType; + char SourceImageBitSize; + short SourceImageOffsetS; + short SourceImageOffsetT; + /* 20 bytes for above */ + + /* padding to bring structure size to 64 bit allignment */ + char dummy[4]; + +} uSprite_t; + +typedef union { + uSprite_t s; + + /* Need to make sure this is 64 bit aligned */ + long long int force_structure_allignment[3]; +} uSprite; + +/* + * Triangle face + */ +typedef struct { + unsigned char flag; + unsigned char v[3]; +} Tri; + +/* + * 4x4 matrix, fixed point s15.16 format. + * First 8 words are integer portion of the 4x4 matrix + * Last 8 words are the fraction portion of the 4x4 matrix + */ +typedef long Mtx_t[4][4]; + +typedef union { + Mtx_t m; + long long int force_structure_alignment; +} Mtx; + +/* + * Viewport + */ + +/* + * + * This magic value is the maximum INTEGER z-range of the hardware + * (there are also 16-bits of fraction, which are introduced during + * any transformations). This is not just a good idea, it's the law. + * Feeding the hardware eventual z-coordinates (after any transforms + * or scaling) bigger than this, will not work. + * + * This number is DIFFERENT than G_MAXFBZ, which is the maximum value + * you want to use to initialize the z-buffer. + * + * The reason these are different is mildly interesting, but too long + * to explain here. It is basically the result of optimizations in the + * hardware. A more generic API might hide this detail from the users, + * but we don't have the ucode to do that... + * + */ +#define G_MAXZ 0x03ff /* 10 bits of integer screen-Z precision */ + +/* + * The viewport structure elements have 2 bits of fraction, necessary + * to accomodate the sub-pixel positioning scaling for the hardware. + * This can also be exploited to handle odd-sized viewports. + * + * Accounting for these fractional bits, using the default projection + * and viewing matrices, the viewport structure is initialized thusly: + * + * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, G_MAXZ, 0, + * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, 0, 0, + */ +typedef struct { + short vscale[4]; /* scale, 2 bits fraction */ + short vtrans[4]; /* translate, 2 bits fraction */ + /* both the above arrays are padded to 64-bit boundary */ +} Vp_t; + +typedef union { + Vp_t vp; + long long int force_structure_alignment; +} Vp; + +/* + * MOVEMEM indices + * + * Each of these indexes an entry in a dmem table + * which points to a 1-4 word block of dmem in + * which to store a 1-4 word DMA. + * + */ +#ifdef F3DEX_GBI_2 +/* 0,4 are reserved by G_MTX */ +# define G_MV_MMTX 2 +# define G_MV_PMTX 6 +# define G_MV_VIEWPORT 8 +# define G_MV_LIGHT 10 +# define G_MV_POINT 12 +# define G_MV_MATRIX 14 /* NOTE: this is in moveword table */ +# define G_MVO_LOOKATX (0*24) +# define G_MVO_LOOKATY (1*24) +# define G_MVO_L0 (2*24) +# define G_MVO_L1 (3*24) +# define G_MVO_L2 (4*24) +# define G_MVO_L3 (5*24) +# define G_MVO_L4 (6*24) +# define G_MVO_L5 (7*24) +# define G_MVO_L6 (8*24) +# define G_MVO_L7 (9*24) +#else /* F3DEX_GBI_2 */ +# define G_MV_VIEWPORT 0x80 +# define G_MV_LOOKATY 0x82 +# define G_MV_LOOKATX 0x84 +# define G_MV_L0 0x86 +# define G_MV_L1 0x88 +# define G_MV_L2 0x8a +# define G_MV_L3 0x8c +# define G_MV_L4 0x8e +# define G_MV_L5 0x90 +# define G_MV_L6 0x92 +# define G_MV_L7 0x94 +# define G_MV_TXTATT 0x96 +# define G_MV_MATRIX_1 0x9e /* NOTE: this is in moveword table */ +# define G_MV_MATRIX_2 0x98 +# define G_MV_MATRIX_3 0x9a +# define G_MV_MATRIX_4 0x9c +#endif /* F3DEX_GBI_2 */ + +/* + * MOVEWORD indices + * + * Each of these indexes an entry in a dmem table + * which points to a word in dmem in dmem where + * an immediate word will be stored. + * + */ +#define G_MW_MATRIX 0x00 /* NOTE: also used by movemem */ +#define G_MW_NUMLIGHT 0x02 +#define G_MW_CLIP 0x04 +#define G_MW_SEGMENT 0x06 +#define G_MW_FOG 0x08 +#define G_MW_LIGHTCOL 0x0a +#ifdef F3DEX_GBI_2 +# define G_MW_FORCEMTX 0x0c +#else /* F3DEX_GBI_2 */ +# define G_MW_POINTS 0x0c +#endif /* F3DEX_GBI_2 */ +#define G_MW_PERSPNORM 0x0e + +/* + * These are offsets from the address in the dmem table + */ +#define G_MWO_NUMLIGHT 0x00 +#define G_MWO_CLIP_RNX 0x04 +#define G_MWO_CLIP_RNY 0x0c +#define G_MWO_CLIP_RPX 0x14 +#define G_MWO_CLIP_RPY 0x1c +#define G_MWO_SEGMENT_0 0x00 +#define G_MWO_SEGMENT_1 0x01 +#define G_MWO_SEGMENT_2 0x02 +#define G_MWO_SEGMENT_3 0x03 +#define G_MWO_SEGMENT_4 0x04 +#define G_MWO_SEGMENT_5 0x05 +#define G_MWO_SEGMENT_6 0x06 +#define G_MWO_SEGMENT_7 0x07 +#define G_MWO_SEGMENT_8 0x08 +#define G_MWO_SEGMENT_9 0x09 +#define G_MWO_SEGMENT_A 0x0a +#define G_MWO_SEGMENT_B 0x0b +#define G_MWO_SEGMENT_C 0x0c +#define G_MWO_SEGMENT_D 0x0d +#define G_MWO_SEGMENT_E 0x0e +#define G_MWO_SEGMENT_F 0x0f +#define G_MWO_FOG 0x00 +#define G_MWO_aLIGHT_1 0x00 +#define G_MWO_bLIGHT_1 0x04 +#ifdef F3DEX_GBI_2 +#define G_MWO_aLIGHT_2 0x18 +#define G_MWO_bLIGHT_2 0x1c +#define G_MWO_aLIGHT_3 0x30 +#define G_MWO_bLIGHT_3 0x34 +#define G_MWO_aLIGHT_4 0x48 +#define G_MWO_bLIGHT_4 0x4c +#define G_MWO_aLIGHT_5 0x60 +#define G_MWO_bLIGHT_5 0x64 +#define G_MWO_aLIGHT_6 0x78 +#define G_MWO_bLIGHT_6 0x7c +#define G_MWO_aLIGHT_7 0x90 +#define G_MWO_bLIGHT_7 0x94 +#define G_MWO_aLIGHT_8 0xa8 +#define G_MWO_bLIGHT_8 0xac +#else +#define G_MWO_aLIGHT_2 0x20 +#define G_MWO_bLIGHT_2 0x24 +#define G_MWO_aLIGHT_3 0x40 +#define G_MWO_bLIGHT_3 0x44 +#define G_MWO_aLIGHT_4 0x60 +#define G_MWO_bLIGHT_4 0x64 +#define G_MWO_aLIGHT_5 0x80 +#define G_MWO_bLIGHT_5 0x84 +#define G_MWO_aLIGHT_6 0xa0 +#define G_MWO_bLIGHT_6 0xa4 +#define G_MWO_aLIGHT_7 0xc0 +#define G_MWO_bLIGHT_7 0xc4 +#define G_MWO_aLIGHT_8 0xe0 +#define G_MWO_bLIGHT_8 0xe4 +#endif +#define G_MWO_MATRIX_XX_XY_I 0x00 +#define G_MWO_MATRIX_XZ_XW_I 0x04 +#define G_MWO_MATRIX_YX_YY_I 0x08 +#define G_MWO_MATRIX_YZ_YW_I 0x0c +#define G_MWO_MATRIX_ZX_ZY_I 0x10 +#define G_MWO_MATRIX_ZZ_ZW_I 0x14 +#define G_MWO_MATRIX_WX_WY_I 0x18 +#define G_MWO_MATRIX_WZ_WW_I 0x1c +#define G_MWO_MATRIX_XX_XY_F 0x20 +#define G_MWO_MATRIX_XZ_XW_F 0x24 +#define G_MWO_MATRIX_YX_YY_F 0x28 +#define G_MWO_MATRIX_YZ_YW_F 0x2c +#define G_MWO_MATRIX_ZX_ZY_F 0x30 +#define G_MWO_MATRIX_ZZ_ZW_F 0x34 +#define G_MWO_MATRIX_WX_WY_F 0x38 +#define G_MWO_MATRIX_WZ_WW_F 0x3c +#define G_MWO_POINT_RGBA 0x10 +#define G_MWO_POINT_ST 0x14 +#define G_MWO_POINT_XYSCREEN 0x18 +#define G_MWO_POINT_ZSCREEN 0x1c + +/* + * Light structure. + * + * Note: only directional (infinite) lights are currently supported. + * + * Note: the weird order is for the DMEM alignment benefit of + * the microcode. + * + */ + +typedef struct { + unsigned char col[3]; /* diffuse light value (rgba) */ + char pad1; + unsigned char colc[3]; /* copy of diffuse light value (rgba) */ + char pad2; + signed char dir[3]; /* direction of light (normalized) */ + char pad3; +} Light_t; + +typedef struct { + unsigned char col[3]; + unsigned char kc; + unsigned char colc[3]; + unsigned char kl; + short pos[3]; + unsigned char kq; +} PointLight_t; + +typedef struct { + unsigned char col[3]; /* ambient light value (rgba) */ + char pad1; + unsigned char colc[3]; /* copy of ambient light value (rgba) */ + char pad2; +} Ambient_t; + +typedef struct { + int x1,y1,x2,y2; /* texture offsets for highlight 1/2 */ +} Hilite_t; + +typedef union { + Light_t l; + PointLight_t p; + long long int force_structure_alignment[2]; +} Light; + +typedef union { + Ambient_t l; + long long int force_structure_alignment[1]; +} Ambient; + +typedef struct { + Ambient a; + Light l[7]; +} Lightsn; + +typedef struct { + Ambient a; + Light l[1]; +} Lights0; + +typedef struct { + Ambient a; + Light l[1]; +} Lights1; + +typedef struct { + Ambient a; + Light l[2]; +} Lights2; + +typedef struct { + Ambient a; + Light l[3]; +} Lights3; + +typedef struct { + Ambient a; + Light l[4]; +} Lights4; + +typedef struct { + Ambient a; + Light l[5]; +} Lights5; + +typedef struct { + Ambient a; + Light l[6]; +} Lights6; + +typedef struct { + Ambient a; + Light l[7]; +} Lights7; + +typedef struct { + Light l[2]; +} LookAt; + +typedef union { + Hilite_t h; + long int force_structure_alignment[4]; +} Hilite; + +#define gdSPDefLights0(ar,ag,ab) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ { 0, 0, 0},0,{ 0, 0, 0},0,{ 0, 0, 0},0}}} } +#define gdSPDefLights1(ar,ag,ab,r1,g1,b1,x1,y1,z1) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}} } +#define gdSPDefLights2(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}} } +#define gdSPDefLights3(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}} } +#define gdSPDefLights4(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}} } +#define gdSPDefLights5(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4,r5,g5,b5,x5,y5,z5) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}, \ + {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}}} } + + +#define gdSPDefLights6(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4,r5,g5,b5,x5,y5,z5,r6,g6,b6,x6,y6,z6) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}, \ + {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}}, \ + {{ {r6,g6,b6},0,{r6,g6,b6},0,{x6,y6,z6},0}}} } + + +#define gdSPDefLights7(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4,r5,g5,b5,x5,y5,z5,r6,g6,b6,x6,y6,z6,r7,g7,b7,x7,y7,z7) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}, \ + {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}}, \ + {{ {r6,g6,b6},0,{r6,g6,b6},0,{x6,y6,z6},0}}, \ + {{ {r7,g7,b7},0,{r7,g7,b7},0,{x7,y7,z7},0}}} } + + +#define gdSPDefLookAt(rightx,righty,rightz,upx,upy,upz) \ + { {{ {{0,0,0},0,{0,0,0},0,{rightx,righty,rightz},0}}, \ + { {{0,0x80,0},0,{0,0x80,0},0,{upx,upy,upz},0}}} } + +/* + * Graphics DMA Packet + */ +typedef struct { + int cmd:8; + unsigned int par:8; + unsigned int len:16; + unsigned int addr; +} Gdma; + +/* + * Graphics Immediate Mode Packet types + */ +typedef struct { + int cmd:8; + int pad:24; + Tri tri; +} Gtri; + +typedef struct { + int cmd:8; + int pad1:24; + int pad2:24; + unsigned char param:8; +} Gpopmtx; + +/* + * typedef struct { + * int cmd:8; + * int pad0:24; + * int pad1:4; + * int number:4; + * int base:24; + * } Gsegment; + */ +typedef struct { + int cmd:8; + int pad0:8; + int mw_index:8; + int number:8; + int pad1:8; + int base:24; +} Gsegment; + +typedef struct { + int cmd:8; + int pad0:8; + int sft:8; + int len:8; + unsigned int data:32; +} GsetothermodeL; + +typedef struct { + int cmd:8; + int pad0:8; + int sft:8; + int len:8; + unsigned int data:32; +} GsetothermodeH; + +typedef struct { + unsigned char cmd; + unsigned char lodscale; + unsigned char tile; + unsigned char on; + unsigned short s; + unsigned short t; +} Gtexture; + +typedef struct { + int cmd:8; + int pad:24; + Tri line; +} Gline3D; + +typedef struct { + int cmd:8; + int pad1:24; + short int pad2; + short int scale; +} Gperspnorm; + + +/* + * RDP Packet types + */ +typedef struct { + int cmd:8; + unsigned int fmt:3; + unsigned int siz:2; + unsigned int pad:7; + unsigned int wd:12; /* really only 10 bits, extra */ + unsigned int dram; /* to account for 1024 */ +} Gsetimg; + +typedef struct { + int cmd:8; + unsigned int muxs0:24; + unsigned int muxs1:32; +} Gsetcombine; + +typedef struct { + int cmd:8; + unsigned char pad; + unsigned char prim_min_level; + unsigned char prim_level; + unsigned long color; +} Gsetcolor; + +typedef struct { + int cmd:8; + int x0:10; + int x0frac:2; + int y0:10; + int y0frac:2; + unsigned int pad:8; + int x1:10; + int x1frac:2; + int y1:10; + int y1frac:2; +} Gfillrect; + +typedef struct { + int cmd:8; + unsigned int fmt:3; + unsigned int siz:2; + unsigned int pad0:1; + unsigned int line:9; + unsigned int tmem:9; + unsigned int pad1:5; + unsigned int tile:3; + unsigned int palette:4; + unsigned int ct:1; + unsigned int mt:1; + unsigned int maskt:4; + unsigned int shiftt:4; + unsigned int cs:1; + unsigned int ms:1; + unsigned int masks:4; + unsigned int shifts:4; +} Gsettile; + +typedef struct { + int cmd:8; + unsigned int sl:12; + unsigned int tl:12; + int pad:5; + unsigned int tile:3; + unsigned int sh:12; + unsigned int th:12; +} Gloadtile; + +typedef Gloadtile Gloadblock; + +typedef Gloadtile Gsettilesize; + +typedef Gloadtile Gloadtlut; + +typedef struct { + unsigned int cmd:8; /* command */ + unsigned int xl:12; /* X coordinate of upper left */ + unsigned int yl:12; /* Y coordinate of upper left */ + unsigned int pad1:5; /* Padding */ + unsigned int tile:3; /* Tile descriptor index */ + unsigned int xh:12; /* X coordinate of lower right */ + unsigned int yh:12; /* Y coordinate of lower right */ + unsigned int s:16; /* S texture coord at top left */ + unsigned int t:16; /* T texture coord at top left */ + unsigned int dsdx:16;/* Change in S per change in X */ + unsigned int dtdy:16;/* Change in T per change in Y */ +} Gtexrect; + +#define MakeTexRect(xh,yh,flip,tile,xl,yl,s,t,dsdx,dtdy) \ + G_TEXRECT, xh, yh, 0, flip, 0, tile, xl, yl, s, t, dsdx, dtdy + +/* + * Textured rectangles are 128 bits not 64 bits + */ +typedef struct { + unsigned long w0; + unsigned long w1; + unsigned long w2; + unsigned long w3; +} TexRect; + +/* + * Generic Gfx Packet + */ +typedef struct { + unsigned int w0; + unsigned int w1; +} Gwords; + +/* + * This union is the fundamental type of the display list. + * It is, by law, exactly 64 bits in size. + */ +typedef union { + Gwords words; + Gdma dma; + Gtri tri; + Gline3D line; + Gpopmtx popmtx; + Gsegment segment; + GsetothermodeH setothermodeH; + GsetothermodeL setothermodeL; + Gtexture texture; + Gperspnorm perspnorm; + Gsetimg setimg; + Gsetcombine setcombine; + Gsetcolor setcolor; + Gfillrect fillrect; /* use for setscissor also */ + Gsettile settile; + Gloadtile loadtile; /* use for loadblock also, th is dxt */ + Gsettilesize settilesize; + Gloadtlut loadtlut; + long long int force_structure_alignment; +} Gfx; + +/* + * Macros to assemble the graphics display list + */ + +/* + * DMA macros + */ +#define gDma0p(pkt, c, s, l) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8) | _SHIFTL((l), 0, 24); \ + _g->words.w1 = (unsigned int)(s); \ +} + +#define gsDma0p(c, s, l) \ +{{ \ + _SHIFTL((c), 24, 8) | _SHIFTL((l), 0, 24), (unsigned int)(s) \ +}} + +#define gDma1p(pkt, c, s, l, p) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | \ + _SHIFTL((l), 0, 16)); \ + _g->words.w1 = (unsigned int)(s); \ +}) + +#define gsDma1p(c, s, l, p) \ +{{ \ + (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | \ + _SHIFTL((l), 0, 16)), \ + (unsigned int)(s) \ +}} + +#define gDma2p(pkt, c, adrs, len, idx, ofs) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL((c),24,8)|_SHIFTL(((len)-1)/8,19,5)| \ + _SHIFTL((ofs)/8,8,8)|_SHIFTL((idx),0,8)); \ + _g->words.w1 = (unsigned int)(adrs); \ +}) +#define gsDma2p(c, adrs, len, idx, ofs) \ +{{ \ + (_SHIFTL((c),24,8)|_SHIFTL(((len)-1)/8,19,5)| \ + _SHIFTL((ofs)/8,8,8)|_SHIFTL((idx),0,8)), \ + (unsigned int)(adrs) \ +}} + +#define gSPNoOp(pkt) gDma0p(pkt, G_SPNOOP, 0, 0) +#define gsSPNoOp() gsDma0p(G_SPNOOP, 0, 0) + +#ifdef F3DEX_GBI_2 +# define gSPMatrix(pkt, m, p) \ + gDma2p((pkt),G_MTX,(m),sizeof(Mtx),(p)^G_MTX_PUSH,0) +# define gsSPMatrix(m, p) \ + gsDma2p( G_MTX,(m),sizeof(Mtx),(p)^G_MTX_PUSH,0) +#else /* F3DEX_GBI_2 */ +# define gSPMatrix(pkt, m, p) gDma1p(pkt, G_MTX, m, sizeof(Mtx), p) +# define gsSPMatrix(m, p) gsDma1p(G_MTX, m, sizeof(Mtx), p) +#endif /* F3DEX_GBI_2 */ + +#if defined(F3DEX_GBI_2) +/* + * F3DEX_GBI_2: G_VTX GBI format was changed. + * + * +--------+----+---+---+----+------+-+ + * G_VTX | cmd:8 |0000| n:8 |0000|v0+n:7|0| + * +-+---+--+----+---+---+----+------+-+ + * | |seg| address | + * +-+---+-----------------------------+ + */ +# define gSPVertex(pkt, v, n, v0) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = \ + _SHIFTL(G_VTX,24,8)|_SHIFTL((n),12,8)|_SHIFTL((v0)+(n),1,7); \ + _g->words.w1 = (unsigned int)(v); \ +}) +# define gsSPVertex(v, n, v0) \ +{{ \ + (_SHIFTL(G_VTX,24,8)|_SHIFTL((n),12,8)|_SHIFTL((v0)+(n),1,7)), \ + (unsigned int)(v) \ +}} +#elif (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +/* + * F3DEX_GBI: G_VTX GBI format was changed to support 64 vertice. + * + * +--------+--------+------+----------+ + * G_VTX | cmd:8 | v0:8 | n:6 |length:10 | + * +-+---+--+--------+------+----------+ + * | |seg| address | + * +-+---+-----------------------------+ + */ +# define gSPVertex(pkt, v, n, v0) \ + gDma1p((pkt),G_VTX,(v),((n)<<10)|(sizeof(Vtx)*(n)-1),(v0)*2) +# define gsSPVertex(v, n, v0) \ + gsDma1p(G_VTX,(v),((n)<<10)|(sizeof(Vtx)*(n)-1),(v0)*2) +#else +# define gSPVertex(pkt, v, n, v0) \ + gDma1p(pkt, G_VTX, v, sizeof(Vtx)*(n),((n)-1)<<4|(v0)) +# define gsSPVertex(v, n, v0) \ + gsDma1p(G_VTX, v, sizeof(Vtx)*(n), ((n)-1)<<4|(v0)) +#endif + + +#ifdef F3DEX_GBI_2 +# define gSPViewport(pkt, v) \ + gDma2p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0) +# define gsSPViewport(v) \ + gsDma2p( G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0) +#else /* F3DEX_GBI_2 */ +# define gSPViewport(pkt,v) \ + gDma1p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT) +# define gsSPViewport(v) \ + gsDma1p( G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT) +#endif /* F3DEX_GBI_2 */ + +#define gSPDisplayList(pkt,dl) gDma1p(pkt,G_DL,dl,0,G_DL_PUSH) +#define gsSPDisplayList( dl) gsDma1p( G_DL,dl,0,G_DL_PUSH) + +#define gSPBranchList(pkt,dl) gDma1p(pkt,G_DL,dl,0,G_DL_NOPUSH) +#define gsSPBranchList( dl) gsDma1p( G_DL,dl,0,G_DL_NOPUSH) + +#define gSPSprite2DBase(pkt, s) gDma1p(pkt, G_SPRITE2D_BASE, s, sizeof(uSprite), 0) +#define gsSPSprite2DBase(s) gsDma1p(G_SPRITE2D_BASE, s, sizeof(uSprite), 0) + +/* + * RSP short command (no DMA required) macros + */ +#define gImmp0(pkt, c) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ +} + +#define gsImmp0(c) \ +{{ \ + _SHIFTL((c), 24, 8) \ +}} + +#define gImmp1(pkt, c, p0) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = (unsigned int)(p0); \ +}) + +#define gsImmp1(c, p0) \ +{{ \ + _SHIFTL((c), 24, 8), (unsigned int)(p0) \ +}} + +#define gImmp2(pkt, c, p0, p1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8); \ +} + +#define gsImmp2(c, p0, p1) \ +{{ \ + _SHIFTL((c), 24, 8), _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8)\ +}} + +#define gImmp3(pkt, c, p0, p1, p2) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = (_SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) | \ + _SHIFTL((p2), 0, 8)); \ +} + +#define gsImmp3(c, p0, p1, p2) \ +{{ \ + _SHIFTL((c), 24, 8), (_SHIFTL((p0), 16, 16) | \ + _SHIFTL((p1), 8, 8) | _SHIFTL((p2), 0, 8))\ +}} + +#define gImmp21(pkt, c, p0, p1, dat) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | \ + _SHIFTL((p1), 0, 8)); \ + _g->words.w1 = (unsigned int) (dat); \ +}) + +#define gsImmp21(c, p0, p1, dat) \ +{{ \ + _SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | _SHIFTL((p1), 0, 8),\ + (unsigned int) (dat) \ +}} + +#ifdef F3DEX_GBI_2 +#define gMoveWd(pkt, index, offset, data) \ + gDma1p((pkt), G_MOVEWORD, data, offset, index) +#define gsMoveWd( index, offset, data) \ + gsDma1p( G_MOVEWORD, data, offset, index) +#else /* F3DEX_GBI_2 */ +#define gMoveWd(pkt, index, offset, data) \ + gImmp21((pkt), G_MOVEWORD, offset, index, data) +#define gsMoveWd( index, offset, data) \ + gsImmp21( G_MOVEWORD, offset, index, data) +#endif /* F3DEX_GBI_2 */ + +/* Sprite immediate macros, there is also a sprite dma macro above */ + +#define gSPSprite2DScaleFlip(pkt, sx, sy, fx, fy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SPRITE2D_SCALEFLIP, 24, 8) | \ + _SHIFTL((fx), 8, 8) | \ + _SHIFTL((fy), 0, 8)); \ + _g->words.w1 = (_SHIFTL((sx), 16, 16) | \ + _SHIFTL((sy), 0, 16)); \ +} + +#define gsSPSprite2DScaleFlip(sx, sy, fx, fy) \ +{{ \ + (_SHIFTL(G_SPRITE2D_SCALEFLIP, 24, 8) | \ + _SHIFTL((fx), 8, 8) | \ + _SHIFTL((fy), 0, 8)), \ + (_SHIFTL((sx), 16, 16) | \ + _SHIFTL((sy), 0, 16)) \ +}} + +#define gSPSprite2DDraw(pkt, px, py) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SPRITE2D_DRAW, 24, 8)); \ + _g->words.w1 = (_SHIFTL((px), 16, 16) | \ + _SHIFTL((py), 0, 16)); \ +} + +#define gsSPSprite2DDraw(px, py) \ +{{ \ + (_SHIFTL(G_SPRITE2D_DRAW, 24, 8)), \ + (_SHIFTL((px), 16, 16) | \ + _SHIFTL((py), 0, 16)) \ +}} + + +/* + * Note: the SP1Triangle() and line macros multiply the vertex indices + * by 10, this is an optimization for the microcode. + */ +#if (defined(F3DLP_GBI)||defined(F3DEX_GBI)) +# define __gsSP1Triangle_w1(v0, v1, v2) \ + (_SHIFTL((v0)*2,16,8)|_SHIFTL((v1)*2,8,8)|_SHIFTL((v2)*2,0,8)) +# define __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2): \ + ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v0): \ + __gsSP1Triangle_w1(v2, v0, v1)) +# define __gsSPLine3D_w1(v0, v1, wd) \ + (_SHIFTL((v0)*2,16,8)|_SHIFT((v1)*2,8,8)|_SHIFT((wd),0,8)) +# define __gsSPLine3D_w1f(v0, v1, wd, flag) \ + (((flag) == 0) ? __gsSPLine3D_w1(v0, v1, wd): \ + __gsSPLine3D_w1(v1, v0, wd)) +# define __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2): \ + ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v3): \ + ((flag) == 2) ? __gsSP1Triangle_w1(v2, v3, v0): \ + __gsSP1Triangle_w1(v3, v0, v1)) +# define __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v2, v3): \ + ((flag) == 1) ? __gsSP1Triangle_w1(v1, v3, v0): \ + ((flag) == 2) ? __gsSP1Triangle_w1(v2, v0, v1): \ + __gsSP1Triangle_w1(v3, v1, v2)) +#else +# define __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + (_SHIFTL((flag), 24,8)|_SHIFTL((v0)*10,16,8)| \ + _SHIFTL((v1)*10, 8,8)|_SHIFTL((v2)*10, 0,8)) +# define __gsSPLine3D_w1f(v0, v1, wd, flag) \ + (_SHIFTL((flag), 24,8)|_SHIFTL((v0)*10,16,8)| \ + _SHIFTL((v1)*10, 8,8)|_SHIFTL((wd), 0,8)) +#endif + +#ifdef F3DEX_GBI_2 +/*** + *** 1 Triangle + ***/ +#define gSP1Triangle(pkt, v0, v1, v2, flag) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_TRI1, 24, 8)| \ + __gsSP1Triangle_w1f(v0, v1, v2, flag); \ + _g->words.w1 = 0; \ +}) +#define gsSP1Triangle(v0, v1, v2, flag) \ +{{ \ + _SHIFTL(G_TRI1, 24, 8)|__gsSP1Triangle_w1f(v0, v1, v2, flag), \ + 0 \ +}} + +/*** + *** Line + ***/ +#define gSPLine3D(pkt, v0, v1, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8)| \ + __gsSPLine3D_w1f(v0, v1, 0, flag); \ + _g->words.w1 = 0; \ +} +#define gsSPLine3D(v0, v1, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8)|__gsSPLine3D_w1f(v0, v1, 0, flag), \ + 0 \ +}} + +/*** + *** LineW + ***/ +/* these macros are the same as SPLine3D, except they have an + * additional parameter for width. The width is added to the "minimum" + * thickness, which is 1.5 pixels. The units for width are in + * half-pixel units, so a width of 1 translates to (.5 + 1.5) or + * a 2.0 pixels wide line. + */ +#define gSPLineW3D(pkt, v0, v1, wd, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8)| \ + __gsSPLine3D_w1f(v0, v1, wd, flag); \ + _g->words.w1 = 0; \ +} +#define gsSPLineW3D(v0, v1, wd, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8)|__gsSPLine3D_w1f(v0, v1, wd, flag), \ + 0 \ +}} + +/*** + *** 1 Quadrangle + ***/ +#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_QUAD, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ + _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ +}) + +#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ +{{ \ + (_SHIFTL(G_QUAD, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \ + __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ +}} +#else /* F3DEX_GBI_2 */ + +/*** + *** 1 Triangle + ***/ +#define gSP1Triangle(pkt, v0, v1, v2, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \ + _g->words.w1 = __gsSP1Triangle_w1f(v0, v1, v2, flag); \ +} +#define gsSP1Triangle(v0, v1, v2, flag) \ +{{ \ + _SHIFTL(G_TRI1, 24, 8), \ + __gsSP1Triangle_w1f(v0, v1, v2, flag) \ +}} + +/*** + *** Line + ***/ +#define gSPLine3D(pkt, v0, v1, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8); \ + _g->words.w1 = __gsSPLine3D_w1f(v0, v1, 0, flag); \ +} +#define gsSPLine3D(v0, v1, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8), \ + __gsSPLine3D_w1f(v0, v1, 0, flag) \ +}} + +/*** + *** LineW + ***/ +/* these macros are the same as SPLine3D, except they have an + * additional parameter for width. The width is added to the "minimum" + * thickness, which is 1.5 pixels. The units for width are in + * half-pixel units, so a width of 1 translates to (.5 + 1.5) or + * a 2.0 pixels wide line. + */ +#define gSPLineW3D(pkt, v0, v1, wd, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8); \ + _g->words.w1 = __gsSPLine3D_w1f(v0, v1, wd, flag); \ +} +#define gsSPLineW3D(v0, v1, wd, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8), \ + __gsSPLine3D_w1f(v0, v1, wd, flag) \ +}} + +/*** + *** 1 Quadrangle + ***/ +#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ + _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ +} + +#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ +{{ \ + (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \ + __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ +}} +#endif /* F3DEX_GBI_2 */ + +#if (defined(F3DLP_GBI)||defined(F3DEX_GBI)) +/*** + *** 2 Triangles + ***/ +#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \ + _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \ +}) + +#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \ +{{ \ + (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \ + __gsSP1Triangle_w1f(v10, v11, v12, flag1) \ +}} + +#endif /* F3DEX_GBI/F3DLP_GBI */ + +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +#define gSPCullDisplayList(pkt,vstart,vend) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | \ + _SHIFTL((vstart)*2, 0, 16); \ + _g->words.w1 = _SHIFTL((vend)*2, 0, 16); \ +} + +#define gsSPCullDisplayList(vstart,vend) \ +{{ \ + _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart)*2, 0, 16), \ + _SHIFTL((vend)*2, 0, 16) \ +}} + +#else +#define gSPCullDisplayList(pkt,vstart,vend) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | \ + ((0x0f & (vstart))*40); \ + _g->words.w1 = (unsigned int)((0x0f & ((vend)+1))*40); \ +} + +#define gsSPCullDisplayList(vstart,vend) \ +{{ \ + _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart))*40), \ + ((0x0f & ((vend)+1))*40) \ +}} +#endif + +#define gSPSegment(pkt, segment, base) \ + gMoveWd(pkt, G_MW_SEGMENT, (segment)*4, base) +#define gsSPSegment(segment, base) \ + gsMoveWd( G_MW_SEGMENT, (segment)*4, base) + +/* + * Clipping Macros + */ +#define FR_NEG_FRUSTRATIO_1 0x00000001 +#define FR_POS_FRUSTRATIO_1 0x0000ffff +#define FR_NEG_FRUSTRATIO_2 0x00000002 +#define FR_POS_FRUSTRATIO_2 0x0000fffe +#define FR_NEG_FRUSTRATIO_3 0x00000003 +#define FR_POS_FRUSTRATIO_3 0x0000fffd +#define FR_NEG_FRUSTRATIO_4 0x00000004 +#define FR_POS_FRUSTRATIO_4 0x0000fffc +#define FR_NEG_FRUSTRATIO_5 0x00000005 +#define FR_POS_FRUSTRATIO_5 0x0000fffb +#define FR_NEG_FRUSTRATIO_6 0x00000006 +#define FR_POS_FRUSTRATIO_6 0x0000fffa +/* + * r should be one of: FRUSTRATIO_1, FRUSTRATIO_2, FRUSTRATIO_3, ... FRUSTRATIO_6 + */ +#define gSPClipRatio(pkt, r) \ +{ \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r); \ +} + +#define gsSPClipRatio(r) \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r) + +/* + * Insert values into Matrix + * + * where = element of matrix (byte offset) + * num = new element (32 bit value replacing 2 int or 2 frac matrix + * componants + */ +#ifdef F3DEX_GBI_2 +#define gSPInsertMatrix(pkt, where, num) \ + ERROR!! gSPInsertMatrix is no longer supported. +#define gsSPInsertMatrix(where, num) \ + ERROR!! gsSPInsertMatrix is no longer supported. +#else +#define gSPInsertMatrix(pkt, where, num) \ + gMoveWd(pkt, G_MW_MATRIX, where, num) +#define gsSPInsertMatrix(where, num) \ + gsMoveWd(G_MW_MATRIX, where, num) +#endif + +/* + * Load new matrix directly + * + * mptr = pointer to matrix + */ +#ifdef F3DEX_GBI_2 +#define gSPForceMatrix(pkt, mptr) \ +{ gDma2p((pkt),G_MOVEMEM,(mptr),sizeof(Mtx),G_MV_MATRIX,0); \ + gMoveWd((pkt), G_MW_FORCEMTX,0,0x00010000); \ +} +#define gsSPForceMatrix(mptr) \ + gsDma2p(G_MOVEMEM,(mptr),sizeof(Mtx),G_MV_MATRIX,0), \ + gsMoveWd(G_MW_FORCEMTX,0,0x00010000) + +#else /* F3DEX_GBI_2 */ +#define gSPForceMatrix(pkt, mptr) \ +{ \ + gDma1p(pkt, G_MOVEMEM, mptr, 16, G_MV_MATRIX_1); \ + gDma1p(pkt, G_MOVEMEM, (char *)(mptr)+16, 16, G_MV_MATRIX_2); \ + gDma1p(pkt, G_MOVEMEM, (char *)(mptr)+32, 16, G_MV_MATRIX_3); \ + gDma1p(pkt, G_MOVEMEM, (char *)(mptr)+48, 16, G_MV_MATRIX_4); \ +} +#define gsSPForceMatrix(mptr) \ + gsDma1p( G_MOVEMEM, mptr, 16, G_MV_MATRIX_1), \ + gsDma1p( G_MOVEMEM, (char *)(mptr)+16, 16, G_MV_MATRIX_2), \ + gsDma1p( G_MOVEMEM, (char *)(mptr)+32, 16, G_MV_MATRIX_3), \ + gsDma1p( G_MOVEMEM, (char *)(mptr)+48, 16, G_MV_MATRIX_4) +#endif /* F3DEX_GBI_2 */ + +/* + * Insert values into Points + * + * point = point number 0-15 + * where = which element of point to modify (byte offset into point) + * num = new value (32 bit) + */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define gSPModifyVertex(pkt, vtx, where, val) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_MODIFYVTX,24,8)| \ + _SHIFTL((where),16,8)|_SHIFTL((vtx)*2,0,16)); \ + _g->words.w1 = (unsigned int)(val); \ +} +# define gsSPModifyVertex(vtx, where, val) \ +{{ \ + _SHIFTL(G_MODIFYVTX,24,8)| \ + _SHIFTL((where),16,8)|_SHIFTL((vtx)*2,0,16), \ + (unsigned int)(val) \ +}} +#else +# define gSPModifyVertex(pkt, vtx, where, val) \ + gMoveWd(pkt, G_MW_POINTS, (vtx)*40+(where), val) +# define gsSPModifyVertex(vtx, where, val) \ + gsMoveWd(G_MW_POINTS, (vtx)*40+(where), val) +#endif + +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +/* + * gSPBranchLessZ Branch DL if (vtx.z) less than or equal (zval). + * + * dl = DL branch to + * vtx = Vertex + * zval = Screen depth + * near = Near plane + * far = Far plane + * flag = G_BZ_PERSP or G_BZ_ORTHO + */ + +#define G_BZ_PERSP 0 +#define G_BZ_ORTHO 1 + +#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \ +(((unsigned int)FTOFIX32(((flag) == G_BZ_PERSP ? \ + (1.0f-(float)(near)/(float)(zval)) / \ + (1.0f-(float)(near)/(float)(far )) : \ + ((float)(zval) - (float)(near)) / \ + ((float)(far ) - (float)(near))))) * \ + (((int)((zmax) - (zmin)))&~1) + (int)FTOFIX32(zmin)) + +#define G_DEPTOZS(zval, near, far, flag) \ + G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ) + +#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ + _g->words.w1 = (unsigned int)(dl); \ + _g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_BRANCH_Z,24,8)| \ + _SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12)); \ + _g->words.w1 = G_DEPTOZSrg(zval, near, far, flag, zmin, zmax); \ +} + +#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \ +{{ _SHIFTL(G_RDPHALF_1,24,8), \ + (unsigned int)(dl), }}, \ +{{ _SHIFTL(G_BRANCH_Z,24,8)|_SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12),\ + G_DEPTOZSrg(zval, near, far, flag, zmin, zmax), }} + +#define gSPBranchLessZ(pkt, dl, vtx, zval, near, far, flag) \ + gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, 0, G_MAXZ) +#define gsSPBranchLessZ(dl, vtx, zval, near, far, flag) \ + gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, 0, G_MAXZ) + +/* + * gSPBranchLessZraw Branch DL if (vtx.z) less than or equal (raw zval). + * + * dl = DL branch to + * vtx = Vertex + * zval = Raw value of screen depth + */ +#define gSPBranchLessZraw(pkt, dl, vtx, zval) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ + _g->words.w1 = (unsigned int)(dl); \ + _g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_BRANCH_Z,24,8)| \ + _SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12)); \ + _g->words.w1 = (unsigned int)(zval); \ +} + +#define gsSPBranchLessZraw(dl, vtx, zval) \ +{{ _SHIFTL(G_RDPHALF_1,24,8), \ + (unsigned int)(dl), }}, \ +{{ _SHIFTL(G_BRANCH_Z,24,8)|_SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12),\ + (unsigned int)(zval), }} + +/* + * gSPLoadUcode RSP loads specified ucode. + * + * uc_start = ucode text section start + * uc_dstart = ucode data section start + */ +#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ + _g->words.w1 = (unsigned int)(uc_dstart); \ + _g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_LOAD_UCODE,24,8)| \ + _SHIFTL((int)(uc_dsize)-1,0,16)); \ + _g->words.w1 = (unsigned int)(uc_start); \ +}) + +#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \ +{{ _SHIFTL(G_RDPHALF_1,24,8), \ + (unsigned int)(uc_dstart), }}, \ +{{ _SHIFTL(G_LOAD_UCODE,24,8)| \ + _SHIFTL((int)(uc_dsize)-1,0,16), \ + (unsigned int)(uc_start), }} + +#define gSPLoadUcode(pkt, uc_start, uc_dstart) \ + gSPLoadUcodeEx((pkt), (uc_start), (uc_dstart), SP_UCODE_DATA_SIZE) +#define gsSPLoadUcode(uc_start, uc_dstart) \ + gsSPLoadUcodeEx((uc_start), (uc_dstart), SP_UCODE_DATA_SIZE) + +#define gSPLoadUcodeL(pkt, ucode) \ + gSPLoadUcode((pkt), OS_K0_TO_PHYSICAL(&##ucode##TextStart), \ + OS_K0_TO_PHYSICAL(&##ucode##DataStart)) +#define gsSPLoadUcodeL(ucode) \ + gsSPLoadUcode(OS_K0_TO_PHYSICAL(&##ucode##TextStart), \ + OS_K0_TO_PHYSICAL(&##ucode##DataStart)) +#endif + +#ifdef F3DEX_GBI_2 +/* + * gSPDma_io DMA to/from DMEM/IMEM for DEBUG. + */ +#define gSPDma_io(pkt, flag, dmem, dram, size) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_DMA_IO,24,8)|_SHIFTL((flag),23,1)| \ + _SHIFTL((dmem)/8,13,10)|_SHIFTL((size)-1,0,12); \ + _g->words.w1 = (unsigned int)(dram); \ +} + +#define gsSPDma_io(flag, dmem, dram, size) \ +{{ \ + _SHIFTL(G_DMA_IO,24,8)|_SHIFTL((flag),23,1)| \ + _SHIFTL((dmem)/8,13,10)|_SHIFTL((size)-1,0,12), \ + (unsigned int)(dram) \ +}} + +#define gSPDmaRead(pkt,dmem,dram,size) gSPDma_io((pkt),0,(dmem),(dram),(size)) +#define gsSPDmaRead(dmem,dram,size) gsSPDma_io(0,(dmem),(dram),(size)) +#define gSPDmaWrite(pkt,dmem,dram,size) gSPDma_io((pkt),1,(dmem),(dram),(size)) +#define gsSPDmaWrite(dmem,dram,size) gsSPDma_io(1,(dmem),(dram),(size)) +#endif + +/* + * Lighting Macros + */ +#ifdef F3DEX_GBI_2 +# define NUML(n) ((n)*24) +#else +# define NUML(n) (((n)+1)*32 + 0x80000000) +#endif +#define NUMLIGHTS_0 1 +#define NUMLIGHTS_1 1 +#define NUMLIGHTS_2 2 +#define NUMLIGHTS_3 3 +#define NUMLIGHTS_4 4 +#define NUMLIGHTS_5 5 +#define NUMLIGHTS_6 6 +#define NUMLIGHTS_7 7 +/* + * n should be one of: NUMLIGHTS_0, NUMLIGHTS_1, ..., NUMLIGHTS_7 + * NOTE: in addition to the number of directional lights specified, + * there is always 1 ambient light + */ +#define gSPNumLights(pkt, n) \ + gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) +#define gsSPNumLights(n) \ + gsMoveWd( G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) + +#define LIGHT_1 1 +#define LIGHT_2 2 +#define LIGHT_3 3 +#define LIGHT_4 4 +#define LIGHT_5 5 +#define LIGHT_6 6 +#define LIGHT_7 7 +#define LIGHT_8 8 +/* + * l should point to a Light struct + * n should be one of: LIGHT_1, LIGHT_2, ..., LIGHT_8 + * NOTE: the highest numbered light is always the ambient light (eg if there are + * 3 directional lights defined: gsSPNumLights(NUMLIGHTS_3), then lights + * LIGHT_1 through LIGHT_3 will be the directional lights and light + * LIGHT_4 will be the ambient light. + */ +#ifdef F3DEX_GBI_2 +# define gSPLight(pkt, l, n) \ + gDma2p((pkt),G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,(n)*24+24) +# define gsSPLight(l, n) \ + gsDma2p( G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,(n)*24+24) +#else /* F3DEX_GBI_2 */ +# define gSPLight(pkt, l, n) \ + gDma1p(pkt, G_MOVEMEM, l, sizeof(Light),((n)-1)*2+G_MV_L0) +# define gsSPLight(l, n) \ + gsDma1p( G_MOVEMEM, l, sizeof(Light),((n)-1)*2+G_MV_L0) +#endif /* F3DEX_GBI_2 */ + +/* + * gSPLightColor changes color of light without recalculating light direction + * col is a 32 bit word with r,g,b,a (alpha is ignored) + * n should be one of LIGHT_1, LIGHT_2, ..., LIGHT_8 + */ +#define gSPLightColor(pkt, n, col) \ +{ \ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_a##n, col); \ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_b##n, col); \ +} +#define gsSPLightColor(n, col) \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##n, col), \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##n, col) + +/* These macros use a structure "name" which is init'd with the gdSPDefLights macros*/ + +#define gSPSetLights0(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_0); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.a,2); \ +} +#define gsSPSetLights0(name) \ + gsSPNumLights(NUMLIGHTS_0), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.a,2) + +#define gSPSetLights1(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_1); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.a,2); \ +} +#define gsSPSetLights1(name) \ + gsSPNumLights(NUMLIGHTS_1), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.a,2) + +#define gSPSetLights2(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_2); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.a,3); \ +} +#define gsSPSetLights2(name) \ + gsSPNumLights(NUMLIGHTS_2), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.a,3) + +#define gSPSetLights3(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_3); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.a,4); \ +} +#define gsSPSetLights3(name) \ + gsSPNumLights(NUMLIGHTS_3), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.a,4) + +#define gSPSetLights4(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_4); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.a,5); \ +} +#define gsSPSetLights4(name) \ + gsSPNumLights(NUMLIGHTS_4), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.a,5) + +#define gSPSetLights5(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_5); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.l[4],5); \ + gSPLight(pkt,&name.a,6); \ +} + +#define gsSPSetLights5(name) \ + gsSPNumLights(NUMLIGHTS_5), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.l[4],5), \ + gsSPLight(&name.a,6) + +#define gSPSetLights6(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_6); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.l[4],5); \ + gSPLight(pkt,&name.l[5],6); \ + gSPLight(pkt,&name.a,7); \ +} + +#define gsSPSetLights6(name) \ + gsSPNumLights(NUMLIGHTS_6), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.l[4],5), \ + gsSPLight(&name.l[5],6), \ + gsSPLight(&name.a,7) + +#define gSPSetLights7(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_7); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.l[4],5); \ + gSPLight(pkt,&name.l[5],6); \ + gSPLight(pkt,&name.l[6],7); \ + gSPLight(pkt,&name.a,8); \ +} + +#define gsSPSetLights7(name) \ + gsSPNumLights(NUMLIGHTS_7), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.l[4],5), \ + gsSPLight(&name.l[5],6), \ + gsSPLight(&name.l[6],7), \ + gsSPLight(&name.a,8) + +/* + * Reflection/Hiliting Macros + */ +#ifdef F3DEX_GBI_2 +# define gSPLookAtX(pkt, l) \ + gDma2p((pkt),G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATX) +# define gsSPLookAtX(l) \ + gsDma2p( G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATX) +# define gSPLookAtY(pkt, l) \ + gDma2p((pkt),G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATY) +# define gsSPLookAtY(l) \ + gsDma2p( G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATY) +#else /* F3DEX_GBI_2 */ +# define gSPLookAtX(pkt, l) \ + gDma1p(pkt, G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATX) +# define gsSPLookAtX(l) \ + gsDma1p( G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATX) +# define gSPLookAtY(pkt, l) \ + gDma1p(pkt, G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATY) +# define gsSPLookAtY(l) \ + gsDma1p( G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATY) +#endif /* F3DEX_GBI_2 */ + +#define gSPLookAt(pkt, la) \ +_DW({ \ + gSPLookAtX(pkt,la); \ + gSPLookAtY(pkt,(char *)(la)+16); \ +}) +#define gsSPLookAt(la) \ + gsSPLookAtX(la), \ + gsSPLookAtY((char *)(la)+16) + +#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \ + gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \ + ((((width)-1)*4)+(hilite)->h.x1) & 0xfff, ((((height)-1)*4)+(hilite)->h.y1) & 0xfff) + +#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \ + gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \ + ((((width)-1)*4)+(hilite)->h.x2) & 0xfff, ((((height)-1)*4)+(hilite)->h.y2) & 0xfff) + + +/* + * FOG macros + * fm = z multiplier + * fo = z offset + * FOG FORMULA: alpha(fog) = (eyespace z) * fm + fo CLAMPED 0 to 255 + * note: (eyespace z) ranges -1 to 1 + * + * Alternate method of setting fog: + * min, max: range 0 to 1000: 0=nearplane, 1000=farplane + * min is where fog begins (usually less than max and often 0) + * max is where fog is thickest (usually 1000) + * + */ +#define gSPFogFactor(pkt, fm, fo) \ + gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL(fm,16,16) | _SHIFTL(fo,0,16))) + +#define gsSPFogFactor(fm, fo) \ + gsMoveWd(G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL(fm,16,16) | _SHIFTL(fo,0,16))) + +#define gSPFogPosition(pkt, min, max) \ + gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL((128000/((max)-(min))),16,16) | \ + _SHIFTL(((500-(min))*256/((max)-(min))),0,16))) + +#define gsSPFogPosition(min, max) \ + gsMoveWd(G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL((128000/((max)-(min))),16,16) | \ + _SHIFTL(((500-(min))*256/((max)-(min))),0,16))) + +#ifdef F3DEX_GBI_2 +/* + * Macros to turn texture on/off + */ +# define gSPTexture(pkt, s, t, level, tile, on) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8) | \ + _SHIFTL(BOWTIE_VAL,16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | \ + _SHIFTL((on),1,7)); \ + _g->words.w1 = (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)); \ +}) +# define gsSPTexture(s, t, level, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8) | _SHIFTL(BOWTIE_VAL,16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | _SHIFTL((on),1,7)),\ + (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)) \ +}} +/* + * Different version of SPTexture macro, has an additional parameter + * which is currently reserved in the microcode. + */ +# define gSPTextureL(pkt, s, t, level, xparam, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8) | \ + _SHIFTL((xparam),16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | \ + _SHIFTL((on),1,7)); \ + _g->words.w1 = (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)); \ +} +# define gsSPTextureL(s, t, level, xparam, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8) | _SHIFTL((xparam),16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | _SHIFTL((on),1,7)),\ + (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)) \ +}} +#else +/* + * Macros to turn texture on/off + */ +# define gSPTexture(pkt, s, t, level, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL(BOWTIE_VAL,16,8)|\ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)| \ + _SHIFTL((on),0,8)); \ + _g->words.w1 = (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)); \ +} +# define gsSPTexture(s, t, level, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL(BOWTIE_VAL,16,8)| \ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)|_SHIFTL((on),0,8)), \ + (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)) \ +}} +/* + * Different version of SPTexture macro, has an additional parameter + * which is currently reserved in the microcode. + */ +# define gSPTextureL(pkt, s, t, level, xparam, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL((xparam),16,8)| \ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)| \ + _SHIFTL((on),0,8)); \ + _g->words.w1 = (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)); \ +} +# define gsSPTextureL(s, t, level, xparam, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL((xparam),16,8)| \ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)|_SHIFTL((on),0,8)), \ + (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)) \ +}} +#endif + +#define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s)) +#define gsSPPerspNormalize(s) gsMoveWd( G_MW_PERSPNORM, 0, (s)) + +#ifdef F3DEX_GBI_2 +# define gSPPopMatrixN(pkt, n, num) gDma2p((pkt),G_POPMTX,(num)*64,64,2,0) +# define gsSPPopMatrixN(n, num) gsDma2p( G_POPMTX,(num)*64,64,2,0) +# define gSPPopMatrix(pkt, n) gSPPopMatrixN((pkt), (n), 1) +# define gsSPPopMatrix(n) gsSPPopMatrixN( (n), 1) +#else /* F3DEX_GBI_2 */ +# define gSPPopMatrix(pkt, n) gImmp1(pkt, G_POPMTX, n) +# define gsSPPopMatrix(n) gsImmp1( G_POPMTX, n) +#endif /* F3DEX_GBI_2 */ + +#define gSPEndDisplayList(pkt) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \ + _g->words.w1 = 0; \ +}) + +#define gsSPEndDisplayList() \ +{{ \ + _SHIFTL(G_ENDDL, 24, 8), 0 \ +}} + +#ifdef F3DEX_GBI_2 +/* + * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs. + * + * gSPClearGeometryMode(pkt,c) + * gSPSetGeometryMode(pkt,s) + * + * gSPLoadGeometryMode(pkt, word) sets GeometryMode directly. + */ +#define gSPGeometryMode(pkt, c, s) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_GEOMETRYMODE,24,8)|_SHIFTL(~(u32)(c),0,24);\ + _g->words.w1 = (u32)(s); \ +}) + +#define gsSPGeometryMode(c, s) \ +{{ \ + (_SHIFTL(G_GEOMETRYMODE,24,8)|_SHIFTL(~(u32)(c),0,24)),(u32)(s) \ +}} +#define gSPSetGeometryMode(pkt, word) gSPGeometryMode((pkt),0,(word)) +#define gsSPSetGeometryMode(word) gsSPGeometryMode(0,(word)) +#define gSPClearGeometryMode(pkt, word) gSPGeometryMode((pkt),(word),0) +#define gsSPClearGeometryMode(word) gsSPGeometryMode((word),0) +#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt),-1,(word)) +#define gsSPLoadGeometryMode(word) gsSPGeometryMode(-1,(word)) + +#else /* F3DEX_GBI_2 */ +#define gSPSetGeometryMode(pkt, word) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \ + _g->words.w1 = (unsigned int)(word); \ +} + +#define gsSPSetGeometryMode(word) \ +{{ \ + _SHIFTL(G_SETGEOMETRYMODE, 24, 8), (unsigned int)(word) \ +}} + +#define gSPClearGeometryMode(pkt, word) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \ + _g->words.w1 = (unsigned int)(word); \ +} + +#define gsSPClearGeometryMode(word) \ +{{ \ + _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8), (unsigned int)(word) \ +}} +#endif /* F3DEX_GBI_2 */ + +#ifdef F3DEX_GBI_2 +#define gSPSetOtherMode(pkt, cmd, sft, len, data) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(cmd,24,8)|_SHIFTL(32-(sft)-(len),8,8)| \ + _SHIFTL((len)-1,0,8)); \ + _g->words.w1 = (unsigned int)(data); \ +}) + +#define gsSPSetOtherMode(cmd, sft, len, data) \ +{{ \ + _SHIFTL(cmd,24,8)|_SHIFTL(32-(sft)-(len),8,8)|_SHIFTL((len)-1,0,8), \ + (unsigned int)(data) \ +}} +#else +#define gSPSetOtherMode(pkt, cmd, sft, len, data) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | \ + _SHIFTL(len, 0, 8)); \ + _g->words.w1 = (unsigned int)(data); \ +} + +#define gsSPSetOtherMode(cmd, sft, len, data) \ +{{ \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8), \ + (unsigned int)(data) \ +}} +#endif + +/* + * RDP setothermode register commands - register shadowed in RSP + */ +#define gDPPipelineMode(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode) +#define gsDPPipelineMode(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode) + +#define gDPSetCycleType(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type) +#define gsDPSetCycleType(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type) + +#define gDPSetTexturePersp(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type) +#define gsDPSetTexturePersp(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type) + +#define gDPSetTextureDetail(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type) +#define gsDPSetTextureDetail(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type) + +#define gDPSetTextureLOD(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type) +#define gsDPSetTextureLOD(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type) + +#define gDPSetTextureLUT(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type) +#define gsDPSetTextureLUT(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type) + +#define gDPSetTextureFilter(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type) +#define gsDPSetTextureFilter(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type) + +#define gDPSetTextureConvert(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type) +#define gsDPSetTextureConvert(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type) + +#define gDPSetCombineKey(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type) +#define gsDPSetCombineKey(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type) + +#ifndef _HW_VERSION_1 +#define gDPSetColorDither(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode) +#define gsDPSetColorDither(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode) +#else +#define gDPSetColorDither(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode) +#define gsDPSetColorDither(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode) +#endif + +#ifndef _HW_VERSION_1 +#define gDPSetAlphaDither(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode) +#define gsDPSetAlphaDither(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode) +#endif + +/* 'blendmask' is not supported anymore. + * The bits are reserved for future use. + * Fri May 26 13:45:55 PDT 1995 + */ +#define gDPSetBlendMask(pkt, mask) gDPNoOp(pkt) +#define gsDPSetBlendMask(mask) gsDPNoOp() + +#define gDPSetAlphaCompare(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) +#define gsDPSetAlphaCompare(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) + +#define gDPSetDepthSource(pkt, src) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src) +#define gsDPSetDepthSource(src) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src) + +#define gDPSetRenderMode(pkt, c0, c1) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, \ + (c0) | (c1)) +#define gsDPSetRenderMode(c0, c1) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, \ + (c0) | (c1)) + +#define gSetImage(pkt, cmd, fmt, siz, width, i) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | \ + _SHIFTL(siz, 19, 2) | _SHIFTL((width)-1, 0, 12); \ + _g->words.w1 = (unsigned int)(i); \ +}) + +#define gsSetImage(cmd, fmt, siz, width, i) \ +{{ \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | \ + _SHIFTL(siz, 19, 2) | _SHIFTL((width)-1, 0, 12), \ + (unsigned int)(i) \ +}} + +#define gDPSetColorImage(pkt, f, s, w, i) gSetImage(pkt, G_SETCIMG, f, s, w, i) +#define gsDPSetColorImage(f, s, w, i) gsSetImage(G_SETCIMG, f, s, w, i) + + +/* use these for new code */ +#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i) +#define gsDPSetDepthImage(i) gsSetImage(G_SETZIMG, 0, 0, 1, i) +/* kept for compatibility */ +#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i) +#define gsDPSetMaskImage(i) gsDPSetDepthImage(i) + +#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i) +#define gsDPSetTextureImage(f, s, w, i) gsSetImage(G_SETTIMG, f, s, w, i) + +/* + * RDP macros + */ + +#define gDPSetCombine(pkt, muxs0, muxs1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24);\ + _g->words.w1 = (unsigned int)(muxs1); \ +} + +#define gsDPSetCombine(muxs0, muxs1) \ +{{ \ + _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), \ + (unsigned int)(muxs1) \ +}} + +#define GCCc0w0(saRGB0, mRGB0, saA0, mA0) \ + (_SHIFTL((saRGB0), 20, 4) | _SHIFTL((mRGB0), 15, 5) | \ + _SHIFTL((saA0), 12, 3) | _SHIFTL((mA0), 9, 3)) + +#define GCCc1w0(saRGB1, mRGB1) \ + (_SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5)) + +#define GCCc0w1(sbRGB0, aRGB0, sbA0, aA0) \ + (_SHIFTL((sbRGB0), 28, 4) | _SHIFTL((aRGB0), 15, 3) | \ + _SHIFTL((sbA0), 12, 3) | _SHIFTL((aA0), 9, 3)) + +#define GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1) \ + (_SHIFTL((sbRGB1), 24, 4) | _SHIFTL((saA1), 21, 3) | \ + _SHIFTL((mA1), 18, 3) | _SHIFTL((aRGB1), 6, 3) | \ + _SHIFTL((sbA1), 3, 3) | _SHIFTL((aA1), 0, 3)) + +#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ + a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | \ + _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \ + G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \ + GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \ + 0, 24); \ + _g->words.w1 = (unsigned int)(GCCc0w1(G_CCMUX_##b0, \ + G_CCMUX_##d0, \ + G_ACMUX_##Ab0, \ + G_ACMUX_##Ad0) | \ + GCCc1w1(G_CCMUX_##b1, \ + G_ACMUX_##Aa1, \ + G_ACMUX_##Ac1, \ + G_CCMUX_##d1, \ + G_ACMUX_##Ab1, \ + G_ACMUX_##Ad1)); \ +}) + +#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ + a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ +{{ \ + _SHIFTL(G_SETCOMBINE, 24, 8) | \ + _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \ + G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \ + GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), 0, 24), \ + (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, \ + G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \ + GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, \ + G_ACMUX_##Ac1, G_CCMUX_##d1, \ + G_ACMUX_##Ab1, G_ACMUX_##Ad1)) \ +}} + +/* + * SetCombineMode macros are NOT redunant. It allow the C preprocessor + * to substitute single parameter which includes commas in the token and + * rescan for higher parameter count macro substitution. + * + * eg. gsDPSetCombineMode(G_CC_MODULATE, G_CC_MODULATE) turns into + * gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, + * TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0) + */ + +#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b) +#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP(a, b) + +#define gDPSetColor(pkt, c, d) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(c, 24, 8); \ + _g->words.w1 = (unsigned int)(d); \ +}) + +#define gsDPSetColor(c, d) \ +{{ \ + _SHIFTL(c, 24, 8), (unsigned int)(d) \ +}} + +#define DPRGBColor(pkt, cmd, r, g, b, a) \ + gDPSetColor(pkt, cmd, \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ + _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) +#define sDPRGBColor(cmd, r, g, b, a) \ + gsDPSetColor(cmd, \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ + _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) + +#define gDPSetEnvColor(pkt, r, g, b, a) \ + DPRGBColor(pkt, G_SETENVCOLOR, r,g,b,a) +#define gsDPSetEnvColor(r, g, b, a) \ + sDPRGBColor(G_SETENVCOLOR, r,g,b,a) +#define gDPSetBlendColor(pkt, r, g, b, a) \ + DPRGBColor(pkt, G_SETBLENDCOLOR, r,g,b,a) +#define gsDPSetBlendColor(r, g, b, a) \ + sDPRGBColor(G_SETBLENDCOLOR, r,g,b,a) +#define gDPSetFogColor(pkt, r, g, b, a) \ + DPRGBColor(pkt, G_SETFOGCOLOR, r,g,b,a) +#define gsDPSetFogColor(r, g, b, a) \ + sDPRGBColor(G_SETFOGCOLOR, r,g,b,a) +#define gDPSetFillColor(pkt, d) \ + gDPSetColor(pkt, G_SETFILLCOLOR, (d)) +#define gsDPSetFillColor(d) \ + gsDPSetColor(G_SETFILLCOLOR, (d)) + +#define gDPSetPrimDepth(pkt, z, dz) \ + gDPSetColor(pkt, G_SETPRIMDEPTH, \ + _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16)) +#define gsDPSetPrimDepth(z, dz) \ + gsDPSetColor(G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | \ + _SHIFTL(dz, 0, 16)) + +#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | \ + _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)); \ + _g->words.w1 = (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ + _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)); \ +}) + +#define gsDPSetPrimColor(m, l, r, g, b, a) \ +{{ \ + (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | \ + _SHIFTL(l, 0, 8)), \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | \ + _SHIFTL(a, 0, 8)) \ +}} + +/* + * gDPSetOtherMode (This is for expert user.) + * + * This command makes all othermode parameters set. + * Do not use this command in the same DL with another g*SPSetOtherMode DLs. + * + * [Usage] + * gDPSetOtherMode(pkt, modeA, modeB) + * + * 'modeA' is described all parameters of GroupA GBI command. + * 'modeB' is also described all parameters of GroupB GBI command. + * + * GroupA: + * gDPPipelineMode, gDPSetCycleType, gSPSetTexturePersp, + * gDPSetTextureDetail, gDPSetTextureLOD, gDPSetTextureLUT, + * gDPSetTextureFilter, gDPSetTextureConvert, gDPSetCombineKey, + * gDPSetColorDither, gDPSetAlphaDither + * + * GroupB: + * gDPSetAlphaCompare, gDPSetDepthSource, gDPSetRenderMode + * + * Use 'OR' operation to get modeA and modeB. + * + * modeA = G_PM_* | G_CYC_* | G_TP_* | G_TD_* | G_TL_* | G_TT_* | G_TF_* + * G_TC_* | G_CK_* | G_CD_* | G_AD_*; + * + * modeB = G_AC_* | G_ZS_* | G_RM_* | G_RM_*2; + */ +#define gDPSetOtherMode(pkt, mode0, mode1) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE,24,8)|_SHIFTL(mode0,0,24);\ + _g->words.w1 = (unsigned int)(mode1); \ +}) + +#define gsDPSetOtherMode(mode0, mode1) \ +{{ \ + _SHIFTL(G_RDPSETOTHERMODE,24,8)|_SHIFTL(mode0,0,24), \ + (unsigned int)(mode1) \ +}} + +/* + * Texturing macros + */ + +/* These are also defined defined above for Sprite Microcode */ + +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +#define G_TX_NOMIRROR 0 +#define G_TX_WRAP 0 +#define G_TX_MIRROR 0x1 +#define G_TX_CLAMP 0x2 +#define G_TX_NOMASK 0 +#define G_TX_NOLOD 0 + + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif +/* + * Dxt is the inverse of the number of 64-bit words in a line of + * the texture being loaded using the load_block command. If + * there are any 1's to the right of the 11th fractional bit, + * dxt should be rounded up. The following macros accomplish + * this. The 4b macros are a special case since 4-bit textures + * are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM + */ +#define G_TX_DXT_FRAC 11 + +/* + * For RCP 2.0, the maximum number of texels that can be loaded + * using a load_block command is 2048. In order to load the total + * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, + * then change the tile to the proper texel size after the load. + * The g*DPLoadTextureBlock macros already do this, so this change + * will be transparent if you use these macros. If you use + * the g*DPLoadBlock macros directly, you will need to handle this + * tile manipulation yourself. RJM. + */ +#ifdef _HW_VERSION_1 +#define G_TX_LDBLK_MAX_TXL 4095 +#else +#define G_TX_LDBLK_MAX_TXL 2047 +#endif /* _HW_VERSION_1 */ + +#define TXL2WORDS(txls, b_txl) MAX(1, ((txls)*(b_txl)/8)) +#define CALC_DXT(width, b_txl) \ + (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / \ + TXL2WORDS(width, b_txl)) + +#define TXL2WORDS_4b(txls) MAX(1, ((txls)/16)) +#define CALC_DXT_4b(width) \ + (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / \ + TXL2WORDS_4b(width)) + +#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | \ + _SHIFTL(ult, 0, 12); \ + _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | \ + _SHIFTL(lrt, 0, 12); \ +}) + +#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \ +{{ \ + _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), \ + _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12)\ +}} + +#define gDPSetTileSize(pkt, t, uls, ult, lrs, lrt) \ + gDPLoadTileGeneric(pkt, G_SETTILESIZE, t, uls, ult, lrs, lrt) +#define gsDPSetTileSize(t, uls, ult, lrs, lrt) \ + gsDPLoadTileGeneric(G_SETTILESIZE, t, uls, ult, lrs, lrt) +#define gDPLoadTile(pkt, t, uls, ult, lrs, lrt) \ + gDPLoadTileGeneric(pkt, G_LOADTILE, t, uls, ult, lrs, lrt) +#define gsDPLoadTile(t, uls, ult, lrs, lrt) \ + gsDPLoadTileGeneric(G_LOADTILE, t, uls, ult, lrs, lrt) + +#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, \ + maskt, shiftt, cms, masks, shifts) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) |\ + _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | \ + _SHIFTL(tmem, 0, 9); \ + _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | \ + _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \ + _SHIFTL(shiftt, 10, 4) |_SHIFTL(cms, 8, 2) | \ + _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4); \ +}) + +#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, \ + maskt, shiftt, cms, masks, shifts) \ +{{ \ + (_SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | \ + _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | _SHIFTL(tmem, 0, 9)),\ + (_SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | \ + _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \ + _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | \ + _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4)) \ +}} + +/* + * For RCP 2.0, the maximum number of texels that can be loaded + * using a load_block command is 2048. In order to load the total + * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, + * then change the tile to the proper texel size after the load. + * The g*DPLoadTextureBlock macros already do this, so this change + * will be transparent if you use these macros. If you use + * the g*DPLoadBlock macros directly, you will need to handle this + * tile manipulation yourself. RJM. + */ +#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | \ + _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | \ + _SHIFTL((MIN(lrs,G_TX_LDBLK_MAX_TXL)), 12, 12) |\ + _SHIFTL(dxt, 0, 12)); \ +}) + +#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \ +{{ \ + (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | \ + _SHIFTL(ult, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | \ + _SHIFTL((MIN(lrs,G_TX_LDBLK_MAX_TXL)), 12, 12) | \ + _SHIFTL(dxt, 0, 12)) \ +}} + +#define gDPLoadTLUTCmd(pkt, tile, count) \ +_DW({ \ + Gfx *_g = (Gfx *)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \ + _g->words.w1 = _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10);\ +}) + +#define gsDPLoadTLUTCmd(tile, count) \ +{{ \ + _SHIFTL(G_LOADTLUT, 24, 8), \ + _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10) \ +}} + +#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +_DW({ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT) -1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * siz##_LINE_BYTES)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +}) + +#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT) -1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * 1)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* Load fix rww 27jun95 */ +/* The S at the end means odd lines are already word Swapped */ + +#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1,0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * siz##_LINE_BYTES)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* + * Allow tmem address and render tile to be specified. + * The S at the end means odd lines are already word Swapped + */ +#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1,0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * siz##_LINE_BYTES)+7)>>3, tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + + +#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1,0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * 1)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* + * allows tmem address to be specified + */ +#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES)+7)>>3, \ + tmem, G_TX_RENDERTILE, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* + * allows tmem address and render tile to be specified + */ +#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0,\ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES)+7)>>3, \ + tmem, rtile, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* + * allows tmem address and render tile to be specified + */ +#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0,\ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES)+7)>>3, \ + tmem, rtile, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* Here is the static form of the pre-swapped texture block loading */ +/* See gDPLoadTextureBlockS() for reference. Basically, just don't + calculate DxT, use 0 */ + +#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0 , \ + cmt, maskt,shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, 0 ),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allow tmem address to be specified + */ +#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, \ + ((((width) * siz##_LINE_BYTES)+7)>>3), tmem, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * Allow tmem address and render_tile to be specified + */ +#define _gsDPLoadTextureBlockTile(timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, \ + ((((width) * siz##_LINE_BYTES)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * Allow tmem address and render_tile to be specified, useful when loading + * mutilple tiles at a time. + */ +#define gsDPLoadMultiBlock(timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, \ + ((((width) * siz##_LINE_BYTES)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allows tmem and render tile to be specified. Useful when loading + * several tiles at a time. + * + * Here is the static form of the pre-swapped texture block loading + * See gDPLoadTextureBlockS() for reference. Basically, just don't + * calculate DxT, use 0 + */ + +#define gsDPLoadMultiBlockS(timg, tmem, rtile, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0 , \ + cmt, maskt,shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, 0 ),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES)+7)>>3), tmem,\ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +_DW({ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +}) + +/* Load fix rww 27jun95 */ +/* The S at the end means odd lines are already word Swapped */ + +#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, 0 ); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* + * 4-bit load block. Useful when loading multiple tiles + */ +#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height,\ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +/* + * 4-bit load block. Allows tmem and render tile to be specified. Useful when + * loading multiple tiles. The S means odd lines are already word swapped. + */ +#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height,\ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, 0 ); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + + +#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ +} + +#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1,0),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* + * 4-bit load block. Allows tmem address and render tile to be specified. + * Useful when loading multiple tiles. + */ +#define gsDPLoadMultiBlock_4b(timg, tmem, rtile, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * 4-bit load block. Allows tmem address and render tile to be specified. + * Useful when loading multiple tiles. S means odd lines are already swapped. + */ +#define gsDPLoadMultiBlock_4bS(timg, tmem, rtile, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1,0),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * Allows tmem address to be specified + */ +#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +#ifndef _HW_VERSION_1 + +#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ +_DW({ \ + gDPSetTextureImage(pkt, fmt, siz, width, timg); \ + gDPSetTile(pkt, fmt, siz, \ + (((((lrs)-(uls)+1) * siz##_TILE_BYTES)+7)>>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, \ + (uls)<>3), tmem, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, \ + (uls)<>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks,\ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, \ + (uls)<>3), \ + tmem, G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<>3), \ + tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, \ + (uls)<>1), timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_8b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, \ + (uls)<>1), timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_8b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), tmem, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, \ + (uls)<>1), timg), \ + gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, \ + (uls)<>1), timg), \ + gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs)-(uls)+1)>>1)+7)>>3), \ + tmem, G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs)-(uls)+1)>>1)+7)>>3), \ + tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, \ + (uls)<words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((float)(ulx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(uly)*4.0F), 0, 12); \ + _g->words.w1 = _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)((float)(lrx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(lry)*4.0F), 0, 12); \ +}) + + +#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \ +_DW({ \ + Gfx *_g = (Gfx *)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((ulx)), 12, 12) | \ + _SHIFTL((int)((uly)), 0, 12); \ + _g->words.w1 = _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)((lrx)), 12, 12) | \ + _SHIFTL((int)((lry)), 0, 12); \ +}) + +#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \ +{{ \ + _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((float)(ulx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(uly)*4.0F), 0, 12), \ + _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)((float)(lrx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(lry)*4.0F), 0, 12) \ +}} + +#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \ +{{ \ + _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((ulx)), 12, 12) | \ + _SHIFTL((int)((uly)), 0, 12), \ + _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)(lrx), 12, 12) | \ + _SHIFTL((int)(lry), 0, 12) \ +}} + +/* Fraction never used in fill */ +#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | \ + _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10));\ + _g->words.w1 = (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10));\ +}) + +#define gsDPFillRectangle(ulx, uly, lrx, lry) \ +{{ \ + (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | \ + _SHIFTL((lry), 2, 10)), \ + (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)) \ +}} + +/* like gDPFillRectangle but accepts negative arguments */ +#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | \ + _SHIFTL(MAX((lrx),0), 14, 10) | \ + _SHIFTL(MAX((lry),0), 2, 10)); \ + _g->words.w1 = (_SHIFTL(MAX((ulx),0), 14, 10) | \ + _SHIFTL(MAX((uly),0), 2, 10)); \ +} + +#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETCONVERT, 24, 8) | \ + _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | \ + _SHIFTR(k2, 5, 4)); \ + _g->words.w1 = (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | \ + _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)); \ +} + +#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \ +{{ \ + (_SHIFTL(G_SETCONVERT, 24, 8) | \ + _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)), \ + (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | \ + _SHIFTL(k5, 0, 9)) \ +}} + +#define gDPSetKeyR(pkt, cR, sR, wR) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETKEYR, 24, 8); \ + _g->words.w1 = (_SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | \ + _SHIFTL(sR, 0, 8)); \ +} + +#define gsDPSetKeyR(cR, sR, wR) \ +{{ \ + _SHIFTL(G_SETKEYR, 24, 8), \ + _SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8) \ +}} + +#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETKEYGB, 24, 8) | \ + _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)); \ + _g->words.w1 = (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | \ + _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)); \ +} + +#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \ +{{ \ + (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | \ + _SHIFTL(wB, 0, 12)), \ + (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | \ + _SHIFTL(sB, 0, 8)) \ +}} + +#define gDPNoParam(pkt, cmd) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8); \ + _g->words.w1 = 0; \ +}) + +#define gsDPNoParam(cmd) \ +{{ \ + _SHIFTL(cmd, 24, 8), 0 \ +}} + +#define gDPParam(pkt, cmd, param) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8); \ + _g->words.w1 = (param); \ +} + +#define gsDPParam(cmd, param) \ +{{ \ + _SHIFTL(cmd, 24, 8), (param) \ +}} + +/* Notice that textured rectangles are 128-bit commands, therefore + * gsDPTextureRectangle() should not be used in display lists + * under normal circumstances (use gsSPTextureRectangle()). + * That is also why there is no gDPTextureRectangle() macros. + */ +#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{{ \ + (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \ +}}, \ +{{ \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), \ + _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ +}} + +#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + if (pkt); \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + _g ++; \ + _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ +} + +#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{{ \ + (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \ +}}, \ +{{ \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), \ + _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ +}} + +#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + if (pkt); \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + _g ++; \ + _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ +} + +#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + {{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ + gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\ +}) + +/* like gSPTextureRectangle but accepts negative position arguments */ +#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +_DW({ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \ + _SHIFTL(MAX((s16)(xh),0), 12, 12) | \ + _SHIFTL(MAX((s16)(yh),0), 0, 12)); \ + _g->words.w1 = (_SHIFTL((tile), 24, 3) | \ + _SHIFTL(MAX((s16)(xl),0), 12, 12) | \ + _SHIFTL(MAX((s16)(yl),0), 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, \ + (_SHIFTL(((s) - \ + (((s16)(xl) < 0) ? \ + (((s16)(dsdx) < 0) ? \ + (MAX((((s16)(xl)*(s16)(dsdx))>>7),0)) : \ + (MIN((((s16)(xl)*(s16)(dsdx))>>7),0))) : 0)), \ + 16, 16) | \ + _SHIFTL(((t) - \ + (((yl) < 0) ? \ + (((s16)(dtdy) < 0) ? \ + (MAX((((s16)(yl)*(s16)(dtdy))>>7),0)) : \ + (MIN((((s16)(yl)*(s16)(dtdy))>>7),0))) : 0)), \ + 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | \ + _SHIFTL((dtdy), 0, 16))); \ +}) + +#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + {{(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ + gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) |\ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ +} + +#define gsDPWord(wordhi, wordlo) \ + gsImmp1(G_RDPHALF_1, (unsigned int)(wordhi)), \ + gsImmp1(G_RDPHALF_2, (unsigned int)(wordlo)) + +#define gDPWord(pkt, wordhi, wordlo) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + gImmp1(pkt, G_RDPHALF_1, (unsigned int)(wordhi)); \ + gImmp1(pkt, G_RDPHALF_2, (unsigned int)(wordlo)); \ +} + +#define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC) +#define gsDPFullSync() gsDPNoParam(G_RDPFULLSYNC) +#define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC) +#define gsDPTileSync() gsDPNoParam(G_RDPTILESYNC) +#define gDPPipeSync(pkt) gDPNoParam(pkt, G_RDPPIPESYNC) +#define gsDPPipeSync() gsDPNoParam(G_RDPPIPESYNC) +#define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC) +#define gsDPLoadSync() gsDPNoParam(G_RDPLOADSYNC) +#define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP) +#define gsDPNoOp() gsDPNoParam(G_NOOP) +#define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag) +#define gsDPNoOpTag(tag) gsDPParam(G_NOOP, tag) + +#endif /* _LANGUAGE_C */ + + +#endif /* _GBI_H_ */ diff --git a/lib/ultralib/include/PR/gs2dex.h b/lib/ultralib/include/PR/gs2dex.h new file mode 100644 index 0000000..ced4685 --- /dev/null +++ b/lib/ultralib/include/PR/gs2dex.h @@ -0,0 +1,392 @@ +/*--------------------------------------------------------------------- + Copyright (C) 1997, Nintendo. + + File gs2dex.h + Coded by Yoshitaka Yasumoto. Jul 31, 1997. + Modified by + Comments Header file for S2DEX ucode. + + $Id: gs2dex.h,v 1.21 1998/05/28 00:14:49 has Exp $ + ---------------------------------------------------------------------*/ + +#ifndef _GS2DEX_H_ +#define _GS2DEX_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/*===========================================================================* + * Macro + *===========================================================================*/ +#define GS_CALC_DXT(line) (((1<< G_TX_DXT_FRAC)-1)/(line)+1) +#define GS_PIX2TMEM(pix, siz) ((pix)>>(4-(siz))) +#define GS_PIX2DXT(pix, siz) GS_CALC_DXT(GS_PIX2TMEM((pix), (siz))) + +/*===========================================================================* + * Data structures for S2DEX microcode + *===========================================================================*/ + +/*---------------------------------------------------------------------------* + * Background + *---------------------------------------------------------------------------*/ +#define G_BGLT_LOADBLOCK 0x0033 +#define G_BGLT_LOADTILE 0xfff4 + +#define G_BG_FLAG_FLIPS 0x01 +#define G_BG_FLAG_FLIPT 0x10 + +/* Non scalable background plane */ +typedef struct { + u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */ + u16 imageW; /* width of the texture (u10.2) */ + s16 frameX; /* upper-left position of transferred frame (s10.2) */ + u16 frameW; /* width of transferred frame (u10.2) */ + + u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */ + u16 imageH; /* height of the texture (u10.2) */ + s16 frameY; /* upper-left position of transferred frame (s10.2) */ + u16 frameH; /* height of transferred frame (u10.2) */ + + u64 *imagePtr; /* texture source address on DRAM */ + u16 imageLoad; /* which to use, LoadBlock or LoadTile */ + u8 imageFmt; /* format of texel - G_IM_FMT_* */ + u8 imageSiz; /* size of texel - G_IM_SIZ_* */ + u16 imagePal; /* pallet number */ + u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */ + + /* The following is set in the initialization routine guS2DInitBg(). There is no need for the user to set it. */ + u16 tmemW; /* TMEM width and Word size of frame 1 line. + At LoadBlock, GS_PIX2TMEM(imageW/4,imageSiz) + At LoadTile GS_PIX2TMEM(frameW/4,imageSiz)+1 */ + u16 tmemH; /* height of TMEM loadable at a time (s13.2) 4 times value + When the normal texture, 512/tmemW*4 + When the CI texture, 256/tmemW*4 */ + u16 tmemLoadSH; /* SH value + At LoadBlock, tmemSize/2-1 + At LoadTile, tmemW*16-1 */ + u16 tmemLoadTH; /* TH value or Stride value + At LoadBlock, GS_CALC_DXT(tmemW) + At LoadTile, tmemH-1 */ + u16 tmemSizeW; /* skip value of imagePtr for image 1-line + At LoadBlock, tmemW*2 + At LoadTile, GS_PIX2TMEM(imageW/4,imageSiz)*2 */ + u16 tmemSize; /* skip value of imagePtr for 1-loading + = tmemSizeW*tmemH */ +} uObjBg_t; /* 40 bytes */ + +/* Scalable background plane */ +typedef struct { + u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */ + u16 imageW; /* width of texture (u10.2) */ + s16 frameX; /* upper-left position of transferred frame (s10.2) */ + u16 frameW; /* width of transferred frame (u10.2) */ + + u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */ + u16 imageH; /* height of texture (u10.2) */ + s16 frameY; /* upper-left position of transferred frame (s10.2) */ + u16 frameH; /* height of transferred frame (u10.2) */ + + u64 *imagePtr; /* texture source address on DRAM */ + u16 imageLoad; /* Which to use, LoadBlock or LoadTile? */ + u8 imageFmt; /* format of texel - G_IM_FMT_* */ + u8 imageSiz; /* size of texel - G_IM_SIZ_* */ + u16 imagePal; /* pallet number */ + u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */ + + u16 scaleW; /* scale value of X-direction (u5.10) */ + u16 scaleH; /* scale value of Y-direction (u5.10) */ + s32 imageYorig; /* start point of drawing on image (s20.5) */ + + u8 padding[4]; + +} uObjScaleBg_t; /* 40 bytes */ + +typedef union { + uObjBg_t b; + uObjScaleBg_t s; + long long int force_structure_alignment; +} uObjBg; + +/*---------------------------------------------------------------------------* + * 2D Objects + *---------------------------------------------------------------------------*/ +#define G_OBJ_FLAG_FLIPS 1<<0 /* inversion to S-direction */ +#define G_OBJ_FLAG_FLIPT 1<<4 /* nversion to T-direction */ + +typedef struct { + s16 objX; /* s10.2 OBJ x-coordinate of upper-left end */ + u16 scaleW; /* u5.10 Scaling of u5.10 width direction */ + u16 imageW; /* u10.5 width of u10.5 texture (length of S-direction) */ + u16 paddingX; /* Unused - Always 0 */ + s16 objY; /* s10.2 OBJ y-coordinate of s10.2 OBJ upper-left end */ + u16 scaleH; /* u5.10 Scaling of u5.10 height direction */ + u16 imageH; /* u10.5 height of u10.5 texture (length of T-direction) */ + u16 paddingY; /* Unused - Always 0 */ + u16 imageStride; /* folding width of texel (In units of 64bit word) */ + u16 imageAdrs; /* texture header position in TMEM (In units of 64bit word) */ + u8 imageFmt; /* format of texel - G_IM_FMT_* */ + u8 imageSiz; /* size of texel - G_IM_SIZ_* */ + u8 imagePal; /* pallet number (0-7) */ + u8 imageFlags; /* The display flag - G_OBJ_FLAG_FLIP* */ +} uObjSprite_t; /* 24 bytes */ + +typedef union { + uObjSprite_t s; + long long int force_structure_alignment; +} uObjSprite; + +/*---------------------------------------------------------------------------* + * 2D Matrix + *---------------------------------------------------------------------------*/ +typedef struct { + s32 A, B, C, D; /* s15.16 */ + s16 X, Y; /* s10.2 */ + u16 BaseScaleX; /* u5.10 */ + u16 BaseScaleY; /* u5.10 */ +} uObjMtx_t; /* 24 bytes */ + +typedef union { + uObjMtx_t m; + long long int force_structure_alignment; +} uObjMtx; + +typedef struct { + s16 X, Y; /* s10.2 */ + u16 BaseScaleX; /* u5.10 */ + u16 BaseScaleY; /* u5.10 */ +} uObjSubMtx_t; /* 8 bytes */ + +typedef union { + uObjSubMtx_t m; + long long int force_structure_alignment; +} uObjSubMtx; + +/*---------------------------------------------------------------------------* + * Loading into TMEM + *---------------------------------------------------------------------------*/ +#define G_OBJLT_TXTRBLOCK 0x00001033 +#define G_OBJLT_TXTRTILE 0x00fc1034 +#define G_OBJLT_TLUT 0x00000030 + +#define GS_TB_TSIZE(pix,siz) (GS_PIX2TMEM((pix),(siz))-1) +#define GS_TB_TLINE(pix,siz) (GS_CALC_DXT(GS_PIX2TMEM((pix),(siz)))) + +typedef struct { + u32 type; /* G_OBJLT_TXTRBLOCK divided into types */ + u64 *image; /* texture source address on DRAM */ + u16 tmem; /* loaded TMEM word address (8byteWORD) */ + u16 tsize; /* Texture size, Specified by macro GS_TB_TSIZE() */ + u16 tline; /* width of Texture 1-line, Specified by macro GS_TB_TLINE() */ + u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrBlock_t; /* 24 bytes */ + +#define GS_TT_TWIDTH(pix,siz) ((GS_PIX2TMEM((pix), (siz))<<2)-1) +#define GS_TT_THEIGHT(pix,siz) (((pix)<<2)-1) + +typedef struct { + u32 type; /* G_OBJLT_TXTRTILE divided into types */ + u64 *image; /* texture source address on DRAM */ + u16 tmem; /* loaded TMEM word address (8byteWORD)*/ + u16 twidth; /* width of Texture (Specified by macro GS_TT_TWIDTH()) */ + u16 theight; /* height of Texture (Specified by macro GS_TT_THEIGHT()) */ + u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrTile_t; /* 24 bytes */ + +#define GS_PAL_HEAD(head) ((head)+256) +#define GS_PAL_NUM(num) ((num)-1) + +typedef struct { + u32 type; /* G_OBJLT_TLUT divided into types */ + u64 *image; /* texture source address on DRAM */ + u16 phead; /* pallet number of load header (Between 256 and 511) */ + u16 pnum; /* loading pallet number -1 */ + u16 zero; /* Assign 0 all the time */ + u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12)*/ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrTLUT_t; /* 24 bytes */ + +typedef union { + uObjTxtrBlock_t block; + uObjTxtrTile_t tile; + uObjTxtrTLUT_t tlut; + long long int force_structure_alignment; +} uObjTxtr; + +/*---------------------------------------------------------------------------* + * Loading into TMEM & 2D Objects + *---------------------------------------------------------------------------*/ +typedef struct { + uObjTxtr txtr; + uObjSprite sprite; +} uObjTxSprite; /* 48 bytes */ + +/*===========================================================================* + * GBI Commands for S2DEX microcode + *===========================================================================*/ +/* GBI Header */ +#ifdef F3DEX_GBI_2 +#define G_OBJ_RECTANGLE_R 0xda +#define G_OBJ_MOVEMEM 0xdc +#define G_RDPHALF_0 0xe4 +#define G_OBJ_RECTANGLE 0x01 +#define G_OBJ_SPRITE 0x02 +#define G_SELECT_DL 0x04 +#define G_OBJ_LOADTXTR 0x05 +#define G_OBJ_LDTX_SPRITE 0x06 +#define G_OBJ_LDTX_RECT 0x07 +#define G_OBJ_LDTX_RECT_R 0x08 +#define G_BG_1CYC 0x09 +#define G_BG_COPY 0x0a +#define G_OBJ_RENDERMODE 0x0b +#else +#define G_BG_1CYC 0x01 +#define G_BG_COPY 0x02 +#define G_OBJ_RECTANGLE 0x03 +#define G_OBJ_SPRITE 0x04 +#define G_OBJ_MOVEMEM 0x05 +#define G_SELECT_DL 0xb0 +#define G_OBJ_RENDERMODE 0xb1 +#define G_OBJ_RECTANGLE_R 0xb2 +#define G_OBJ_LOADTXTR 0xc1 +#define G_OBJ_LDTX_SPRITE 0xc2 +#define G_OBJ_LDTX_RECT 0xc3 +#define G_OBJ_LDTX_RECT_R 0xc4 +#define G_RDPHALF_0 0xe4 +#endif + +/*---------------------------------------------------------------------------* + * Background wrapped screen + *---------------------------------------------------------------------------*/ +#define gSPBgRectangle(pkt, m, mptr) gDma0p((pkt),(m),(mptr),0) +#define gsSPBgRectangle(m, mptr) gsDma0p( (m),(mptr),0) +#define gSPBgRectCopy(pkt, mptr) gSPBgRectangle((pkt), G_BG_COPY, (mptr)) +#define gsSPBgRectCopy(mptr) gsSPBgRectangle( G_BG_COPY, (mptr)) +#define gSPBgRect1Cyc(pkt, mptr) gSPBgRectangle((pkt), G_BG_1CYC, (mptr)) +#define gsSPBgRect1Cyc(mptr) gsSPBgRectangle( G_BG_1CYC, (mptr)) + +/*---------------------------------------------------------------------------* + * 2D Objects + *---------------------------------------------------------------------------*/ +#define gSPObjSprite(pkt, mptr) gDma0p((pkt),G_OBJ_SPRITE, (mptr),0) +#define gsSPObjSprite(mptr) gsDma0p( G_OBJ_SPRITE, (mptr),0) +#define gSPObjRectangle(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE, (mptr),0) +#define gsSPObjRectangle(mptr) gsDma0p( G_OBJ_RECTANGLE, (mptr),0) +#define gSPObjRectangleR(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE_R,(mptr),0) +#define gsSPObjRectangleR(mptr) gsDma0p( G_OBJ_RECTANGLE_R,(mptr),0) + +/*---------------------------------------------------------------------------* + * 2D Matrix + *---------------------------------------------------------------------------*/ +#define gSPObjMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),0,23) +#define gsSPObjMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),0,23) +#define gSPObjSubMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),2, 7) +#define gsSPObjSubMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),2, 7) + +/*---------------------------------------------------------------------------* + * Loading into TMEM + *---------------------------------------------------------------------------*/ +#define gSPObjLoadTxtr(pkt, tptr) gDma0p((pkt),G_OBJ_LOADTXTR, (tptr),23) +#define gsSPObjLoadTxtr(tptr) gsDma0p( G_OBJ_LOADTXTR, (tptr),23) +#define gSPObjLoadTxSprite(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_SPRITE,(tptr),47) +#define gsSPObjLoadTxSprite(tptr) gsDma0p( G_OBJ_LDTX_SPRITE,(tptr),47) +#define gSPObjLoadTxRect(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT, (tptr),47) +#define gsSPObjLoadTxRect(tptr) gsDma0p( G_OBJ_LDTX_RECT, (tptr),47) +#define gSPObjLoadTxRectR(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT_R,(tptr),47) +#define gsSPObjLoadTxRectR(tptr) gsDma0p( G_OBJ_LDTX_RECT_R,(tptr),47) + +/*---------------------------------------------------------------------------* + * Select Display List + *---------------------------------------------------------------------------*/ +#define gSPSelectDL(pkt, mptr, sid, flag, mask) \ +{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); } +#define gsSPSelectDL(mptr, sid, flag, mask) \ +{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); } +#define gSPSelectBranchDL(pkt, mptr, sid, flag, mask) \ +{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); } +#define gsSPSelectBranchDL(mptr, sid, flag, mask) \ +{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); } + +/*---------------------------------------------------------------------------* + * Set general status + *---------------------------------------------------------------------------*/ +#define G_MW_GENSTAT 0x08 /* Note that it is the same value of G_MW_FOG */ + +#define gSPSetStatus(pkt, sid, val) \ + gMoveWd((pkt), G_MW_GENSTAT, (sid), (val)) +#define gsSPSetStatus(sid, val) \ + gsMoveWd( G_MW_GENSTAT, (sid), (val)) + +/*---------------------------------------------------------------------------* + * Set Object Render Mode + *---------------------------------------------------------------------------*/ +#define G_OBJRM_NOTXCLAMP 0x01 +#define G_OBJRM_XLU 0x02 /* Ignored */ +#define G_OBJRM_ANTIALIAS 0x04 /* Ignored */ +#define G_OBJRM_BILERP 0x08 +#define G_OBJRM_SHRINKSIZE_1 0x10 +#define G_OBJRM_SHRINKSIZE_2 0x20 +#define G_OBJRM_WIDEN 0x40 + +#define gSPObjRenderMode(pkt, mode) gImmp1((pkt),G_OBJ_RENDERMODE,(mode)) +#define gsSPObjRenderMode(mode) gsImmp1( G_OBJ_RENDERMODE,(mode)) + +/*===========================================================================* + * Render Mode Macro + *===========================================================================*/ +#define RM_RA_SPRITE(clk) \ + AA_EN | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define G_RM_SPRITE G_RM_OPA_SURF +#define G_RM_SPRITE2 G_RM_OPA_SURF2 +#define G_RM_RA_SPRITE RM_RA_SPRITE(1) +#define G_RM_RA_SPRITE2 RM_RA_SPRITE(2) +#define G_RM_AA_SPRITE G_RM_AA_TEX_TERR +#define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2 +#define G_RM_XLU_SPRITE G_RM_XLU_SURF +#define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2 +#define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF +#define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2 + +/*===========================================================================* + * External functions + *===========================================================================*/ +extern u64 gspS2DEX_fifoTextStart[], gspS2DEX_fifoTextEnd[]; +extern u64 gspS2DEX_fifoDataStart[], gspS2DEX_fifoDataEnd[]; +extern u64 gspS2DEX_fifo_dTextStart[], gspS2DEX_fifo_dTextEnd[]; +extern u64 gspS2DEX_fifo_dDataStart[], gspS2DEX_fifo_dDataEnd[]; +extern u64 gspS2DEX2_fifoTextStart[], gspS2DEX2_fifoTextEnd[]; +extern u64 gspS2DEX2_fifoDataStart[], gspS2DEX2_fifoDataEnd[]; +extern u64 gspS2DEX2_xbusTextStart[], gspS2DEX2_xbusTextEnd[]; +extern u64 gspS2DEX2_xbusDataStart[], gspS2DEX2_xbusDataEnd[]; +extern void guS2DInitBg(uObjBg *); + +#ifdef F3DEX_GBI_2 +# define guS2DEmuBgRect1Cyc guS2D2EmuBgRect1Cyc /*Wrapper*/ +# define guS2DEmuSetScissor guS2D2EmuSetScissor /*Wrapper*/ + extern void guS2D2EmuSetScissor(u32, u32, u32, u32, u8); + extern void guS2D2EmuBgRect1Cyc(Gfx **, uObjBg *); +#else + extern void guS2DEmuSetScissor(u32, u32, u32, u32, u8); + extern void guS2DEmuBgRect1Cyc(Gfx **, uObjBg *); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /* _GS2DEX_H_ */ + +/*======== End of gs2dex.h ========*/ diff --git a/lib/ultralib/include/PR/gt.h b/lib/ultralib/include/PR/gt.h new file mode 100644 index 0000000..09b6ba2 --- /dev/null +++ b/lib/ultralib/include/PR/gt.h @@ -0,0 +1,365 @@ + +/* + * 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: gt.h + * Creator: hsa@sgi.com + * Create Date: Thu Oct 12 15:48:14 PDT 1995 + * + * This file defines the GBI for the TURBO 3D graphics microcode. + * The turbo microcode is a special FEATURE-LIMITED microcode designed + * for specific applications. It is not for general use. + * + * (see XXX for more information) + * + */ + +/************************************************************************** + * + * $Revision: 1.16 $ + * $Date: 1998/05/28 00:14:50 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gt.h,v $ + * + **************************************************************************/ + +#ifndef _GT_H_ +#define _GT_H_ + +/* this file should be #included AFTER gbi.h */ + +#include "sptask.h" + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif /* _LANGUAGE_C_PLUS_PLUS */ + +#include + +/* the following #defines seem out of order, but we need them + * for the microcode. + */ + +/* + * object state field: rendState + * + * This flag word is built up out of the bits from a + * subset of the G_SETGEOMETRYMODE flags from gbi.h. + * + * When each of these bits is '1', the comments below explain + * the effect on the triangles. + */ +#define GT_ZBUFFER G_ZBUFFER +#define GT_TEXTURE G_TEXTURE_ENABLE /* texture ON */ +#define GT_CULL_BACK G_CULL_BACK /* reject backfaces */ +#define GT_SHADING_SMOOTH G_SHADING_SMOOTH /* smooth shade ON */ + +/* + * object state field: textureState + * + * The lower 3 bits of this flag word contain the texture tile number + * to be used. All triangles of an object are rendered with the same + * texture tile. + */ + +/* + * object state field: flag + * + * This is a group of what would be pad bits. We use them for some + * flag bits. + */ +#define GT_FLAG_NOMTX 0x01 /* don't load the matrix */ +#define GT_FLAG_NO_XFM 0x02 /* load vtx, use verbatim */ +#define GT_FLAG_XFM_ONLY 0x04 /* xform vtx, write to *TriN */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* turbo 3D ucode: */ +extern long long int gspTurbo3DTextStart[], gspTurbo3DTextEnd[]; +extern long long int gspTurbo3DDataStart[], gspTurbo3DDataEnd[]; +extern long long int gspTurbo3D_dramTextStart[], gspTurbo3D_dramTextEnd[]; +extern long long int gspTurbo3D_dramDataStart[], gspTurbo3D_dramDataEnd[]; +extern long long int gspTurbo3D_fifoTextStart[], gspTurbo3D_fifoTextEnd[]; +extern long long int gspTurbo3D_fifoDataStart[], gspTurbo3D_fifoDataEnd[]; + +/* + * This is the global state structure. It's definition carefully + * matches the ucode, so if this structure changes, you must also change + * the ucode. + */ +typedef struct { + u16 perspNorm; /* persp normalization */ + u16 pad0; + u32 flag; + Gfx rdpOthermode; + u32 segBases[16]; /* table of segment base addrs (SEE NOTE!) */ + Vp viewport; /* the viewport to use */ + Gfx *rdpCmds; /* block of RDP data, process if !NULL + * block terminated by gDPEndDisplayList() + * (This is a segment address) + */ +} gtGlobState_t; + +/* NOTE: + * Although there are 16 segment table entries, the first one (segment 0) + * is reserved for physical memory mapping. You should not segment 0 + * to anything other than 0x0. + */ + +typedef union { + gtGlobState_t sp; + long long int force_structure_alignment; +} gtGlobState; + + +/* + * This is the 'state' structure associated with each object + * to be rendered. It's definition carefully matches the + * ucode, so if this structure changes, you must also change + * the gtoff.c tool and the ucode. + */ +typedef struct { + u32 renderState; /* render state */ + u32 textureState; /* texture state */ + u8 vtxCount; /* how many verts? */ + u8 vtxV0; /* where to load verts? */ + u8 triCount; /* how many tris? */ + u8 flag; + Gfx *rdpCmds; /* ptr (segment address) to RDP DL */ + Gfx rdpOthermode; + Mtx transform; /* the transform matrix to use */ +} gtState_t; + +typedef union { + gtState_t sp; + long long int force_structure_alignment; +} gtState; + +/* gtStateLite : same as gtState, but no matrix (see flags below) */ +/* this structure must be identical to gtState! (bad) */ +typedef struct { + u32 renderState; /* render state */ + u32 textureState; /* texture state */ + u8 vtxCount; /* how many verts? */ + u8 vtxV0; /* where to load verts? */ + u8 triCount; /* how many tris? */ + u8 flag; + Gfx *rdpCmds; /* ptr (segment address) to RDP DL */ + Gfx rdpOthermode; +} gtStateL_t; + +typedef union { + gtStateL_t sp; + long long int force_structure_alignment; +} gtStateL; + +/* + * The vertex list for the turbo display list uses the + * Vtx struct in gbi.h + * + */ + + +/* + * This structure represents a single triangle, part of the + * triangle list of the object to be rendered. + * + * NOTE: The triangle list MUST be aligned to an 8-byte boundary. + * Since this structure is only 4 bytes, we are REQUIRING that + * this structure only be used as an array of triangles, and we + * depend on the MIPS C compiler (which always aligns arrays to + * 8-byte boundaries). THIS IS DANGEROUS!!!! + * + */ +typedef struct { + u8 v0, v1, v2, flag; /* flag is which one for flat shade */ +} gtTriN; + + +/* + * This structure represents the transformed points. It is the format + * of the points written out when GT_FLAG_XFM_ONLY is set, as well as + * the format expected when GT_FLAG_NO_XFM is used. + * + * NOTE: The size and layout of these points is very similar to Vtx, + * except the screen coordinates overwrite the x,y,z,pad fields. + * (we could consider adding to the Vtx union, but we want to keep + * turbo stuff out of gbi.h) + * + * NOTE: The z is a special format. It can be used to compare vertices + * for sorting, but it should not be used for other purposes. If modified, + * the z-buffer hardware might not understand the data. + * + */ +typedef struct { + short int xscrn; /* x,y screen coordinates are SSSS10.2 */ + short int yscrn; + int zscrn; /* z screen is S15.16 */ + + short int s; /* transformed texture coord, S10.5 */ + short int t; + + u8 r; /* color (or normal) */ + u8 g; + u8 b; + u8 a; +} gtVtxOut_t; + +/* see "Data Structure" comment in gbi.h for information about why + * we use this union. + */ +typedef union { + gtVtxOut_t v; + long long int force_structure_alignment; +} gtVtxOut; + + + +/* + * state field: rdpOthermode + * + * This is one of the trickier state fields. The turbo interface + * requires the RDP othermode command to be cached by the host, + * therefore we provide a different interface in libultra to help cache + * this in the gt state (this word is just bits, you could pack them + * on your own). + * + * gtStateSetOthermode() accomplishs this, taking as arguments + * the state, one of the following mode enums, and a piece of data + * (othermode parameters from gbi.h). + * + * By definition, the othermode word from the gt state structure is sent + * to the RDP *before* any RDP commands from the rdpCmds[] field. The + * othermode is *always* sent. + * + * Stated another way, NONE of the gbi RDP othermode commands equivalent + * to those listed here are allowed in the rdpCmd[] field of the + * gt state structure. + * + * Notice also that many of these commands do not make sense for + * the turbo ucode (they control features not supported, like mip-mapping). + * They are only included here for completeness. + * + */ +typedef enum { + GT_CLEAR, /* special gt mode, clears othermode state */ + GT_ALPHACOMPARE, + GT_ZSRCSEL, + GT_RENDERMODE, + GT_ALPHADITHER, + GT_RGBDITHER, + GT_COMBKEY, + GT_TEXTCONV, + GT_TEXTFILT, + GT_TEXTLUT, + GT_TEXTLOD, + GT_TEXTDETAIL, + GT_TEXTPERSP, + GT_CYCLETYPE, + GT_PIPELINE +} gtStateOthermode_t; + +/* + * This call builds up an othermode command word. The 'mode' is one of + * the above modes, the 'data' field comes from gbi.h, it is the data + * field for the equivalent gbi setothermode macro. + */ +extern void gtStateSetOthermode(Gfx *om, gtStateOthermode_t mode, int data); + +/* + * This call dumps a turbo display list for use with gbi2mem and RSPSIM + */ +#define GT_DUMPTURBO_HANGAFTER 64 +#define GT_DUMPTURBO_NOTEXTURES 128 +extern void gtDumpTurbo(OSTask *tp,u8 flags); + +/* + * Special macros to init othermode words to all 0's, a good default + * value. + */ +#define gDPClearOtherMode(pkt) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE, 24, 8); \ + _g->words.w1 = 0x0; \ +} + +#define gsDPClearOtherMode() \ +{ \ + _SHIFTL(G_RDPSETOTHERMODE, 24, 8), 0x0 \ +} + +/* + * Special macros to end DP blocks (see above). These commands + * generate all 0's, which the turbo ucode looks for. They *aren't* + * real DP commands! + */ +#define gDPEndDisplayList(pkt) gSPNoOp(pkt) +#define gsDPEndDisplayList() gsSPNoOp() + +/* + * This structure is a turbo 'object', the turbo display list is + * simply a list of these. + * + * NOTE: All pointers are segment addresses + * + * NOTE: If (statep->flag & GT_FLAG_XFM_ONLY), the trip field is + * interpreted as a pointer to gtVtxOut[] that can be used to store + * the transformed points. (statep->triCount should be 0, else bad + * things could happen...) + * + * NOTE: If (statep->flag & GT_FLAG_NO_XFM), the vtxp field is + * interpreted as a pointer to gtVtxOut[] that can be used to load + * pre-transformed points. + * + */ +typedef struct { + gtGlobState *gstatep; /* global state, usually NULL */ + gtState *statep; /* if this is NULL, end object processing */ + Vtx *vtxp; /* if this is NULL, use points in buffer */ + gtTriN *trip; /* if this is NULL, use tris in buffer */ +} gtGfx_t; + +typedef union { + gtGfx_t obj; + long long int force_structure_alignment; +} gtGfx; + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_ASSEMBLY +#include +#endif /* _LANGUAGE_ASSEMBLY */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif /* _LANGUAGE_C_PLUS_PLUS */ + +#ifdef _LANGUAGE_MAKEROM +#endif /* _LANGUAGE_MAKEROM */ + +#endif /* _GT_H_ */ diff --git a/lib/ultralib/include/PR/gu.h b/lib/ultralib/include/PR/gu.h new file mode 100644 index 0000000..9a2fa2b --- /dev/null +++ b/lib/ultralib/include/PR/gu.h @@ -0,0 +1,270 @@ +#ifndef _GU_H_ +#define _GU_H_ + +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.48 $ + * $Date: 1999/07/13 08:00:20 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gu.h,v $ + * + **************************************************************************/ + +#include +#include +#include +#include + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +#define M_PI 3.14159265358979323846 +#define M_DTOR (3.14159265358979323846/180.0) + +#define FTOFIX32(x) (long)((x) * (float)0x00010000) +#define FIX32TOF(x) ((float)(x) * (1.0f / (float)0x00010000)) +#define FTOFRAC8(x) ((int) MIN(((x) * (128.0f)), 127.0f) & 0xff) + +#define FILTER_WRAP 0 +#define FILTER_CLAMP 1 + +#define RAND(x) (guRandom()%x) /* random number between 0 to x */ + +/* + * Data Structures + */ +typedef struct { + unsigned char *base; + int fmt, siz; + int xsize, ysize; + int lsize; + /* current tile info */ + int addr; + int w, h; + int s, t; +} Image; + +typedef struct { + float col[3]; + float pos[3]; + float a1, a2; /* actual color = col/(a1*dist + a2) */ +} PositionalLight; + + +/* + * Function Prototypes + */ + +extern int guLoadTextureBlockMipMap(Gfx **glist, unsigned char *tbuf, Image *im, + unsigned char startTile, unsigned char pal, unsigned char cms, + unsigned char cmt, unsigned char masks, unsigned char maskt, + unsigned char shifts, unsigned char shiftt, unsigned char cfs, + unsigned char cft); + +extern int guGetDPLoadTextureTileSz (int ult, int lrt); +extern void guDPLoadTextureTile (Gfx *glistp, void *timg, + int texl_fmt, int texl_size, + int img_width, int img_height, + int uls, int ult, int lrs, int lrt, + int palette, + int cms, int cmt, + int masks, int maskt, + int shifts, int shiftt); + + +/* + * matrix operations: + * + * The 'F' version is floating point, in case the application wants + * to do matrix manipulations and convert to fixed-point at the last + * minute. + */ +extern void guMtxIdent(Mtx *m); +extern void guMtxIdentF(float mf[4][4]); +extern void guOrtho(Mtx *m, float l, float r, float b, float t, + float n, float f, float scale); +extern void guOrthoF(float mf[4][4], float l, float r, float b, float t, + float n, float f, float scale); +extern void guFrustum(Mtx *m, float l, float r, float b, float t, + float n, float f, float scale); +extern void guFrustumF(float mf[4][4], float l, float r, float b, float t, + float n, float f, float scale); +extern void guPerspective(Mtx *m, u16 *perspNorm, float fovy, + float aspect, float near, float far, float scale); +extern void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, + float aspect, float near, float far, float scale); +extern void guLookAt(Mtx *m, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtF(float mf[4][4], float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtReflect(Mtx *m, LookAt *l, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtReflectF(float mf[4][4], LookAt *l, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtHilite(Mtx *m, LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float xl1, float yl1, float zl1, + float xl2, float yl2, float zl2, + int twidth, int theight); +extern void guLookAtHiliteF(float mf[4][4], LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float xl1, float yl1, float zl1, + float xl2, float yl2, float zl2, + int twidth, int theight); +extern void guLookAtStereo(Mtx *m, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float eyedist); +extern void guLookAtStereoF(float mf[4][4], + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float eyedist); +extern void guRotate(Mtx *m, float a, float x, float y, float z); +extern void guRotateF(float mf[4][4], float a, float x, float y, float z); +extern void guRotateRPY(Mtx *m, float r, float p, float y); +extern void guRotateRPYF(float mf[4][4], float r, float p, float h); +extern void guAlign(Mtx *m, float a, float x, float y, float z); +extern void guAlignF(float mf[4][4], float a, float x, float y, float z); +extern void guScale(Mtx *m, float x, float y, float z); +extern void guScaleF(float mf[4][4], float x, float y, float z); +extern void guTranslate(Mtx *m, float x, float y, float z); +extern void guTranslateF(float mf[4][4], float x, float y, float z); +extern void guPosition(Mtx *m, float r, float p, float h, float s, + float x, float y, float z); +extern void guPositionF(float mf[4][4], float r, float p, float h, float s, + float x, float y, float z); +extern void guMtxF2L(float mf[4][4], Mtx *m); +extern void guMtxL2F(float mf[4][4], Mtx *m); +extern void guMtxCatF(float m[4][4], float n[4][4], float r[4][4]); +extern void guMtxCatL(Mtx *m, Mtx *n, Mtx *res); +extern void guMtxXFMF(float mf[4][4], float x, float y, float z, + float *ox, float *oy, float *oz); +extern void guMtxXFML(Mtx *m, float x, float y, float z, + float *ox, float *oy, float *oz); + +/* vector utility: */ +extern void guNormalize(float *x, float *y, float *z); + +/* light utilities: */ +void guPosLight(PositionalLight *pl, Light *l, + float xOb, float yOb, float zOb); +void guPosLightHilite(PositionalLight *pl1, PositionalLight *pl2, + Light *l1, Light *l2, + LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xOb, float yOb, float zOb, + float xUp, float yUp, float zUp, + int twidth, int theight); +extern int guRandom(void); + +/* + * Math functions + */ +extern float sinf(float angle); +extern float cosf(float angle); +extern signed short sins (unsigned short angle); +extern signed short coss (unsigned short angle); +extern float sqrtf(float value); +#if defined(__sgi) && BUILD_VERSION >= VERSION_K +#pragma intrinsic(sqrtf); +#endif + +/* + * Dump routines for low-level display lists + */ +/* flag values for guParseRdpDL() */ +#define GU_PARSERDP_VERBOSE 1 +#define GU_PARSERDP_PRAREA 2 +#define GU_PARSERDP_PRHISTO 4 +#define GU_PARSERDP_DUMPONLY 32 /* doesn't need to be same as */ + /* GU_PARSEGBI_DUMPOLNY, but this */ + /* allows app to use interchangeably */ + +extern void guParseRdpDL(u64 *rdp_dl, u64 nbytes, u8 flags); +extern void guParseString(char *StringPointer, u64 nbytes); + +/* + * NO LONGER SUPPORTED, + * use guParseRdpDL with GU_PARSERDP_DUMPONLY flags + */ +/* extern void guDumpRawRdpDL(u64 *rdp_dl, u64 nbytes); */ + +/* flag values for guBlinkRdpDL() */ +#define GU_BLINKRDP_HILITE 1 +#define GU_BLINKRDP_EXTRACT 2 + +extern void +guBlinkRdpDL(u64 *rdp_dl_in, u64 nbytes_in, + u64 *rdp_dl_out, u64 *nbytes_out, + u32 x, u32 y, u32 radius, + u8 red, u8 green, u8 blue, + u8 flags); + +/* flag values for guParseGbiDL() */ +#define GU_PARSEGBI_ROWMAJOR 1 +#define GU_PARSEGBI_NONEST 2 +#define GU_PARSEGBI_FLTMTX 4 +#define GU_PARSEGBI_SHOWDMA 8 +#define GU_PARSEGBI_ALLMTX 16 +#define GU_PARSEGBI_DUMPONLY 32 +/* +#define GU_PARSEGBI_HANGAFTER 64 +#define GU_PARSEGBI_NOTEXTURES 128 +*/ +extern void guParseGbiDL(u64 *gbi_dl, u32 nbytes, u8 flags); +extern void guDumpGbiDL(OSTask *tp,u8 flags); + +#define GU_PARSE_GBI_TYPE 1 +#define GU_PARSE_RDP_TYPE 2 +#define GU_PARSE_READY 3 +#define GU_PARSE_MEM_BLOCK 4 +#define GU_PARSE_ABI_TYPE 5 +#define GU_PARSE_STRING_TYPE 6 + +typedef struct { + int dataSize; + int dlType; + int flags; + u32 paddr; +} guDLPrintCB; + +void guSprite2DInit(uSprite *SpritePointer, + void *SourceImagePointer, + void *TlutPointer, + int Stride, + int SubImageWidth, + int SubImageHeight, + int SourceImageType, + int SourceImageBitSize, + int SourceImageOffsetS, + int SourceImageOffsetT); + +#endif /* !_GU_H_ */ diff --git a/include/PR/leo.h b/lib/ultralib/include/PR/leo.h similarity index 100% rename from include/PR/leo.h rename to lib/ultralib/include/PR/leo.h diff --git a/include/PR/leoappli.h b/lib/ultralib/include/PR/leoappli.h similarity index 100% rename from include/PR/leoappli.h rename to lib/ultralib/include/PR/leoappli.h diff --git a/lib/ultralib/include/PR/libaudio.h b/lib/ultralib/include/PR/libaudio.h new file mode 100644 index 0000000..33017b7 --- /dev/null +++ b/lib/ultralib/include/PR/libaudio.h @@ -0,0 +1,947 @@ +/*==================================================================== + * libaudio.h + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.173 $ + * $Date: 1997/12/01 12:42:21 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/libaudio.h,v $ + * + **************************************************************************/ + +#ifndef __LIB_AUDIO__ +#define __LIB_AUDIO__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +/*********************************************************************** + * misc defines + ***********************************************************************/ +#ifndef _EMULATOR +# ifdef AUD_PROFILE + +#define PROFILE_AUD(num, cnt, max, min) \ +{ \ + u32 currCnt = osGetCount(); \ + currCnt -= lastCnt[cnt_index]; \ + cnt_index--; \ + cnt += currCnt; \ + num++; \ + \ + if ( currCnt > max ) max = currCnt; \ + if ( currCnt < min ) min = currCnt; \ +} + +# endif /* AUD_PROFILE */ +#endif /* EMULATOR */ + +#ifndef NULL +#define NULL 0 +#endif + +#define AL_FX_BUFFER_SIZE 8192 +#define AL_FRAME_INIT -1 +#define AL_USEC_PER_FRAME 16000 +#define AL_MAX_PRIORITY 127 +#define AL_GAIN_CHANGE_TIME 1000 + +typedef s32 ALMicroTime; +typedef u8 ALPan; + +#define AL_PAN_CENTER 64 +#define AL_PAN_LEFT 0 +#define AL_PAN_RIGHT 127 +#define AL_VOL_FULL 127 +#define AL_KEY_MIN 0 +#define AL_KEY_MAX 127 +#define AL_DEFAULT_FXMIX 0 +#define AL_SUSTAIN 63 + +/*********************************************************************** + * Error handling + ***********************************************************************/ + +#ifdef _DEBUG +#define ALFailIf(condition, error) \ + if (condition) { \ + __osError(error, 0); \ + return; } + +#else +#define ALFailIf(condition, error) \ + if (condition) { \ + return; } +#endif + +#ifdef _DEBUG +#define ALFlagFailIf(condition, flag, error) \ + if (condition) { \ + if(flag) __osError(error, 0); \ + return; } + +#else +#define ALFlagFailIf(condition, flag, error) \ + if (condition) { \ + return; } +#endif + +/*********************************************************************** + * Audio Library global routines + ***********************************************************************/ +typedef struct ALLink_s { + struct ALLink_s *next; + struct ALLink_s *prev; +} ALLink; + +void alUnlink(ALLink *element); +void alLink(ALLink *element, ALLink *after); + +typedef s32 (*ALDMAproc)(s32 addr, s32 len, void *state); +typedef ALDMAproc (*ALDMANew)(void *state); + +void alCopy(void *src, void *dest, s32 len); + +typedef struct { + u8 *base; + u8 *cur; + s32 len; + s32 count; +} ALHeap; + +#define AL_HEAP_DEBUG 1 +#define AL_HEAP_MAGIC 0x20736a73 +#define AL_HEAP_INIT 0 + +void alHeapInit(ALHeap *hp, u8 *base, s32 len); +void *alHeapDBAlloc(u8 *file, s32 line, ALHeap *hp, s32 num, s32 size); +s32 alHeapCheck(ALHeap *hp); + +#ifdef _DEBUG +#define alHeapAlloc(hp, elem ,size) alHeapDBAlloc((u8 *) __FILE__,__LINE__,(hp),(elem),(size)) +#else +#define alHeapAlloc(hp, elem ,size) alHeapDBAlloc(0, 0,(hp),(elem),(size)) +#endif + +/*********************************************************************** + * FX Stuff + ***********************************************************************/ +#define AL_FX_NONE 0 +#define AL_FX_SMALLROOM 1 +#define AL_FX_BIGROOM 2 +#define AL_FX_CHORUS 3 +#define AL_FX_FLANGE 4 +#define AL_FX_ECHO 5 +#define AL_FX_CUSTOM 6 + +typedef u8 ALFxId; +typedef void *ALFxRef; + +/*********************************************************************** + * data structures for sound banks + ***********************************************************************/ + +#define AL_BANK_VERSION 0x4231 /* 'B1' */ + +/* Possible wavetable types */ +enum {AL_ADPCM_WAVE = 0, + AL_RAW16_WAVE}; + +typedef struct { + s32 order; + s32 npredictors; + s16 book[1]; /* Actually variable size. Must be 8-byte aligned */ +} ALADPCMBook; + +typedef struct { + u32 start; + u32 end; + u32 count; + ADPCM_STATE state; +} ALADPCMloop; + +typedef struct { + u32 start; + u32 end; + u32 count; +} ALRawLoop; + +typedef struct { + ALMicroTime attackTime; + ALMicroTime decayTime; + ALMicroTime releaseTime; + u8 attackVolume; + u8 decayVolume; +} ALEnvelope; + +typedef struct { + u8 velocityMin; + u8 velocityMax; + u8 keyMin; + u8 keyMax; + u8 keyBase; + s8 detune; +} ALKeyMap; + +typedef struct { + ALADPCMloop *loop; + ALADPCMBook *book; +} ALADPCMWaveInfo; + +typedef struct { + ALRawLoop *loop; +} ALRAWWaveInfo; + +typedef struct ALWaveTable_s { + u8 *base; /* ptr to start of wave data */ + s32 len; /* length of data in bytes */ + u8 type; /* compression type */ + u8 flags; /* offset/address flags */ + union { + ALADPCMWaveInfo adpcmWave; + ALRAWWaveInfo rawWave; + } waveInfo; +} ALWaveTable; + +typedef struct ALSound_s { + ALEnvelope *envelope; + ALKeyMap *keyMap; + ALWaveTable *wavetable; /* offset to wavetable struct */ + ALPan samplePan; + u8 sampleVolume; + u8 flags; +} ALSound; + +typedef struct { + u8 volume; /* overall volume for this instrument */ + ALPan pan; /* 0 = hard left, 127 = hard right */ + u8 priority; /* voice priority for this instrument */ + u8 flags; + u8 tremType; /* the type of tremelo osc. to use */ + u8 tremRate; /* the rate of the tremelo osc. */ + u8 tremDepth; /* the depth of the tremelo osc */ + u8 tremDelay; /* the delay for the tremelo osc */ + u8 vibType; /* the type of tremelo osc. to use */ + u8 vibRate; /* the rate of the tremelo osc. */ + u8 vibDepth; /* the depth of the tremelo osc */ + u8 vibDelay; /* the delay for the tremelo osc */ + s16 bendRange; /* pitch bend range in cents */ + s16 soundCount; /* number of sounds in this array */ + ALSound *soundArray[1]; +} ALInstrument; + +typedef struct ALBank_s { + s16 instCount; /* number of programs in this bank */ + u8 flags; + u8 pad; + s32 sampleRate; /* e.g. 44100, 22050, etc... */ + ALInstrument *percussion; /* default percussion for GM */ + ALInstrument *instArray[1]; /* ARRAY of instruments */ +} ALBank; + +typedef struct { /* Note: sizeof won't be correct */ + s16 revision; /* format revision of this file */ + s16 bankCount; /* number of banks */ + ALBank *bankArray[1]; /* ARRAY of bank offsets */ +} ALBankFile; + +void alBnkfNew(ALBankFile *f, u8 *table); + +/*********************************************************************** + * Sequence Files + ***********************************************************************/ +#define AL_SEQBANK_VERSION 'S1' + +typedef struct { + u8 *offset; + s32 len; +} ALSeqData; + +typedef struct { /* Note: sizeof won't be correct */ + s16 revision; /* format revision of this file */ + s16 seqCount; /* number of sequences */ + ALSeqData seqArray[1]; /* ARRAY of sequence info */ +} ALSeqFile; + +void alSeqFileNew(ALSeqFile *f, u8 *base); + +/*********************************************************************** + * Synthesis driver stuff + ***********************************************************************/ +typedef ALMicroTime (*ALVoiceHandler)(void *); + +typedef struct { + s32 maxVVoices; /* obsolete */ + s32 maxPVoices; + s32 maxUpdates; + s32 maxFXbusses; + void *dmaproc; + ALHeap *heap; + s32 outputRate; /* output sample rate */ + ALFxId fxType; + s32 *params; +} ALSynConfig; + +typedef struct ALPlayer_s { + struct ALPlayer_s *next; + void *clientData; /* storage for client callback */ + ALVoiceHandler handler; /* voice handler for player */ + ALMicroTime callTime; /* usec requested callback */ + s32 samplesLeft; /* usec remaining to callback */ +} ALPlayer; + +typedef struct ALVoice_s { + ALLink node; + struct PVoice_s *pvoice; + ALWaveTable *table; + void *clientPrivate; + s16 state; + s16 priority; + s16 fxBus; + s16 unityPitch; +} ALVoice; + +typedef struct ALVoiceConfig_s { + s16 priority; /* voice priority */ + s16 fxBus; /* bus assignment */ + u8 unityPitch; /* unity pitch flag */ +} ALVoiceConfig; + +typedef struct { + ALPlayer *head; /* client list head */ + ALLink pFreeList; /* list of free physical voices */ + ALLink pAllocList; /* list of allocated physical voices */ + ALLink pLameList; /* list of voices ready to be freed */ + s32 paramSamples; + s32 curSamples; /* samples from start of game */ + ALDMANew dma; + ALHeap *heap; + + struct ALParam_s *paramList; + + struct ALMainBus_s *mainBus; + struct ALAuxBus_s *auxBus; /* ptr to array of aux bus structs */ + struct ALFilter_s *outputFilter; /* last filter in the filter chain */ + + s32 numPVoices; + s32 maxAuxBusses; + s32 outputRate; /* output sample rate */ + s32 maxOutSamples; /* Maximum samples rsp can generate + at one time at output rate */ +} ALSynth; + +void alSynNew(ALSynth *s, ALSynConfig *config); +void alSynDelete(ALSynth *s); + +void alSynAddPlayer(ALSynth *s, ALPlayer *client); +void alSynRemovePlayer(ALSynth *s, ALPlayer *client); + +s32 alSynAllocVoice(ALSynth *s, ALVoice *v, ALVoiceConfig *vc); +void alSynFreeVoice(ALSynth *s, ALVoice *voice); + +void alSynStartVoice(ALSynth *s, ALVoice *voice, ALWaveTable *w); +void alSynStartVoiceParams(ALSynth *s, ALVoice *voice, ALWaveTable *w, + f32 pitch, s16 vol, ALPan pan, u8 fxmix, + ALMicroTime t); +void alSynStopVoice(ALSynth *s, ALVoice *voice); + +void alSynSetVol(ALSynth *s, ALVoice *v, s16 vol, ALMicroTime delta); +void alSynSetPitch(ALSynth *s, ALVoice *voice, f32 ratio); +void alSynSetPan(ALSynth *s, ALVoice *voice, ALPan pan); +void alSynSetFXMix(ALSynth *s, ALVoice *voice, u8 fxmix); +void alSynSetPriority(ALSynth *s, ALVoice *voice, s16 priority); +s16 alSynGetPriority(ALSynth *s, ALVoice *voice); + +ALFxRef *alSynAllocFX(ALSynth *s, s16 bus, ALSynConfig *c, ALHeap *hp); +ALFxRef alSynGetFXRef(ALSynth *s, s16 bus, s16 index); +void alSynFreeFX(ALSynth *s, ALFxRef *fx); +void alSynSetFXParam(ALSynth *s, ALFxRef fx, s16 paramID, void *param); + +/*********************************************************************** + * Audio Library (AL) stuff + ***********************************************************************/ +typedef struct { + ALSynth drvr; +} ALGlobals; + +extern ALGlobals *alGlobals; + +void alInit(ALGlobals *glob, ALSynConfig *c); +void alClose(ALGlobals *glob); + +Acmd *alAudioFrame(Acmd *cmdList, s32 *cmdLen, s16 *outBuf, s32 outLen); + +/*********************************************************************** + * Sequence Player stuff + ***********************************************************************/ + +/* + * Play states + */ +#define AL_STOPPED 0 +#define AL_PLAYING 1 +#define AL_STOPPING 2 + +#define AL_DEFAULT_PRIORITY 5 +#define AL_DEFAULT_VOICE 0 +#define AL_MAX_CHANNELS 16 + +/* + * Audio Library event type definitions + */ +enum ALMsg { + AL_SEQ_REF_EVT, /* Reference to a pending event in the sequence. */ + AL_SEQ_MIDI_EVT, + AL_SEQP_MIDI_EVT, + AL_TEMPO_EVT, + AL_SEQ_END_EVT, + AL_NOTE_END_EVT, + AL_SEQP_ENV_EVT, + AL_SEQP_META_EVT, + AL_SEQP_PROG_EVT, + AL_SEQP_API_EVT, + AL_SEQP_VOL_EVT, + AL_SEQP_LOOP_EVT, + AL_SEQP_PRIORITY_EVT, + AL_SEQP_SEQ_EVT, + AL_SEQP_BANK_EVT, + AL_SEQP_PLAY_EVT, + AL_SEQP_STOP_EVT, + AL_SEQP_STOPPING_EVT, + AL_TRACK_END, + AL_CSP_LOOPSTART, + AL_CSP_LOOPEND, + AL_CSP_NOTEOFF_EVT, + AL_TREM_OSC_EVT, + AL_VIB_OSC_EVT +}; + +/* + * Midi event definitions + */ +#define AL_EVTQ_END 0x7fffffff + +enum AL_MIDIstatus { + /* For distinguishing channel number from status */ + AL_MIDI_ChannelMask = 0x0F, + AL_MIDI_StatusMask = 0xF0, + + /* Channel voice messages */ + AL_MIDI_ChannelVoice = 0x80, + AL_MIDI_NoteOff = 0x80, + AL_MIDI_NoteOn = 0x90, + AL_MIDI_PolyKeyPressure = 0xA0, + AL_MIDI_ControlChange = 0xB0, + AL_MIDI_ChannelModeSelect = 0xB0, + AL_MIDI_ProgramChange = 0xC0, + AL_MIDI_ChannelPressure = 0xD0, + AL_MIDI_PitchBendChange = 0xE0, + + /* System messages */ + AL_MIDI_SysEx = 0xF0, /* System Exclusive */ + + /* System common */ + AL_MIDI_SystemCommon = 0xF1, + AL_MIDI_TimeCodeQuarterFrame = 0xF1, + AL_MIDI_SongPositionPointer = 0xF2, + AL_MIDI_SongSelect = 0xF3, + AL_MIDI_Undefined1 = 0xF4, + AL_MIDI_Undefined2 = 0xF5, + AL_MIDI_TuneRequest = 0xF6, + AL_MIDI_EOX = 0xF7, /* End of System Exclusive */ + + /* System real time */ + AL_MIDI_SystemRealTime = 0xF8, + AL_MIDI_TimingClock = 0xF8, + AL_MIDI_Undefined3 = 0xF9, + AL_MIDI_Start = 0xFA, + AL_MIDI_Continue = 0xFB, + AL_MIDI_Stop = 0xFC, + AL_MIDI_Undefined4 = 0xFD, + AL_MIDI_ActiveSensing = 0xFE, + AL_MIDI_SystemReset = 0xFF, + AL_MIDI_Meta = 0xFF /* MIDI Files only */ +}; + +enum AL_MIDIctrl { + AL_MIDI_VOLUME_CTRL = 0x07, + AL_MIDI_PAN_CTRL = 0x0A, + AL_MIDI_PRIORITY_CTRL = 0x10, /* use general purpose controller for priority */ + AL_MIDI_FX_CTRL_0 = 0x14, + AL_MIDI_FX_CTRL_1 = 0x15, + AL_MIDI_FX_CTRL_2 = 0x16, + AL_MIDI_FX_CTRL_3 = 0x17, + AL_MIDI_FX_CTRL_4 = 0x18, + AL_MIDI_FX_CTRL_5 = 0x19, + AL_MIDI_FX_CTRL_6 = 0x1A, + AL_MIDI_FX_CTRL_7 = 0x1B, + AL_MIDI_FX_CTRL_8 = 0x1C, + AL_MIDI_FX_CTRL_9 = 0x1D, + AL_MIDI_SUSTAIN_CTRL = 0x40, + AL_MIDI_FX1_CTRL = 0x5B, + AL_MIDI_FX3_CTRL = 0x5D +}; + +enum AL_MIDImeta { + AL_MIDI_META_TEMPO = 0x51, + AL_MIDI_META_EOT = 0x2f +}; + + +#define AL_CMIDI_BLOCK_CODE 0xFE +#define AL_CMIDI_LOOPSTART_CODE 0x2E +#define AL_CMIDI_LOOPEND_CODE 0x2D +#define AL_CMIDI_CNTRL_LOOPSTART 102 +#define AL_CMIDI_CNTRL_LOOPEND 103 +#define AL_CMIDI_CNTRL_LOOPCOUNT_SM 104 +#define AL_CMIDI_CNTRL_LOOPCOUNT_BIG 105 + +typedef struct { + u8 *curPtr; /* ptr to the next event */ + s32 lastTicks; /* sequence clock ticks (used by alSeqSetLoc) */ + s32 curTicks; /* sequence clock ticks of next event (used by loop end test) */ + s16 lastStatus; /* the last status msg */ +} ALSeqMarker; + +typedef struct { + s32 ticks; /* MIDI, Tempo and End events must start with ticks */ + u8 status; + u8 byte1; + u8 byte2; + u32 duration; +} ALMIDIEvent; + +typedef struct { + s32 ticks; + u8 status; + u8 type; + u8 len; + u8 byte1; + u8 byte2; + u8 byte3; +} ALTempoEvent; + +typedef struct { + s32 ticks; + u8 status; + u8 type; + u8 len; +} ALEndEvent; + +typedef struct { + struct ALVoice_s *voice; +} ALNoteEvent; + +typedef struct { + struct ALVoice_s *voice; + ALMicroTime delta; + u8 vol; +} ALVolumeEvent; + +typedef struct { + s16 vol; +} ALSeqpVolEvent; + +typedef struct { + ALSeqMarker *start; + ALSeqMarker *end; + s32 count; +} ALSeqpLoopEvent; + +typedef struct { + u8 chan; + u8 priority; +} ALSeqpPriorityEvent; + +typedef struct { + void *seq; /* pointer to a seq (could be an ALSeq or an ALCSeq). */ +} ALSeqpSeqEvent; + +typedef struct { + ALBank *bank; +} ALSeqpBankEvent; + +typedef struct { + struct ALVoiceState_s *vs; + void *oscState; + u8 chan; +} ALOscEvent; + +typedef struct { + s16 type; + union { + ALMIDIEvent midi; + ALTempoEvent tempo; + ALEndEvent end; + ALNoteEvent note; + ALVolumeEvent vol; + ALSeqpLoopEvent loop; + ALSeqpVolEvent spvol; + ALSeqpPriorityEvent sppriority; + ALSeqpSeqEvent spseq; + ALSeqpBankEvent spbank; + ALOscEvent osc; + } msg; +} ALEvent; + +typedef struct { + ALLink node; + ALMicroTime delta; + ALEvent evt; +} ALEventListItem; + +typedef struct { + ALLink freeList; + ALLink allocList; + s32 eventCount; +} ALEventQueue; + +void alEvtqNew(ALEventQueue *evtq, ALEventListItem *items, + s32 itemCount); +ALMicroTime alEvtqNextEvent(ALEventQueue *evtq, ALEvent *evt); +void alEvtqPostEvent(ALEventQueue *evtq, ALEvent *evt, + ALMicroTime delta); +void alEvtqFlush(ALEventQueue *evtq); +void alEvtqFlushType(ALEventQueue *evtq, s16 type); + + +#define AL_PHASE_ATTACK 0 +#define AL_PHASE_NOTEON 0 +#define AL_PHASE_DECAY 1 +#define AL_PHASE_SUSTAIN 2 +#define AL_PHASE_RELEASE 3 +#define AL_PHASE_SUSTREL 4 + +typedef struct ALVoiceState_s { + struct ALVoiceState_s *next;/* MUST be first */ + ALVoice voice; + ALSound *sound; + ALMicroTime envEndTime; /* time of envelope segment end */ + f32 pitch; /* currect pitch ratio */ + f32 vibrato; /* current value of the vibrato */ + u8 envGain; /* current envelope gain */ + u8 channel; /* channel assignment */ + u8 key; /* note on key number */ + u8 velocity; /* note on velocity */ + u8 envPhase; /* what envelope phase */ + u8 phase; + u8 tremelo; /* current value of the tremelo */ + u8 flags; /* bit 0 tremelo flag + bit 1 vibrato flag */ +} ALVoiceState; + +typedef struct { + ALInstrument *instrument; /* instrument assigned to this chan */ + s16 bendRange; /* pitch bend range in cents */ + ALFxId fxId; /* type of fx assigned to this chan */ + ALPan pan; /* overall pan for this chan */ + u8 priority; /* priority for this chan */ + u8 vol; /* current volume for this chan */ + u8 fxmix; /* current fx mix for this chan */ + u8 sustain; /* current sustain pedal state */ + f32 pitchBend; /* current pitch bend val in cents */ +} ALChanState; + +typedef struct ALSeq_s { + u8 *base; /* ptr to start of sequence file */ + u8 *trackStart; /* ptr to first MIDI event */ + u8 *curPtr; /* ptr to next event to read */ + s32 lastTicks; /* MIDI ticks for last event */ + s32 len; /* length of sequence in bytes */ + f32 qnpt; /* qrter notes / tick (1/division) */ + s16 division; /* ticks per quarter note */ + s16 lastStatus; /* for running status */ +} ALSeq; + +typedef struct { + u32 trackOffset[16]; + u32 division; +} ALCMidiHdr; + +typedef struct ALCSeq_s { + ALCMidiHdr *base; /* ptr to start of sequence file */ + u32 validTracks; /* set of flags, showing valid tracks */ + f32 qnpt; /* qrter notes / tick (1/division) */ + u32 lastTicks; /* keep track of ticks incase app wants */ + u32 lastDeltaTicks; /* number of delta ticks of last event */ + u32 deltaFlag; /* flag: set if delta's not subtracted */ + u8 *curLoc[16]; /* ptr to current track location, */ + /* may point to next event, or may point */ + /* to a backup code */ + u8 *curBUPtr[16]; /* ptr to next event if in backup mode */ + u8 curBULen[16]; /* if > 0, then in backup mode */ + u8 lastStatus[16]; /* for running status */ + u32 evtDeltaTicks[16]; /* delta time to next event */ +} ALCSeq; + +typedef struct { + u32 validTracks; + s32 lastTicks; + u32 lastDeltaTicks; + u8 *curLoc[16]; + u8 *curBUPtr[16]; + u8 curBULen[16]; + u8 lastStatus[16]; + u32 evtDeltaTicks[16]; +} ALCSeqMarker; + +#define NO_SOUND_ERR_MASK 0x01 +#define NOTE_OFF_ERR_MASK 0x02 +#define NO_VOICE_ERR_MASK 0x04 + +typedef struct { + s32 maxVoices; /* max number of voices to alloc */ + s32 maxEvents; /* max internal events to support */ + u8 maxChannels; /* max MIDI channels to support (16)*/ + u8 debugFlags; /* control which error get reported */ + ALHeap *heap; /* ptr to initialized heap */ + void *initOsc; + void *updateOsc; + void *stopOsc; +} ALSeqpConfig; + +typedef ALMicroTime (*ALOscInit)(void **oscState,f32 *initVal, u8 oscType, + u8 oscRate, u8 oscDepth, u8 oscDelay); +typedef ALMicroTime (*ALOscUpdate)(void *oscState, f32 *updateVal); +typedef void (*ALOscStop)(void *oscState); + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALSynth *drvr; /* reference to the client driver */ + ALSeq *target; /* current sequence */ + ALMicroTime curTime; + ALBank *bank; /* current ALBank */ + s32 uspt; /* microseconds per tick */ + s32 nextDelta; /* microseconds to next callback */ + s32 state; + u16 chanMask; /* active channels */ + s16 vol; /* overall sequence volume */ + u8 maxChannels; /* number of MIDI channels */ + u8 debugFlags; /* control which error get reported */ + ALEvent nextEvent; + ALEventQueue evtq; + ALMicroTime frameTime; + ALChanState *chanState; /* 16 channels for MIDI */ + ALVoiceState *vAllocHead; /* list head for allocated voices */ + ALVoiceState *vAllocTail; /* list tail for allocated voices */ + ALVoiceState *vFreeList; /* list of free voice state structs */ + ALOscInit initOsc; + ALOscUpdate updateOsc; + ALOscStop stopOsc; + ALSeqMarker *loopStart; + ALSeqMarker *loopEnd; + s32 loopCount; /* -1 = loop forever, 0 = no loop */ +} ALSeqPlayer; + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALSynth *drvr; /* reference to the client driver */ + ALCSeq *target; /* current sequence */ + ALMicroTime curTime; + ALBank *bank; /* current ALBank */ + s32 uspt; /* microseconds per tick */ + s32 nextDelta; /* microseconds to next callback */ + s32 state; + u16 chanMask; /* active channels */ + s16 vol; /* overall sequence volume */ + u8 maxChannels; /* number of MIDI channels */ + u8 debugFlags; /* control which error get reported */ + ALEvent nextEvent; + ALEventQueue evtq; + ALMicroTime frameTime; + ALChanState *chanState; /* 16 channels for MIDI */ + ALVoiceState *vAllocHead; /* list head for allocated voices */ + ALVoiceState *vAllocTail; /* list tail for allocated voices */ + ALVoiceState *vFreeList; /* list of free voice state structs */ + ALOscInit initOsc; + ALOscUpdate updateOsc; + ALOscStop stopOsc; +} ALCSPlayer; + +/* + * Sequence data representation routines + */ +void alSeqNew(ALSeq *seq, u8 *ptr, s32 len); +void alSeqNextEvent(ALSeq *seq, ALEvent *event); +s32 alSeqGetTicks(ALSeq *seq); +f32 alSeqTicksToSec(ALSeq *seq, s32 ticks, u32 tempo); +u32 alSeqSecToTicks(ALSeq *seq, f32 sec, u32 tempo); +void alSeqNewMarker(ALSeq *seq, ALSeqMarker *m, u32 ticks); +void alSeqSetLoc(ALSeq *seq, ALSeqMarker *marker); +void alSeqGetLoc(ALSeq *seq, ALSeqMarker *marker); +/* + * Compact Sequence data representation routines + */ +void alCSeqNew(ALCSeq *seq, u8 *ptr); +void alCSeqNextEvent(ALCSeq *seq,ALEvent *evt); +s32 alCSeqGetTicks(ALCSeq *seq); +f32 alCSeqTicksToSec(ALCSeq *seq, s32 ticks, u32 tempo); +u32 alCSeqSecToTicks(ALCSeq *seq, f32 sec, u32 tempo); +void alCSeqNewMarker(ALCSeq *seq, ALCSeqMarker *m, u32 ticks); +void alCSeqSetLoc(ALCSeq *seq, ALCSeqMarker *marker); +void alCSeqGetLoc(ALCSeq *seq, ALCSeqMarker *marker); + +/* + * Sequence Player routines + */ +f32 alCents2Ratio(s32 cents); + +void alSeqpNew(ALSeqPlayer *seqp, ALSeqpConfig *config); +void alSeqpDelete(ALSeqPlayer *seqp); +void alSeqpSetSeq(ALSeqPlayer *seqp, ALSeq *seq); +ALSeq *alSeqpGetSeq(ALSeqPlayer *seqp); +void alSeqpPlay(ALSeqPlayer *seqp); +void alSeqpStop(ALSeqPlayer *seqp); +s32 alSeqpGetState(ALSeqPlayer *seqp); +void alSeqpSetBank(ALSeqPlayer *seqp, ALBank *b); +void alSeqpSetTempo(ALSeqPlayer *seqp, s32 tempo); +s32 alSeqpGetTempo(ALSeqPlayer *seqp); +s16 alSeqpGetVol(ALSeqPlayer *seqp); /* Master volume control */ +void alSeqpSetVol(ALSeqPlayer *seqp, s16 vol); +void alSeqpLoop(ALSeqPlayer *seqp, ALSeqMarker *start, ALSeqMarker *end, s32 count); + +void alSeqpSetChlProgram(ALSeqPlayer *seqp, u8 chan, u8 prog); +s32 alSeqpGetChlProgram(ALSeqPlayer *seqp, u8 chan); +void alSeqpSetChlFXMix(ALSeqPlayer *seqp, u8 chan, u8 fxmix); +u8 alSeqpGetChlFXMix(ALSeqPlayer *seqp, u8 chan); +void alSeqpSetChlVol(ALSeqPlayer *seqp, u8 chan, u8 vol); +u8 alSeqpGetChlVol(ALSeqPlayer *seqp, u8 chan); +void alSeqpSetChlPan(ALSeqPlayer *seqp, u8 chan, ALPan pan); +ALPan alSeqpGetChlPan(ALSeqPlayer *seqp, u8 chan); +void alSeqpSetChlPriority(ALSeqPlayer *seqp, u8 chan, u8 priority); +u8 alSeqpGetChlPriority(ALSeqPlayer *seqp, u8 chan); +void alSeqpSendMidi(ALSeqPlayer *seqp, s32 ticks, u8 status, u8 byte1, u8 byte2); + + +/* Maintain backwards compatibility with old routine names. */ +#define alSeqpSetProgram alSeqpSetChlProgram +#define alSeqpGetProgram alSeqpGetChlProgram +#define alSeqpSetFXMix alSeqpSetChlFXMix +#define alSeqpGetFXMix alSeqpGetChlFXMix +#define alSeqpSetPan alSeqpSetChlPan +#define alSeqpGetPan alSeqpGetChlPan +#define alSeqpSetChannelPriority alSeqpSetChlPriority +#define alSeqpGetChannelPriority alSeqpGetChlPriority + + + +/* + * Compressed Sequence Player routines + */ +void alCSPNew(ALCSPlayer *seqp, ALSeqpConfig *config); +void alCSPDelete(ALCSPlayer *seqp); +void alCSPSetSeq(ALCSPlayer *seqp, ALCSeq *seq); +ALCSeq *alCSPGetSeq(ALCSPlayer *seqp); +void alCSPPlay(ALCSPlayer *seqp); +void alCSPStop(ALCSPlayer *seqp); +s32 alCSPGetState(ALCSPlayer *seqp); +void alCSPSetBank(ALCSPlayer *seqp, ALBank *b); +void alCSPSetTempo(ALCSPlayer *seqp, s32 tempo); +s32 alCSPGetTempo(ALCSPlayer *seqp); +s16 alCSPGetVol(ALCSPlayer *seqp); +void alCSPSetVol(ALCSPlayer *seqp, s16 vol); + +void alCSPSetChlProgram(ALCSPlayer *seqp, u8 chan, u8 prog); +s32 alCSPGetChlProgram(ALCSPlayer *seqp, u8 chan); +void alCSPSetChlFXMix(ALCSPlayer *seqp, u8 chan, u8 fxmix); +u8 alCSPGetChlFXMix(ALCSPlayer *seqp, u8 chan); +void alCSPSetChlPan(ALCSPlayer *seqp, u8 chan, ALPan pan); +ALPan alCSPGetChlPan(ALCSPlayer *seqp, u8 chan); +void alCSPSetChlVol(ALCSPlayer *seqp, u8 chan, u8 vol); +u8 alCSPGetChlVol(ALCSPlayer *seqp, u8 chan); +void alCSPSetChlPriority(ALCSPlayer *seqp, u8 chan, u8 priority); +u8 alCSPGetChlPriority(ALCSPlayer *seqp, u8 chan); +void alCSPSendMidi(ALCSPlayer *seqp, s32 ticks, u8 status, + u8 byte1, u8 byte2); + + +/* Maintain backwards compatibility with old routine names. */ +#define alCSPSetProgram alCSPSetChlProgram +#define alCSPGetProgram alCSPGetChlProgram +#define alCSPSetFXMix alCSPSetChlFXMix +#define alCSPGetFXMix alCSPGetChlFXMix +#define alCSPSetPan alCSPSetChlPan +#define alCSPGetPan alCSPGetChlPan +#define alCSPSetChannelPriority alCSPSetChlPriority +#define alCSPGetChannelPriority alCSPGetChlPriority + + + +/*********************************************************************** + * Sound Player stuff + ***********************************************************************/ + +typedef struct { + s32 maxSounds; + s32 maxEvents; + ALHeap *heap; +} ALSndpConfig; + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALEventQueue evtq; + ALEvent nextEvent; + ALSynth *drvr; /* reference to the client driver */ + s32 target; + void *sndState; + s32 maxSounds; + ALMicroTime frameTime; + ALMicroTime nextDelta; /* microseconds to next callback */ + ALMicroTime curTime; +} ALSndPlayer; + +typedef s16 ALSndId; + +void alSndpNew(ALSndPlayer *sndp, ALSndpConfig *c); +void alSndpDelete(ALSndPlayer *sndp); + +ALSndId alSndpAllocate(ALSndPlayer *sndp, ALSound *sound); +void alSndpDeallocate(ALSndPlayer *sndp, ALSndId id); + +void alSndpSetSound(ALSndPlayer *sndp, ALSndId id); +ALSndId alSndpGetSound(ALSndPlayer *sndp); + +void alSndpPlay(ALSndPlayer *sndp); +void alSndpPlayAt(ALSndPlayer *sndp, ALMicroTime delta); +void alSndpStop(ALSndPlayer *sndp); + +void alSndpSetVol(ALSndPlayer *sndp, s16 vol); +void alSndpSetPitch(ALSndPlayer *sndp, f32 pitch); +void alSndpSetPan(ALSndPlayer *sndp, ALPan pan); +void alSndpSetPriority(ALSndPlayer *sndp, ALSndId id, u8 priority); + +void alSndpSetFXMix(ALSndPlayer *sndp, u8 mix); +s32 alSndpGetState(ALSndPlayer *sndp); + +#ifndef _FINALROM +void alParseAbiCL(Acmd *cmdList, u32 nbytes); +#endif +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !__LIB_AUDIO__ */ + + + diff --git a/lib/ultralib/include/PR/mbi.h b/lib/ultralib/include/PR/mbi.h new file mode 100644 index 0000000..ac900a5 --- /dev/null +++ b/lib/ultralib/include/PR/mbi.h @@ -0,0 +1,100 @@ +#ifndef _MBI_H_ +#define _MBI_H_ + +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.136 $ + * $Date: 1999/01/05 13:04:00 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/mbi.h,v $ + * + **************************************************************************/ + +/* + * Header file for the Media Binary Interface + * + * NOTE: This file is included by the RSP microcode, so any C-specific + * constructs must be bracketed by #ifdef _LANGUAGE_C + * + */ + + +/* + * the SHIFT macros are used to build display list commands, inserting + * bit-fields into a 32-bit word. They take a value, a shift amount, + * and a width. + * + * For the left shift, the lower bits of the value are masked, + * then shifted left. + * + * For the right shift, the value is shifted right, then the lower bits + * are masked. + * + * (NOTE: _SHIFTL(v, 0, 32) won't work, just use an assignment) + * + */ +#define _SHIFTL(v, s, w) \ + ((unsigned int) (((unsigned int)(v) & ((0x01 << (w)) - 1)) << (s))) +#define _SHIFTR(v, s, w) \ + ((unsigned int)(((unsigned int)(v) >> (s)) & ((0x01 << (w)) - 1))) + +#define _SHIFT _SHIFTL /* old, for compatibility only */ + +#define G_ON (1) +#define G_OFF (0) + +/************************************************************************** + * + * Graphics Binary Interface + * + **************************************************************************/ + +#include + +/************************************************************************** + * + * Audio Binary Interface + * + **************************************************************************/ + +#include + +/************************************************************************** + * + * Task list + * + **************************************************************************/ + +#define M_GFXTASK 1 +#define M_AUDTASK 2 +#define M_VIDTASK 3 +#define M_HVQTASK 6 +#define M_HVQMTASK 7 + +/************************************************************************** + * + * Segment macros and definitions + * + **************************************************************************/ + +#define NUM_SEGMENTS (16) +#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00ffffff) +#define SEGMENT_NUMBER(a) (((unsigned int)(a) << 4) >> 28) +#define SEGMENT_ADDR(num, off) (((num) << 24) + (off)) + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* !_MBI_H_ */ diff --git a/lib/ultralib/include/PR/os.h b/lib/ultralib/include/PR/os.h new file mode 100644 index 0000000..4b52dfb --- /dev/null +++ b/lib/ultralib/include/PR/os.h @@ -0,0 +1,108 @@ + +/*==================================================================== + * os.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os.h,v $ + $Revision: 1.168 $ + $Date: 2000/06/15 06:24:52 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_H_ +#define _OS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Stack size for I/O device managers: PIM (PI Manager), VIM (VI Manager), + * SIM (SI Manager) + * + */ +#define OS_PIM_STACKSIZE 4096 +#define OS_VIM_STACKSIZE 4096 +#define OS_SIM_STACKSIZE 4096 + +#define OS_MIN_STACKSIZE 72 + +/* + * Leo Disk + */ + +/* transfer mode */ + +#define LEO_BLOCK_MODE 1 +#define LEO_TRACK_MODE 2 +#define LEO_SECTOR_MODE 3 + +/* + * Boot addresses + */ +#define BOOT_ADDRESS_ULTRA 0x80000400 +#define BOOT_ADDRESS_COSIM 0x80002000 +#define BOOT_ADDRESS_EMU 0x20010000 +#define BOOT_ADDRESS_INDY 0x88100000 + + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_H */ diff --git a/lib/ultralib/include/PR/os_ai.h b/lib/ultralib/include/PR/os_ai.h new file mode 100644 index 0000000..f89d87c --- /dev/null +++ b/lib/ultralib/include/PR/os_ai.h @@ -0,0 +1,92 @@ + +/*==================================================================== + * os_ai.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_ai.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:04 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_AI_H_ +#define _OS_AI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Audio interface (Ai) */ +extern u32 osAiGetStatus(void); +extern u32 osAiGetLength(void); +extern s32 osAiSetFrequency(u32); +extern s32 osAiSetNextBuffer(void *, u32); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_AI_H_ */ diff --git a/lib/ultralib/include/PR/os_cache.h b/lib/ultralib/include/PR/os_cache.h new file mode 100644 index 0000000..54ed923 --- /dev/null +++ b/lib/ultralib/include/PR/os_cache.h @@ -0,0 +1,96 @@ + +/*==================================================================== + * os_cache.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_cache.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:04 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CACHE_H_ +#define _OS_CACHE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define OS_DCACHE_ROUNDUP_ADDR(x) (void *)(((((u32)(x)+0xf)/0x10)*0x10)) +#define OS_DCACHE_ROUNDUP_SIZE(x) (u32)(((((u32)(x)+0xf)/0x10)*0x10)) + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Cache operations and macros */ + +extern void osInvalDCache(void *, s32); +extern void osInvalICache(void *, s32); +extern void osWritebackDCache(void *, s32); +extern void osWritebackDCacheAll(void); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CACHE_H_ */ diff --git a/lib/ultralib/include/PR/os_cont.h b/lib/ultralib/include/PR/os_cont.h new file mode 100644 index 0000000..2b69330 --- /dev/null +++ b/lib/ultralib/include/PR/os_cont.h @@ -0,0 +1,208 @@ + +/*==================================================================== + * os_cont.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_cont.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:05 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CONT_H_ +#define _OS_CONT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for controllers + */ + +typedef struct { + u16 type; /* Controller Type */ + u8 status; /* Controller status */ + u8 errno; +}OSContStatus; + +typedef struct { + u16 button; + s8 stick_x; /* -80 <= stick_x <= 80 */ + s8 stick_y; /* -80 <= stick_y <= 80 */ + u8 errno; +} OSContPad; + +typedef struct { + void *address; /* Ram pad Address: 11 bits */ + u8 databuffer[32]; /* address of the data buffer */ + u8 addressCrc; /* CRC code for address */ + u8 dataCrc; /* CRC code for data */ + u8 errno; +} OSContRamIo; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Controllers number + */ + +#ifndef _HW_VERSION_1 +#define MAXCONTROLLERS 4 +#else +#define MAXCONTROLLERS 6 +#endif + +/* controller errors */ +#define CONT_NO_RESPONSE_ERROR 0x8 +#define CONT_OVERRUN_ERROR 0x4 +#define CONT_RANGE_ERROR -1 +#ifdef _HW_VERSION_1 +#define CONT_FRAME_ERROR 0x2 +#define CONT_COLLISION_ERROR 0x1 +#endif + +/* Controller type */ + +#define CONT_ABSOLUTE 0x0001 +#define CONT_RELATIVE 0x0002 +#define CONT_JOYPORT 0x0004 +#define CONT_EEPROM 0x8000 +#define CONT_EEP16K 0x4000 +#define CONT_TYPE_MASK 0x1f07 +#define CONT_TYPE_NORMAL 0x0005 +#define CONT_TYPE_MOUSE 0x0002 +#define CONT_TYPE_VOICE 0x0100 + +/* Controller status */ + +#define CONT_CARD_ON 0x01 +#define CONT_CARD_PULL 0x02 +#define CONT_ADDR_CRC_ER 0x04 +#define CONT_EEPROM_BUSY 0x80 + +/* Buttons */ + +#define CONT_A 0x8000 +#define CONT_B 0x4000 +#define CONT_G 0x2000 +#define CONT_START 0x1000 +#define CONT_UP 0x0800 +#define CONT_DOWN 0x0400 +#define CONT_LEFT 0x0200 +#define CONT_RIGHT 0x0100 +#define CONT_L 0x0020 +#define CONT_R 0x0010 +#define CONT_E 0x0008 +#define CONT_D 0x0004 +#define CONT_C 0x0002 +#define CONT_F 0x0001 + +/* Nintendo's official button names */ + +#define A_BUTTON CONT_A +#define B_BUTTON CONT_B +#define L_TRIG CONT_L +#define R_TRIG CONT_R +#define Z_TRIG CONT_G +#define START_BUTTON CONT_START +#define U_JPAD CONT_UP +#define L_JPAD CONT_LEFT +#define R_JPAD CONT_RIGHT +#define D_JPAD CONT_DOWN +#define U_CBUTTONS CONT_E +#define L_CBUTTONS CONT_C +#define R_CBUTTONS CONT_F +#define D_CBUTTONS CONT_D + +/* Controller error number */ + +#define CONT_ERR_NO_CONTROLLER PFS_ERR_NOPACK /* 1 */ +#define CONT_ERR_CONTRFAIL CONT_OVERRUN_ERROR /* 4 */ +#define CONT_ERR_INVALID PFS_ERR_INVALID /* 5 */ +#define CONT_ERR_DEVICE PFS_ERR_DEVICE /* 11 */ +#define CONT_ERR_NOT_READY 12 +#define CONT_ERR_VOICE_MEMORY 13 +#define CONT_ERR_VOICE_WORD 14 +#define CONT_ERR_VOICE_NO_RESPONSE 15 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Controller interface */ + +extern s32 osContInit(OSMesgQueue *, u8 *, OSContStatus *); +extern s32 osContReset(OSMesgQueue *, OSContStatus *); +extern s32 osContStartQuery(OSMesgQueue *); +extern s32 osContStartReadData(OSMesgQueue *); +#ifndef _HW_VERSION_1 +extern s32 osContSetCh(u8); +#endif +extern void osContGetQuery(OSContStatus *); +extern void osContGetReadData(OSContPad *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CONT_H_ */ diff --git a/lib/ultralib/include/PR/os_convert.h b/lib/ultralib/include/PR/os_convert.h new file mode 100644 index 0000000..0a5da10 --- /dev/null +++ b/lib/ultralib/include/PR/os_convert.h @@ -0,0 +1,111 @@ + +/*==================================================================== + * os_convert.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_convert.h,v $ + $Revision: 1.2 $ + $Date: 1999/04/21 02:53:11 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CONVERT_H_ +#define _OS_CONVERT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#define OS_CLOCK_RATE 62500000LL +#define OS_CPU_COUNTER (OS_CLOCK_RATE*3/4) + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define OS_NSEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625000LL))/(1000000000LL/15625000LL)) +#define OS_USEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625LL))/(1000000LL/15625LL)) +#define OS_CYCLES_TO_NSEC(c) (((u64)(c)*(1000000000LL/15625000LL))/(OS_CPU_COUNTER/15625000LL)) +#define OS_CYCLES_TO_USEC(c) (((u64)(c)*(1000000LL/15625LL))/(OS_CPU_COUNTER/15625LL)) + +/* OS_K?_TO_PHYSICAL macro bug fix for CodeWarrior */ +#ifndef __MWERKS__ +#define OS_K0_TO_PHYSICAL(x) (u32)(((char *)(x)-0x80000000)) +#define OS_K1_TO_PHYSICAL(x) (u32)(((char *)(x)-0xa0000000)) +#else +#define OS_K0_TO_PHYSICAL(x) ((char *)(x)-0x80000000) +#define OS_K1_TO_PHYSICAL(x) ((char *)(x)-0xa0000000) +#endif + +#define OS_PHYSICAL_TO_K0(x) (void *)(((u32)(x)+0x80000000)) +#define OS_PHYSICAL_TO_K1(x) (void *)(((u32)(x)+0xa0000000)) + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Address translation routines and macros */ + +extern u32 osVirtualToPhysical(void *); +extern void * osPhysicalToVirtual(u32); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CONVERT_H_ */ diff --git a/lib/ultralib/include/PR/os_debug.h b/lib/ultralib/include/PR/os_debug.h new file mode 100644 index 0000000..f8f5a89 --- /dev/null +++ b/lib/ultralib/include/PR/os_debug.h @@ -0,0 +1,117 @@ + +/*==================================================================== + * os_debug.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_debug.h,v $ + $Revision: 1.4 $ + $Date: 1999/06/30 03:04:08 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_DEBUG_H_ +#define _OS_DEBUG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for Profiler + */ +typedef struct { + u16 *histo_base; /* histogram base */ + u32 histo_size; /* histogram size */ + u32 *text_start; /* start of text segment */ + u32 *text_end; /* end of text segment */ +} OSProf; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Profiler constants + */ +#define PROF_MIN_INTERVAL 50 /* microseconds */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Profiler Interface */ + +extern void osProfileInit(OSProf *, u32 profcnt); +extern void osProfileStart(u32); +extern void osProfileFlush(void); +extern void osProfileStop(void); + +/* Thread Profiler Interface */ +extern void osThreadProfileClear(OSId); +extern void osThreadProfileInit(void); +extern void osThreadProfileStart(void); +extern void osThreadProfileStop(void); +extern u32 osThreadProfileReadCount(OSId); +extern u32 osThreadProfileReadCountTh(OSThread*); +extern OSTime osThreadProfileReadTime(OSId); +extern OSTime osThreadProfileReadTimeTh(OSThread*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_DEBUG_H_ */ diff --git a/lib/ultralib/include/PR/os_eeprom.h b/lib/ultralib/include/PR/os_eeprom.h new file mode 100644 index 0000000..b3bca81 --- /dev/null +++ b/lib/ultralib/include/PR/os_eeprom.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * os_eeprom.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_eeprom.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:06 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_EEPROM_H_ +#define _OS_EEPROM_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* EEPROM TYPE */ + +#define EEPROM_TYPE_4K 0x01 +#define EEPROM_TYPE_16K 0x02 + +/* definition for EEPROM */ + +#define EEPROM_MAXBLOCKS 64 +#define EEP16K_MAXBLOCKS 256 +#define EEPROM_BLOCK_SIZE 8 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* EEPROM interface */ + +extern s32 osEepromProbe(OSMesgQueue *); +extern s32 osEepromRead(OSMesgQueue *, u8, u8 *); +extern s32 osEepromWrite(OSMesgQueue *, u8, u8 *); +extern s32 osEepromLongRead(OSMesgQueue *, u8, u8 *, int); +extern s32 osEepromLongWrite(OSMesgQueue *, u8, u8 *, int); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_EEPROM_H_ */ diff --git a/lib/ultralib/include/PR/os_error.h b/lib/ultralib/include/PR/os_error.h new file mode 100644 index 0000000..f4c3b83 --- /dev/null +++ b/lib/ultralib/include/PR/os_error.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_error.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_error.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:06 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_ERROR_H_ +#define _OS_ERROR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_ERROR_H_ */ diff --git a/lib/ultralib/include/PR/os_exception.h b/lib/ultralib/include/PR/os_exception.h new file mode 100644 index 0000000..2457bde --- /dev/null +++ b/lib/ultralib/include/PR/os_exception.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_exception.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_exception.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:07 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_EXCEPTION_H_ +#define _OS_EXCEPTION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef u32 OSIntMask; +typedef u32 OSHWIntr; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/* Flags for debugging purpose */ + +#define OS_FLAG_CPU_BREAK 1 /* Break exception has occurred */ +#define OS_FLAG_FAULT 2 /* CPU fault has occurred */ + +/* Interrupt masks */ + +#define OS_IM_NONE 0x00000001 +#define OS_IM_RCP 0x00000401 +#define OS_IM_SW1 0x00000501 +#define OS_IM_SW2 0x00000601 +#define OS_IM_CART 0x00000c01 +#define OS_IM_PRENMI 0x00001401 +#define OS_IM_RDBWRITE 0x00002401 +#define OS_IM_RDBREAD 0x00004401 +#define OS_IM_COUNTER 0x00008401 +#define OS_IM_CPU 0x0000ff01 +#define OS_IM_SP 0x00010401 +#define OS_IM_SI 0x00020401 +#define OS_IM_AI 0x00040401 +#define OS_IM_VI 0x00080401 +#define OS_IM_PI 0x00100401 +#define OS_IM_DP 0x00200401 +#define OS_IM_ALL 0x003fff01 +#define RCP_IMASK 0x003f0000 +#define RCP_IMASKSHIFT 16 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Interrupt operations */ + +extern OSIntMask osGetIntMask(void); +extern OSIntMask osSetIntMask(OSIntMask); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_EXCEPTION_H_ */ diff --git a/lib/ultralib/include/PR/os_flash.h b/lib/ultralib/include/PR/os_flash.h new file mode 100644 index 0000000..9eb0bf7 --- /dev/null +++ b/lib/ultralib/include/PR/os_flash.h @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_flash.h,v $ + $Revision: 1.1 $ + $Date: 2000/06/15 06:24:55 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_FLASH_H_ +#define _OS_FLASH_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" +#include "os_pi.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * defines for FLASH + */ +#define FLASH_START_ADDR 0x08000000 + +#define FLASH_SIZE 0x20000 + +#define FLASH_LATENCY 0x5 +#define FLASH_PULSE 0x0c +#define FLASH_PAGE_SIZE 0xf +#define FLASH_REL_DURATION 0x2 +#define DEVICE_TYPE_FLASH 8 + +#define FLASH_VERSION_MX_PROTO_A 0x00c20000 +#define FLASH_VERSION_MX_A 0x00c20001 +#define FLASH_VERSION_MX_C 0x00c2001e +#define FLASH_VERSION_MX_B_AND_D 0x00c2001d +#define FLASH_VERSION_MEI 0x003200f1 + +/* OLD_FLASH is MX_PROTO_A, MX_A and MX_C */ +#define OLD_FLASH 0 +/* NEW_FLASH is MX_B_AND_D and MATSUSHITA flash */ +#define NEW_FLASH 1 + +#define FLASH_STATUS_ERASE_BUSY 2 +#define FLASH_STATUS_ERASE_OK 0 +#define FLASH_STATUS_ERASE_ERROR -1 + +#define FLASH_STATUS_WRITE_BUSY 1 +#define FLASH_STATUS_WRITE_OK 0 +#define FLASH_STATUS_WRITE_ERROR -1 + +extern OSPiHandle *osFlashReInit(u8 latency, u8 pulse, + u8 page_size, u8 rel_duration, u32 start); +extern OSPiHandle *osFlashInit(void); +extern void osFlashReadStatus(u8 *flash_status); +extern void osFlashReadId(u32 *flash_type, u32 *flash_maker); +extern void osFlashClearStatus(void); +extern s32 osFlashAllErase(void); +extern s32 osFlashSectorErase(u32 page_num); +extern s32 osFlashWriteBuffer(OSIoMesg *mb, s32 priority, + void *dramAddr, OSMesgQueue *mq); +extern s32 osFlashWriteArray(u32 page_num); +extern s32 osFlashReadArray(OSIoMesg *mb, s32 priority, u32 page_num, + void *dramAddr, u32 n_pages, OSMesgQueue *mq); +extern void osFlashChange(u32 flash_num); +extern void osFlashAllEraseThrough(void); +extern void osFlashSectorEraseThrough(u32 page_num); +extern s32 osFlashCheckEraseEnd(void); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_FLASH_H_ */ diff --git a/lib/ultralib/include/PR/os_gbpak.h b/lib/ultralib/include/PR/os_gbpak.h new file mode 100644 index 0000000..0a99994 --- /dev/null +++ b/lib/ultralib/include/PR/os_gbpak.h @@ -0,0 +1,107 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_gbpak.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:07 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_GBPAK_H_ +#define _OS_GBPAK_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" +#include "os_pfs.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { + u16 fixed1; + u16 start_address; + u8 nintendo_chr[0x30]; + u8 game_title[16]; + u16 company_code; + u8 body_code; + u8 cart_type; + u8 rom_size; + u8 ram_size; + u8 country_code; + u8 fixed2; + u8 version; + u8 isum; + u16 sum; +} OSGbpakId; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* definition for 64GB-PAK */ + +#define OS_GBPAK_POWER 0x01 +#define OS_GBPAK_RSTB_DETECTION 0x04 +#define OS_GBPAK_RSTB_STATUS 0x08 +#define OS_GBPAK_GBCART_PULL 0x40 +#define OS_GBPAK_GBCART_ON 0x80 + +#define OS_GBPAK_POWER_OFF 0x00 /* power of 64GB-PAK */ +#define OS_GBPAK_POWER_ON 0x01 + +#define OS_GBPAK_ROM_ID_SIZE 0x50 /* ID size of GB cartridge */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* 64GB-PAK */ +extern s32 osGbpakInit(OSMesgQueue *, OSPfs *, int); +extern s32 osGbpakPower(OSPfs *, s32); +extern s32 osGbpakGetStatus(OSPfs *, u8 *); +extern s32 osGbpakReadWrite(OSPfs *, u16, u16, u8 *, u16); +extern s32 osGbpakReadId(OSPfs *, OSGbpakId *, u8 *); +extern s32 osGbpakCheckConnector(OSPfs *, u8 *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_GBPAK_H_ */ diff --git a/lib/ultralib/include/PR/os_gio.h b/lib/ultralib/include/PR/os_gio.h new file mode 100644 index 0000000..ad3c020 --- /dev/null +++ b/lib/ultralib/include/PR/os_gio.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_gio.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_gio.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:08 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_GIO_H_ +#define _OS_GIO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_GIO_H_ */ diff --git a/lib/ultralib/include/PR/os_host.h b/lib/ultralib/include/PR/os_host.h new file mode 100644 index 0000000..3192f6a --- /dev/null +++ b/lib/ultralib/include/PR/os_host.h @@ -0,0 +1,166 @@ + +/*==================================================================== + * os_host.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_host.h,v $ + $Revision: 1.3 $ + $Date: 1999/06/24 09:23:06 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_HOST_H_ +#define _OS_HOST_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +extern void __osInitialize_common(void); + +#if defined(_FINALROM) + +#define osInitialize() __osInitialize_common() + +#else + +/* PARTNER-N64 */ +#if defined(PTN64) +extern void __osInitialize_kmc(void); +#define osReadHost osReadHost_pt +#define osWriteHost osWriteHost_pt +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_kmc(); \ +} + +/* MONEGI SMART PACK A */ +#elif defined(MWN64) +extern void __osInitialize_msp(void); +#define osReadHost osReadHost_pt +#define osWriteHost osWriteHost_pt +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_msp(); \ +} + +/* IS-Viewer(for Debugger) */ +#elif defined(ISV64) +extern void __osInitialize_isv(void); +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_isv(); \ +} + +/* Emulation board for INDY */ +#elif defined(EMU64) +extern void __osInitialize_emu(void); +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_emu(); \ +} + +#else +/* Default (auto detect) */ +extern void __osInitialize_autodetect(void); +extern void __osInitialize_msp(void); +extern void __osInitialize_kmc(void); +extern void __osInitialize_isv(void); +extern void __osInitialize_emu(void); +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_autodetect(); \ +} +#endif + +#endif /* _FINAL_ROM */ + +#if BUILD_VERSION < VERSION_K +#undef osInitialize +#endif + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Game <> Host data transfer functions */ + +extern s32 osTestHost(void); +extern void osReadHost(void *, u32); +extern void osWriteHost(void *, u32); +extern void osAckRamromRead(void); +extern void osAckRamromWrite(void); + +/* RDB port operations */ + +extern void osInitRdb(u8 *sendBuf, u32 sendSize); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_HOST_H_ */ diff --git a/lib/ultralib/include/PR/os_internal.h b/lib/ultralib/include/PR/os_internal.h new file mode 100644 index 0000000..754d1ee --- /dev/null +++ b/lib/ultralib/include/PR/os_internal.h @@ -0,0 +1,49 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal.h,v $ + $Revision: 1.20 $ + $Date: 1998/10/09 08:01:09 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_H_ +#define _OS_INTERNAL_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +#include "os_internal_reg.h" +#include "os_internal_exception.h" +#include "os_internal_tlb.h" +#include "os_internal_si.h" +#include "os_internal_rsp.h" +#include "os_internal_error.h" +#include "os_internal_gio.h" +#include "os_internal_thread.h" +#include "os_internal_debug.h" +#include "os_internal_host.h" + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_H */ diff --git a/lib/ultralib/include/PR/os_internal_debug.h b/lib/ultralib/include/PR/os_internal_debug.h new file mode 100644 index 0000000..7b307d6 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_debug.h @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_debug.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:09 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_DEBUG_H_ +#define _OS_INTERNAL_DEBUG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Debug port */ +extern void __osSyncPutChars(int, int, const char *); +extern int __osAtomicDec(unsigned int *p); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_DEBUG_H */ diff --git a/lib/ultralib/include/PR/os_internal_error.h b/lib/ultralib/include/PR/os_internal_error.h new file mode 100644 index 0000000..de188d2 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_error.h @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_error.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:10 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_ERROR_H_ +#define _OS_INTERNAL_ERROR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Error handling */ + +extern void __osError(s16, s16, ...); +extern OSThread * __osGetCurrFaultedThread(void); +extern OSThread * __osGetNextFaultedThread(OSThread *); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_ERROR_H */ diff --git a/lib/ultralib/include/PR/os_internal_exception.h b/lib/ultralib/include/PR/os_internal_exception.h new file mode 100644 index 0000000..8888f9e --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_exception.h @@ -0,0 +1,57 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_exception.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:10 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_EXCEPTION_H_ +#define _OS_INTERNAL_EXCEPTION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +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_I_P +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); +extern void __osResetGlobalIntMask(OSHWIntr); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_EXCEPTION_H */ diff --git a/lib/ultralib/include/PR/os_internal_flash.h b/lib/ultralib/include/PR/os_internal_flash.h new file mode 100644 index 0000000..1c6f780 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_flash.h @@ -0,0 +1,40 @@ +#ifndef _OS_INTERNAL_FLASH_H_ +#define _OS_INTERNAL_FLASH_H_ + +#include "os_message.h" +#include "os_flash.h" + +#define FLASH_BLOCK_SIZE 128 + +/** + * Flash commands + */ +#define FLASH_CMD_REG 0x10000 + +/* set whole chip erase mode */ +#define FLASH_CMD_CHIP_ERASE 0x3C000000 +/* set sector erase mode */ +#define FLASH_CMD_SECTOR_ERASE 0x4B000000 +/* do erasure */ +#define FLASH_CMD_EXECUTE_ERASE 0x78000000 +/* program selected page */ +#define FLASH_CMD_PROGRAM_PAGE 0xA5000000 +/* set page program mode */ +#define FLASH_CMD_PAGE_PROGRAM 0xB4000000 +/* set status mode */ +#define FLASH_CMD_STATUS 0xD2000000 +/* set silicon id mode */ +#define FLASH_CMD_ID 0xE1000000 +/* set read mode */ +#define FLASH_CMD_READ_ARRAY 0xF0000000 + +extern OSIoMesg __osFlashMsg; +extern OSMesgQueue __osFlashMessageQ; +extern OSPiHandle __osFlashHandler; +extern OSMesg __osFlashMsgBuf[1]; +extern s32 __osFlashVersion; +extern u32 __osFlashID[4]; + +u32 __osFlashGetAddr(u32 page_num); + +#endif diff --git a/lib/ultralib/include/PR/os_internal_gio.h b/lib/ultralib/include/PR/os_internal_gio.h new file mode 100644 index 0000000..ff13385 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_gio.h @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_gio.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:11 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_GIO_H_ +#define _OS_INTERNAL_GIO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Development board functions */ + +extern void __osGIOInit(s32); +extern void __osGIOInterrupt(s32); +extern void __osGIORawInterrupt(s32); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_GIO_H */ diff --git a/lib/ultralib/include/PR/os_internal_host.h b/lib/ultralib/include/PR/os_internal_host.h new file mode 100644 index 0000000..b6d1951 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_host.h @@ -0,0 +1,42 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_host.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:11 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_HOST_H_ +#define _OS_INTERNAL_HOST_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* routine for rdb port */ +extern u32 __osRdbSend(u8 *buf, u32 size, u32 type); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_HOST_H */ diff --git a/lib/ultralib/include/PR/os_internal_reg.h b/lib/ultralib/include/PR/os_internal_reg.h new file mode 100644 index 0000000..206b721 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_reg.h @@ -0,0 +1,57 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_reg.h,v $ + $Revision: 1.2 $ + $Date: 1999/03/10 12:19:14 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_REG_H_ +#define _OS_INTERNAL_REG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "os.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routines to get/fetch coprocessor 0 registers */ +extern u32 __osGetCause(void); +extern void __osSetCause(u32); +extern u32 __osGetCompare(void); +extern void __osSetCompare(u32); +extern u32 __osGetConfig(void); +extern void __osSetConfig(u32); +extern void __osSetCount(u32); +extern u32 __osGetSR(void); +extern void __osSetSR(u32); +extern u32 __osDisableInt(void); +extern void __osRestoreInt(u32); +extern u32 __osGetWatchLo(void); +extern void __osSetWatchLo(u32); + +/* Routines to get/set floating-point control and status register */ +extern u32 __osSetFpcCsr(u32); +extern u32 __osGetFpcCsr(void); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_REG_H */ diff --git a/lib/ultralib/include/PR/os_internal_rsp.h b/lib/ultralib/include/PR/os_internal_rsp.h new file mode 100644 index 0000000..646e667 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_rsp.h @@ -0,0 +1,48 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_rsp.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:12 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_RSP_H_ +#define _OS_INTERNAL_RSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Signal processor interface (Sp) */ + +extern u32 __osSpGetStatus(void); +extern void __osSpSetStatus(u32); +extern s32 __osSpSetPc(u32); +extern s32 __osSpRawWriteIo(u32, u32); +extern s32 __osSpRawReadIo(u32, u32 *); +extern s32 __osSpRawStartDma(s32, u32, void *, u32); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_RSP_H */ diff --git a/lib/ultralib/include/PR/os_internal_si.h b/lib/ultralib/include/PR/os_internal_si.h new file mode 100644 index 0000000..d0eeedc --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_si.h @@ -0,0 +1,46 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_si.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:13 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_SI_H_ +#define _OS_INTERNAL_SI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Serial interface (Si) */ + +extern u32 __osSiGetStatus(void); +extern s32 __osSiRawWriteIo(u32, u32); +extern s32 __osSiRawReadIo(u32, u32 *); +extern s32 __osSiRawStartDma(s32, void *); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_SI_H */ diff --git a/lib/ultralib/include/PR/os_internal_thread.h b/lib/ultralib/include/PR/os_internal_thread.h new file mode 100644 index 0000000..1305eb5 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_thread.h @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_thread.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:13 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_THREAD_H_ +#define _OS_INTERNAL_THREAD_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* For debugger use */ + +extern OSThread * __osGetActiveQueue(void); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_THREAD_H */ diff --git a/lib/ultralib/include/PR/os_internal_tlb.h b/lib/ultralib/include/PR/os_internal_tlb.h new file mode 100644 index 0000000..b92918f --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_tlb.h @@ -0,0 +1,47 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_tlb.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:14 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_TLB_H_ +#define _OS_INTERNAL_TLB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routines for fetch TLB info */ + +extern u32 __osGetTLBASID(void); +extern u32 __osGetTLBPageMask(s32); +extern u32 __osGetTLBHi(s32); +extern u32 __osGetTLBLo0(s32); +extern u32 __osGetTLBLo1(s32); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_TLB_H */ diff --git a/lib/ultralib/include/PR/os_libc.h b/lib/ultralib/include/PR/os_libc.h new file mode 100644 index 0000000..35d0e8e --- /dev/null +++ b/lib/ultralib/include/PR/os_libc.h @@ -0,0 +1,100 @@ + +/*==================================================================== + * os_libc.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_libc.h,v $ + $Revision: 1.3 $ + $Date: 1999/07/13 01:43:47 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_LIBC_H_ +#define _OS_LIBC_H_ + +#include "os_pfs.h" + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* byte string operations */ + + +extern void bcopy(const void *, void *, int); +extern int bcmp(const void *, const void *, int); +extern void bzero(void *, int); + +/* Printf */ + +extern int sprintf(char *s, const char *fmt, ...); +extern void osSyncPrintf(const char *fmt, ...); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_LIBC_H_ */ diff --git a/lib/ultralib/include/PR/os_message.h b/lib/ultralib/include/PR/os_message.h new file mode 100644 index 0000000..606c5cb --- /dev/null +++ b/lib/ultralib/include/PR/os_message.h @@ -0,0 +1,162 @@ + +/*==================================================================== + * os_message.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_message.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:15 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_MESSAGE_H_ +#define _OS_MESSAGE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" +#include "os_thread.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSEvent; + +/* + * Structure for message + */ +typedef void *OSMesg; + +/* + * Structure for message queue + */ +typedef struct OSMesgQueue_s { + OSThread *mtqueue; /* Queue to store threads blocked on empty mailboxes (receive) */ + OSThread *fullqueue; /* Queue to store threads blocked on full mailboxes (send) */ + s32 validCount; /* Contains number of valid message */ + s32 first; /* Points to first valid message */ + s32 msgCount; /* Contains total # of messages */ + OSMesg *msg; /* Points to message buffer array */ +} OSMesgQueue; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Events */ +#ifdef _FINALROM +#define OS_NUM_EVENTS 15 +#else +#define OS_NUM_EVENTS 23 +#endif + +#define OS_EVENT_SW1 0 /* CPU SW1 interrupt */ +#define OS_EVENT_SW2 1 /* CPU SW2 interrupt */ +#define OS_EVENT_CART 2 /* Cartridge interrupt: used by rmon */ +#define OS_EVENT_COUNTER 3 /* Counter int: used by VI/Timer Mgr */ +#define OS_EVENT_SP 4 /* SP task done interrupt */ +#define OS_EVENT_SI 5 /* SI (controller) interrupt */ +#define OS_EVENT_AI 6 /* AI interrupt */ +#define OS_EVENT_VI 7 /* VI interrupt: used by VI/Timer Mgr */ +#define OS_EVENT_PI 8 /* PI interrupt: used by PI Manager */ +#define OS_EVENT_DP 9 /* DP full sync interrupt */ +#define OS_EVENT_CPU_BREAK 10 /* CPU breakpoint: used by rmon */ +#define OS_EVENT_SP_BREAK 11 /* SP breakpoint: used by rmon */ +#define OS_EVENT_FAULT 12 /* CPU fault event: used by rmon */ +#define OS_EVENT_THREADSTATUS 13 /* CPU thread status: used by rmon */ +#define OS_EVENT_PRENMI 14 /* Pre NMI interrupt */ +#ifndef _FINALROM +#define OS_EVENT_RDB_READ_DONE 15 /* RDB read ok event: used by rmon */ +#define OS_EVENT_RDB_LOG_DONE 16 /* read of log data complete */ +#define OS_EVENT_RDB_DATA_DONE 17 /* read of hostio data complete */ +#define OS_EVENT_RDB_REQ_RAMROM 18 /* host needs ramrom access */ +#define OS_EVENT_RDB_FREE_RAMROM 19 /* host is done with ramrom access */ +#define OS_EVENT_RDB_DBG_DONE 20 +#define OS_EVENT_RDB_FLUSH_PROF 21 +#define OS_EVENT_RDB_ACK_PROF 22 +#endif + +/* Flags to turn blocking on/off when sending/receiving message */ + +#define OS_MESG_NOBLOCK 0 +#define OS_MESG_BLOCK 1 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* Get count of valid messages in queue */ +#define MQ_GET_COUNT(mq) ((mq)->validCount) + +/* Figure out if message queue is empty or full */ +#define MQ_IS_EMPTY(mq) (MQ_GET_COUNT(mq) == 0) +#define MQ_IS_FULL(mq) (MQ_GET_COUNT(mq) >= (mq)->msgCount) + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Message operations */ + +extern void osCreateMesgQueue(OSMesgQueue *, OSMesg *, s32); +extern s32 osSendMesg(OSMesgQueue *, OSMesg, s32); +extern s32 osJamMesg(OSMesgQueue *, OSMesg, s32); +extern s32 osRecvMesg(OSMesgQueue *, OSMesg *, s32); + +/* Event operations */ + +extern void osSetEventMesg(OSEvent, OSMesgQueue *, OSMesg); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_MESSAGE_H_ */ diff --git a/lib/ultralib/include/PR/os_motor.h b/lib/ultralib/include/PR/os_motor.h new file mode 100644 index 0000000..2edb8e6 --- /dev/null +++ b/lib/ultralib/include/PR/os_motor.h @@ -0,0 +1,84 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_motor.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:15 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_MOTOR_H_ +#define _OS_MOTOR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" +#include "os_pfs.h" +#include "os_version.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Rumble PAK interface */ + +extern s32 osMotorInit(OSMesgQueue *, OSPfs *, int); +#if BUILD_VERSION >= VERSION_J +#define MOTOR_START 1 +#define MOTOR_STOP 0 +#define osMotorStart(x) __osMotorAccess((x), MOTOR_START) +#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP) +extern s32 __osMotorAccess(OSPfs *, s32); +#else +extern s32 osMotorStop(OSPfs *); +extern s32 osMotorStart(OSPfs *); +#endif + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_MOTOR_H_ */ diff --git a/lib/ultralib/include/PR/os_pfs.h b/lib/ultralib/include/PR/os_pfs.h new file mode 100644 index 0000000..9c86e23 --- /dev/null +++ b/lib/ultralib/include/PR/os_pfs.h @@ -0,0 +1,200 @@ + +/*==================================================================== + * os_pfs.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_pfs.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:16 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_PFS_H_ +#define _OS_PFS_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for file system + */ +typedef struct { + int status; + OSMesgQueue *queue; + int channel; + u8 id[32]; + u8 label[32]; + int version; + int dir_size; + int inode_table; /* block location */ + int minode_table; /* mirrioring inode_table */ + int dir_table; /* block location */ + int inode_start_page; /* page # */ + u8 banks; + u8 activebank; +} OSPfs; + +typedef struct { + u32 file_size; /* bytes */ + u32 game_code; + u16 company_code; + char ext_name[4]; + char game_name[16]; +} OSPfsState; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +/* File System size */ +#define OS_PFS_VERSION 0x0200 +#define OS_PFS_VERSION_HI (OS_PFS_VERSION >> 8) +#define OS_PFS_VERSION_LO (OS_PFS_VERSION & 255) + +#define PFS_INODE_SIZE_PER_PAGE 128 +#define PFS_FILE_NAME_LEN 16 +#define PFS_FILE_EXT_LEN 4 +#define BLOCKSIZE 32 /* bytes */ +#define PFS_ONE_PAGE 8 /* blocks */ +#define PFS_MAX_BANKS 62 + +/* File System flag */ + +#define PFS_READ 0 +#define PFS_WRITE 1 +#define PFS_CREATE 2 + +/* File System status */ +#define PFS_INITIALIZED 0x1 +#define PFS_CORRUPTED 0x2 +#define PFS_ID_BROKEN 0x4 +#define PFS_MOTOR_INITIALIZED 0x8 +#define PFS_GBPAK_INITIALIZED 0x10 + +/* Definition for page usage */ +#define PFS_EOF 1 +#define PFS_PAGE_NOT_EXIST 2 +#define PFS_PAGE_NOT_USED 3 + +/* File System error number */ + +#define PFS_ERR_NOPACK 1 /* no memory card is plugged or */ +#define PFS_ERR_NEW_PACK 2 /* ram pack has been changed to a different one */ +#define PFS_ERR_INCONSISTENT 3 /* need to run Pfschecker*/ +#define PFS_ERR_CONTRFAIL CONT_OVERRUN_ERROR +#define PFS_ERR_INVALID 5 /* invalid parameter or file not exist*/ +#define PFS_ERR_BAD_DATA 6 /* the data read from pack are bad*/ +#define PFS_DATA_FULL 7 /* no free pages on ram pack*/ +#define PFS_DIR_FULL 8 /* no free directories on ram pack*/ +#define PFS_ERR_EXIST 9 /* file exists*/ +#define PFS_ERR_ID_FATAL 10 /* dead ram pack */ +#define PFS_ERR_DEVICE 11 /* wrong device type*/ +#define PFS_ERR_NO_GBCART 12 /* no gb cartridge (64GB-PAK) */ +#define PFS_ERR_NEW_GBCART 13 /* gb cartridge may be changed */ + +/* Definition for bank */ +#define PFS_ID_BANK_256K 0 +#define PFS_ID_BANK_1M 4 +#define PFS_BANKS_256K 1 + +#define PFS_WRITTEN 2 +#define DEF_DIR_PAGES 2 + +#define PFS_ID_0AREA 1 +#define PFS_ID_1AREA 3 +#define PFS_ID_2AREA 4 +#define PFS_ID_3AREA 6 +#define PFS_LABEL_AREA 7 +#define PFS_ID_PAGE PFS_ONE_PAGE * 0 + +#define PFS_BANK_LAPPED_BY 8 /* => u8 */ +#define PFS_SECTOR_PER_BANK 32 +#define PFS_INODE_DIST_MAP (PFS_BANK_LAPPED_BY * PFS_SECTOR_PER_BANK) +#define PFS_SECTOR_SIZE (PFS_INODE_SIZE_PER_PAGE/PFS_SECTOR_PER_BANK) + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* file system interface */ + +extern s32 osPfsInitPak(OSMesgQueue *, OSPfs *, int); +extern s32 osPfsRepairId(OSPfs *); +extern s32 osPfsInit(OSMesgQueue *, OSPfs *, int); +extern s32 osPfsReFormat(OSPfs *, OSMesgQueue *, int); +extern s32 osPfsChecker(OSPfs *); +extern s32 osPfsAllocateFile(OSPfs *, u16, u32, u8 *, u8 *, int, s32 *); +extern s32 osPfsFindFile(OSPfs *, u16, u32, u8 *, u8 *, s32 *); +extern s32 osPfsDeleteFile(OSPfs *, u16, u32, u8 *, u8 *); +extern s32 osPfsReadWriteFile(OSPfs *, s32, u8, int, int, u8 *); +extern s32 osPfsFileState(OSPfs *, s32, OSPfsState *); +extern s32 osPfsGetLabel(OSPfs *, u8 *, int *); +extern s32 osPfsSetLabel(OSPfs *, u8 *); +extern s32 osPfsIsPlug(OSMesgQueue *, u8 *); +extern s32 osPfsFreeBlocks(OSPfs *, s32 *); +extern s32 osPfsNumFiles(OSPfs *, s32 *, s32 *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_PFS_H_ */ diff --git a/lib/ultralib/include/PR/os_pi.h b/lib/ultralib/include/PR/os_pi.h new file mode 100644 index 0000000..f408d6c --- /dev/null +++ b/lib/ultralib/include/PR/os_pi.h @@ -0,0 +1,221 @@ + +/*==================================================================== + * os_pi.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_pi.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:16 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_PI_H_ +#define _OS_PI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" +#include "os_thread.h" +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for Enhanced PI interface + */ + +/* + * OSTranxInfo is set up for Leo Disk DMA. This info will be maintained + * by exception handler. This is how the PIMGR and the ISR communicate. + */ + +typedef struct { + u32 errStatus; /* error status */ + void *dramAddr; /* RDRAM buffer address (DMA) */ + void *C2Addr; /* C2 buffer address */ + u32 sectorSize; /* size of transfering sector */ + u32 C1ErrNum; /* total # of C1 errors */ + u32 C1ErrSector[4]; /* error sectors */ +} __OSBlockInfo; + +typedef struct { + u32 cmdType; /* for disk only */ + u16 transferMode; /* Block, Track, or sector? */ + u16 blockNum; /* which block is transfering */ + s32 sectorNum; /* which sector is transfering */ + u32 devAddr; /* Device buffer address */ + u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */ + u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */ + __OSBlockInfo block[2]; /* bolck transfer info */ +} __OSTranxInfo; + + +typedef struct OSPiHandle_s { + struct OSPiHandle_s *next; /* point to next handle on the table */ + u8 type; /* DEVICE_TYPE_BULK for disk */ + u8 latency; /* domain latency */ + u8 pageSize; /* domain page size */ + u8 relDuration; /* domain release duration */ + u8 pulse; /* domain pulse width */ + u8 domain; /* which domain */ + u32 baseAddress; /* Domain address */ + u32 speed; /* for roms only */ + /* The following are "private" elements" */ + __OSTranxInfo transferInfo; /* for disk only */ +} OSPiHandle; + +typedef struct { + u8 type; + u32 address; +} OSPiInfo; + +/* + * Structure for I/O message block + */ +typedef struct { + u16 type; /* Message type */ + u8 pri; /* Message priority (High or Normal) */ + u8 status; /* Return status */ + OSMesgQueue *retQueue; /* Return message queue to notify I/O completion */ +} OSIoMesgHdr; + +typedef struct { + OSIoMesgHdr hdr; /* Message header */ + void *dramAddr; /* RDRAM buffer address (DMA) */ + u32 devAddr; /* Device buffer address (DMA) */ + u32 size; /* DMA transfer size in bytes */ + OSPiHandle *piHandle; /* PI device handle */ +} OSIoMesg; + +/* + * Structure for device manager block + */ +typedef struct { + s32 active; /* Status flag */ + OSThread *thread; /* Calling thread */ + OSMesgQueue *cmdQueue; /* Command queue */ + OSMesgQueue *evtQueue; /* Event queue */ + OSMesgQueue *acsQueue; /* Access queue */ + /* Raw DMA routine */ + s32 (*dma)(s32, u32, void *, u32); + s32 (*edma)(OSPiHandle *, s32, u32, void *, u32); +} OSDevMgr; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Flags to indicate direction of data transfer */ + +#define OS_READ 0 /* device -> RDRAM */ +#define OS_WRITE 1 /* device <- RDRAM */ +#define OS_OTHERS 2 /* for Leo disk only */ + +/* + * I/O message types + */ +#define OS_MESG_TYPE_BASE (10) +#define OS_MESG_TYPE_LOOPBACK (OS_MESG_TYPE_BASE + 0) +#define OS_MESG_TYPE_DMAREAD (OS_MESG_TYPE_BASE + 1) +#define OS_MESG_TYPE_DMAWRITE (OS_MESG_TYPE_BASE + 2) +#define OS_MESG_TYPE_VRETRACE (OS_MESG_TYPE_BASE + 3) +#define OS_MESG_TYPE_COUNTER (OS_MESG_TYPE_BASE + 4) +#define OS_MESG_TYPE_EDMAREAD (OS_MESG_TYPE_BASE + 5) +#define OS_MESG_TYPE_EDMAWRITE (OS_MESG_TYPE_BASE + 6) + +/* + * I/O message priority + */ +#define OS_MESG_PRI_NORMAL 0 +#define OS_MESG_PRI_HIGH 1 + +/* + * PI/EPI + */ +#define PI_DOMAIN1 0 +#define PI_DOMAIN2 1 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + +extern OSPiHandle *__osPiTable; /* The head of OSPiHandle link list */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +extern u32 osPiGetStatus(void); +extern s32 osPiGetDeviceType(void); +extern s32 osPiWriteIo(u32, u32); +extern s32 osPiReadIo(u32, u32 *); +extern s32 osPiStartDma(OSIoMesg *, s32, s32, u32, void *, u32, OSMesgQueue *); +extern void osCreatePiManager(OSPri, OSMesgQueue *, OSMesg *, s32); + +/* Enhanced PI interface */ + +extern OSPiHandle *osCartRomInit(void); +extern OSPiHandle *osLeoDiskInit(void); +extern OSPiHandle *osDriveRomInit(void); + +extern s32 osEPiDeviceType(OSPiHandle *, OSPiInfo *); +extern s32 osEPiWriteIo(OSPiHandle *, u32 , u32 ); +extern s32 osEPiReadIo(OSPiHandle *, u32 , u32 *); +extern s32 osEPiStartDma(OSPiHandle *, OSIoMesg *, s32); +extern s32 osEPiLinkHandle(OSPiHandle *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_PI_H_ */ diff --git a/lib/ultralib/include/PR/os_rdp.h b/lib/ultralib/include/PR/os_rdp.h new file mode 100644 index 0000000..6b3d288 --- /dev/null +++ b/lib/ultralib/include/PR/os_rdp.h @@ -0,0 +1,92 @@ + +/*==================================================================== + * os_rdp.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_rdp.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:16 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_RDP_H_ +#define _OS_RDP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Display processor interface (Dp) */ +extern u32 osDpGetStatus(void); +extern void osDpSetStatus(u32); +extern void osDpGetCounters(u32 *); +extern s32 osDpSetNextBuffer(void *, u64); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_RDP_H_ */ diff --git a/lib/ultralib/include/PR/os_reg.h b/lib/ultralib/include/PR/os_reg.h new file mode 100644 index 0000000..50aa218 --- /dev/null +++ b/lib/ultralib/include/PR/os_reg.h @@ -0,0 +1,90 @@ + +/*==================================================================== + * os_reg.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_reg.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:17 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_REG_H_ +#define _OS_REG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Miscellaneous operations */ + +extern u32 osGetCount(void); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_REG_H_ */ diff --git a/lib/ultralib/include/PR/os_rsp.h b/lib/ultralib/include/PR/os_rsp.h new file mode 100644 index 0000000..1211605 --- /dev/null +++ b/lib/ultralib/include/PR/os_rsp.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_rsp.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_rsp.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:17 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_RSP_H_ +#define _OS_RSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_RSP_H_ */ diff --git a/lib/ultralib/include/PR/os_si.h b/lib/ultralib/include/PR/os_si.h new file mode 100644 index 0000000..23b07c0 --- /dev/null +++ b/lib/ultralib/include/PR/os_si.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_si.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_si.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:18 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_SI_H_ +#define _OS_SI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_SI_H_ */ diff --git a/lib/ultralib/include/PR/os_system.h b/lib/ultralib/include/PR/os_system.h new file mode 100644 index 0000000..1179189 --- /dev/null +++ b/lib/ultralib/include/PR/os_system.h @@ -0,0 +1,118 @@ + +/*==================================================================== + * os_system.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_system.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:18 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_SYSTEM_H_ +#define _OS_SYSTEM_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Values for osTvType + */ +#define OS_TV_PAL 0 +#define OS_TV_NTSC 1 +#define OS_TV_MPAL 2 + +/* + * Size of buffer the retains contents after NMI + */ +#define OS_APP_NMI_BUFSIZE 64 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + +extern s32 osRomType; /* Bulk or cartridge ROM. 0=cartridge 1=bulk */ +extern void *osRomBase; /* Rom base address of the game image */ +extern s32 osTvType; /* 0 = PAL, 1 = NTSC, 2 = MPAL */ +extern s32 osResetType; /* 0 = cold reset, 1 = NMI */ +extern s32 osCicId; +extern s32 osVersion; +extern u32 osMemSize; /* Memory Size */ +extern s32 osAppNMIBuffer[]; + +extern u64 osClockRate; + +extern OSIntMask __OSGlobalIntMask; /* global interrupt mask */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +extern void osInitialize(void); +extern void osExit(void); +extern u32 osGetMemSize(void); + +/* pre-NMI */ +extern s32 osAfterPreNMI(void); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_SYSTEM_H_ */ diff --git a/lib/ultralib/include/PR/os_thread.h b/lib/ultralib/include/PR/os_thread.h new file mode 100644 index 0000000..68c8e74 --- /dev/null +++ b/lib/ultralib/include/PR/os_thread.h @@ -0,0 +1,161 @@ + +/*==================================================================== + * os_thread.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_thread.h,v $ + $Revision: 1.3 $ + $Date: 1999/06/15 12:39:40 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_THREAD_H_ +#define _OS_THREAD_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef s32 OSPri; +typedef s32 OSId; + +typedef union { + struct { + f32 f_odd; + f32 f_even; + } f; + f64 d; +} __OSfp; + +typedef struct { + u64 at, v0, v1, a0, a1, a2, a3; + u64 t0, t1, t2, t3, t4, t5, t6, t7; + u64 s0, s1, s2, s3, s4, s5, s6, s7; + u64 t8, t9; + u64 gp, sp, s8, ra; + u64 lo, hi; + u32 sr, pc, cause, badvaddr, rcp; + u32 fpcsr; + __OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14; + __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30; +} __OSThreadContext; + +typedef struct { + u32 flag; + u32 count; + u64 time; +} __OSThreadprofile_s; + +typedef struct OSThread_s { + struct OSThread_s *next; /* run/mesg queue link */ + OSPri priority; /* run/mesg queue priority */ + struct OSThread_s **queue; /* queue thread is on */ + struct OSThread_s *tlnext; /* all threads queue link */ + u16 state; /* OS_STATE_* */ + u16 flags; /* flags for rmon */ + OSId id; /* id for debugging */ + int fp; /* thread has used fp unit */ + __OSThreadprofile_s *thprof; /* workarea for thread profiler */ + __OSThreadContext context; /* register/interrupt mask */ +} OSThread; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Thread states */ + +#define OS_STATE_STOPPED (1 << 0) +#define OS_STATE_RUNNABLE (1 << 1) +#define OS_STATE_RUNNING (1 << 2) +#define OS_STATE_WAITING (1 << 3) + +/* Recommended thread priorities for the system threads */ + +#define OS_PRIORITY_MAX 255 +#define OS_PRIORITY_VIMGR 254 +#define OS_PRIORITY_RMON 250 +#define OS_PRIORITY_RMONSPIN 200 +#define OS_PRIORITY_PIMGR 150 +#define OS_PRIORITY_SIMGR 140 +#define OS_PRIORITY_APPMAX 127 +#define OS_PRIORITY_IDLE 0 /* Must be 0 */ + +/* For thread profiler */ +#define THPROF_IDMAX 64 +#define THPROF_STACKSIZE 256 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Thread operations */ + +extern void osCreateThread(OSThread *, OSId, void (*)(void *), void *, void *, OSPri); +extern void osDestroyThread(OSThread *); +extern void osYieldThread(void); +extern void osStartThread(OSThread *); +extern void osStopThread(OSThread *); +extern OSId osGetThreadId(OSThread *); +extern void osSetThreadPri(OSThread *, OSPri); +extern OSPri osGetThreadPri(OSThread *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_THREAD_H_ */ diff --git a/lib/ultralib/include/PR/os_time.h b/lib/ultralib/include/PR/os_time.h new file mode 100644 index 0000000..deaec65 --- /dev/null +++ b/lib/ultralib/include/PR/os_time.h @@ -0,0 +1,114 @@ + +/*==================================================================== + * os_time.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_time.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:19 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_TIME_H_ +#define _OS_TIME_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for time value + */ +typedef u64 OSTime; + +/* + * Structure for interval timer + */ +typedef struct OSTimer_s { + struct OSTimer_s *next; /* point to next timer in list */ + struct OSTimer_s *prev; /* point to previous timer in list */ + OSTime interval; /* duration set by user */ + OSTime value; /* time remaining before */ + /* timer fires */ + OSMesgQueue *mq; /* Message Queue */ + OSMesg msg; /* Message to send */ +} OSTimer; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Timer interface */ + +extern OSTime osGetTime(void); +extern void osSetTime(OSTime); +extern int osSetTimer(OSTimer *, OSTime, OSTime, + OSMesgQueue *, OSMesg); +extern int osStopTimer(OSTimer *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_TIME_H_ */ diff --git a/lib/ultralib/include/PR/os_tlb.h b/lib/ultralib/include/PR/os_tlb.h new file mode 100644 index 0000000..2cdd5c9 --- /dev/null +++ b/lib/ultralib/include/PR/os_tlb.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * os_tlb.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_tlb.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:20 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_TLB_H_ +#define _OS_TLB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSPageMask; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Page size argument for TLB routines + */ +#define OS_PM_4K 0x0000000 +#define OS_PM_16K 0x0006000 +#define OS_PM_64K 0x001e000 +#define OS_PM_256K 0x007e000 +#define OS_PM_1M 0x01fe000 +#define OS_PM_4M 0x07fe000 +#define OS_PM_16M 0x1ffe000 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* TLB management routines */ + +extern void osMapTLB(s32, OSPageMask, void *, u32, u32, s32); +extern void osMapTLBRdb(void); +extern void osUnmapTLB(s32); +extern void osUnmapTLBAll(void); +extern void osSetTLBASID(s32); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_TLB_H_ */ diff --git a/lib/ultralib/include/PR/os_version.h b/lib/ultralib/include/PR/os_version.h new file mode 100644 index 0000000..95d2b1a --- /dev/null +++ b/lib/ultralib/include/PR/os_version.h @@ -0,0 +1,27 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_version.h,v $ + $Revision: 1.2 $ + $Date: 1999/06/17 01:33:01 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VERSION_H_ +#define _OS_VERSION_H_ + +#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_I_P 7 +#define VERSION_J 8 +#define VERSION_K 9 +#define VERSION_L 10 + +#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/PR/os_vi.h b/lib/ultralib/include/PR/os_vi.h new file mode 100644 index 0000000..5a17f25 --- /dev/null +++ b/lib/ultralib/include/PR/os_vi.h @@ -0,0 +1,298 @@ + +/*==================================================================== + * os_vi.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_vi.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:20 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VI_H_ +#define _OS_VI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_thread.h" +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure to store VI register values that remain the same between 2 fields + */ +typedef struct { + u32 ctrl; + u32 width; + u32 burst; + u32 vSync; + u32 hSync; + u32 leap; + u32 hStart; + u32 xScale; + u32 vCurrent; +} OSViCommonRegs; + + +/* + * Structure to store VI register values that change between fields + */ +typedef struct { + u32 origin; + u32 yScale; + u32 vStart; + u32 vBurst; + u32 vIntr; +} OSViFieldRegs; + + +/* + * Structure for VI mode + */ +typedef struct { + u8 type; /* Mode type */ + OSViCommonRegs comRegs; /* Common registers for both fields */ + OSViFieldRegs fldRegs[2]; /* Registers for Field 1 & 2 */ +} OSViMode; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Video Interface (VI) mode type + */ +#define OS_VI_NTSC_LPN1 0 /* NTSC */ +#define OS_VI_NTSC_LPF1 1 +#define OS_VI_NTSC_LAN1 2 +#define OS_VI_NTSC_LAF1 3 +#define OS_VI_NTSC_LPN2 4 +#define OS_VI_NTSC_LPF2 5 +#define OS_VI_NTSC_LAN2 6 +#define OS_VI_NTSC_LAF2 7 +#define OS_VI_NTSC_HPN1 8 +#define OS_VI_NTSC_HPF1 9 +#define OS_VI_NTSC_HAN1 10 +#define OS_VI_NTSC_HAF1 11 +#define OS_VI_NTSC_HPN2 12 +#define OS_VI_NTSC_HPF2 13 + +#define OS_VI_PAL_LPN1 14 /* PAL */ +#define OS_VI_PAL_LPF1 15 +#define OS_VI_PAL_LAN1 16 +#define OS_VI_PAL_LAF1 17 +#define OS_VI_PAL_LPN2 18 +#define OS_VI_PAL_LPF2 19 +#define OS_VI_PAL_LAN2 20 +#define OS_VI_PAL_LAF2 21 +#define OS_VI_PAL_HPN1 22 +#define OS_VI_PAL_HPF1 23 +#define OS_VI_PAL_HAN1 24 +#define OS_VI_PAL_HAF1 25 +#define OS_VI_PAL_HPN2 26 +#define OS_VI_PAL_HPF2 27 + +#define OS_VI_MPAL_LPN1 28 /* MPAL - mainly Brazil */ +#define OS_VI_MPAL_LPF1 29 +#define OS_VI_MPAL_LAN1 30 +#define OS_VI_MPAL_LAF1 31 +#define OS_VI_MPAL_LPN2 32 +#define OS_VI_MPAL_LPF2 33 +#define OS_VI_MPAL_LAN2 34 +#define OS_VI_MPAL_LAF2 35 +#define OS_VI_MPAL_HPN1 36 +#define OS_VI_MPAL_HPF1 37 +#define OS_VI_MPAL_HAN1 38 +#define OS_VI_MPAL_HAF1 39 +#define OS_VI_MPAL_HPN2 40 +#define OS_VI_MPAL_HPF2 41 + +#define OS_VI_FPAL_LPN1 42 /* FPAL - Full screen PAL */ +#define OS_VI_FPAL_LPF1 43 +#define OS_VI_FPAL_LAN1 44 +#define OS_VI_FPAL_LAF1 45 +#define OS_VI_FPAL_LPN2 46 +#define OS_VI_FPAL_LPF2 47 +#define OS_VI_FPAL_LAN2 48 +#define OS_VI_FPAL_LAF2 49 +#define OS_VI_FPAL_HPN1 50 +#define OS_VI_FPAL_HPF1 51 +#define OS_VI_FPAL_HAN1 52 +#define OS_VI_FPAL_HAF1 53 +#define OS_VI_FPAL_HPN2 54 +#define OS_VI_FPAL_HPF2 55 + +/* + * Video Interface (VI) special features + */ +#define OS_VI_GAMMA_ON 0x0001 +#define OS_VI_GAMMA_OFF 0x0002 +#define OS_VI_GAMMA_DITHER_ON 0x0004 +#define OS_VI_GAMMA_DITHER_OFF 0x0008 +#define OS_VI_DIVOT_ON 0x0010 +#define OS_VI_DIVOT_OFF 0x0020 +#define OS_VI_DITHER_FILTER_ON 0x0040 +#define OS_VI_DITHER_FILTER_OFF 0x0080 + +/* + * Video Interface (VI) mode attribute bit + */ +#define OS_VI_BIT_NONINTERLACE 0x0001 /* lo-res */ +#define OS_VI_BIT_INTERLACE 0x0002 /* lo-res */ +#define OS_VI_BIT_NORMALINTERLACE 0x0004 /* hi-res */ +#define OS_VI_BIT_DEFLICKINTERLACE 0x0008 /* hi-res */ +#define OS_VI_BIT_ANTIALIAS 0x0010 +#define OS_VI_BIT_POINTSAMPLE 0x0020 +#define OS_VI_BIT_16PIXEL 0x0040 +#define OS_VI_BIT_32PIXEL 0x0080 +#define OS_VI_BIT_LORES 0x0100 +#define OS_VI_BIT_HIRES 0x0200 +#define OS_VI_BIT_NTSC 0x0400 +#define OS_VI_BIT_PAL 0x0800 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + +extern OSViMode osViModeTable[]; /* Global VI mode table */ + +extern OSViMode osViModeNtscLpn1; /* Individual VI NTSC modes */ +extern OSViMode osViModeNtscLpf1; +extern OSViMode osViModeNtscLan1; +extern OSViMode osViModeNtscLaf1; +extern OSViMode osViModeNtscLpn2; +extern OSViMode osViModeNtscLpf2; +extern OSViMode osViModeNtscLan2; +extern OSViMode osViModeNtscLaf2; +extern OSViMode osViModeNtscHpn1; +extern OSViMode osViModeNtscHpf1; +extern OSViMode osViModeNtscHan1; +extern OSViMode osViModeNtscHaf1; +extern OSViMode osViModeNtscHpn2; +extern OSViMode osViModeNtscHpf2; + +extern OSViMode osViModePalLpn1; /* Individual VI PAL modes */ +extern OSViMode osViModePalLpf1; +extern OSViMode osViModePalLan1; +extern OSViMode osViModePalLaf1; +extern OSViMode osViModePalLpn2; +extern OSViMode osViModePalLpf2; +extern OSViMode osViModePalLan2; +extern OSViMode osViModePalLaf2; +extern OSViMode osViModePalHpn1; +extern OSViMode osViModePalHpf1; +extern OSViMode osViModePalHan1; +extern OSViMode osViModePalHaf1; +extern OSViMode osViModePalHpn2; +extern OSViMode osViModePalHpf2; + +extern OSViMode osViModeMpalLpn1; /* Individual VI MPAL modes */ +extern OSViMode osViModeMpalLpf1; +extern OSViMode osViModeMpalLan1; +extern OSViMode osViModeMpalLaf1; +extern OSViMode osViModeMpalLpn2; +extern OSViMode osViModeMpalLpf2; +extern OSViMode osViModeMpalLan2; +extern OSViMode osViModeMpalLaf2; +extern OSViMode osViModeMpalHpn1; +extern OSViMode osViModeMpalHpf1; +extern OSViMode osViModeMpalHan1; +extern OSViMode osViModeMpalHaf1; +extern OSViMode osViModeMpalHpn2; +extern OSViMode osViModeMpalHpf2; + +extern OSViMode osViModeFpalLpn1; /* Individual VI FPAL modes */ +extern OSViMode osViModeFpalLpf1; +extern OSViMode osViModeFpalLan1; +extern OSViMode osViModeFpalLaf1; +extern OSViMode osViModeFpalLpn2; +extern OSViMode osViModeFpalLpf2; +extern OSViMode osViModeFpalLan2; +extern OSViMode osViModeFpalLaf2; +extern OSViMode osViModeFpalHpn1; +extern OSViMode osViModeFpalHpf1; +extern OSViMode osViModeFpalHan1; +extern OSViMode osViModeFpalHaf1; +extern OSViMode osViModeFpalHpn2; +extern OSViMode osViModeFpalHpf2; + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Video interface (Vi) */ +extern u32 osViGetStatus(void); +extern u32 osViGetCurrentMode(void); +extern u32 osViGetCurrentLine(void); +extern u32 osViGetCurrentField(void); +extern void *osViGetCurrentFramebuffer(void); +extern void *osViGetNextFramebuffer(void); +extern void osViSetXScale(f32); +extern void osViSetYScale(f32); +extern void osViExtendVStart(u32); +extern void osViSetSpecialFeatures(u32); +extern void osViSetMode(OSViMode *); +extern void osViSetEvent(OSMesgQueue *, OSMesg, u32); +extern void osViSwapBuffer(void *); +extern void osViBlack(u8); +extern void osViFade(u8, u16); +extern void osViRepeatLine(u8); +extern void osCreateViManager(OSPri); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_VI_H_ */ diff --git a/lib/ultralib/include/PR/os_voice.h b/lib/ultralib/include/PR/os_voice.h new file mode 100644 index 0000000..4e3cf6e --- /dev/null +++ b/lib/ultralib/include/PR/os_voice.h @@ -0,0 +1,108 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_voice.h,v $ + $Revision: 1.2 $ + $Date: 1999/07/13 08:36:42 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VOICE_H_ +#define _OS_VOICE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { /* Voice Recognition System */ + OSMesgQueue *__mq; /* SI Message Queue */ + int __channel; /* Controller Port # */ + s32 __mode; + u8 cmd_status; /* Command Status */ +} OSVoiceHandle; + +typedef struct { /* Voice Recognition System */ + u16 warning; + u16 answer_num; /* 0...5 */ + u16 voice_level; + u16 voice_sn; + u16 voice_time; + u16 answer[5]; + u16 distance[5]; +} OSVoiceData; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* definition for Voice Recognition System */ + +#define VOICE_WARN_TOO_SMALL 0x0400 +#define VOICE_WARN_TOO_LARGE 0x0800 +#define VOICE_WARN_NOT_FIT 0x4000 +#define VOICE_WARN_TOO_NOISY 0x8000 + +#define VOICE_STATUS_READY 0 +#define VOICE_STATUS_START 1 +#define VOICE_STATUS_CANCEL 3 +#define VOICE_STATUS_BUSY 5 +#define VOICE_STATUS_END 7 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Voice Recognition System */ +extern s32 osVoiceInit(OSMesgQueue *, OSVoiceHandle *, int); +extern s32 osVoiceCheckWord(u8 *data); +extern s32 osVoiceClearDictionary(OSVoiceHandle *, u8); +extern s32 osVoiceControlGain(OSVoiceHandle *, s32, s32); +extern s32 osVoiceSetWord(OSVoiceHandle *, u8 *); +extern s32 osVoiceStartReadData(OSVoiceHandle *); +extern s32 osVoiceStopReadData(OSVoiceHandle *); +extern s32 osVoiceGetReadData(OSVoiceHandle *, OSVoiceData *); +extern s32 osVoiceMaskDictionary(OSVoiceHandle *, u8 *, int); +extern void osVoiceCountSyllables(u8 *, u32 *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_VOICE_H_ */ diff --git a/lib/ultralib/include/PR/ramrom.h b/lib/ultralib/include/PR/ramrom.h new file mode 100644 index 0000000..42e5c2d --- /dev/null +++ b/lib/ultralib/include/PR/ramrom.h @@ -0,0 +1,113 @@ +#ifndef _RAMROM_H +#define _RAMROM_H + +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.20 $ + * $Date: 1997/02/11 08:26:47 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ramrom.h,v $ + * + **************************************************************************/ + +/* + * Defines for the GIO card in the Nintendo Development Station + * + * The RAM on the GIO card acts as ROM for the game + * Interrupts available between the game and the Indy host + * + * The last part of the ramrom is used for communication between + * game and host. There are 6 4K buffers defined: + * log, printf, rmon to indy, rmon from indy, app to indy, app from indy + * The last 8 bytes of the buffer are used in the emulator environment + */ + +#define RAMROM_SIZE (0x1000000) + +#define RAMROM_BUF_SIZE (4096) +#define RAMROM_MSG_SIZE (RAMROM_BUF_SIZE*6) +#define RAMROM_MSG_ADDR (RAMROM_SIZE - RAMROM_MSG_SIZE) +#define RAMROM_MSG_HDR_SIZE (3*sizeof(long)) +#define RAMROM_USER_DATA_SIZE (RAMROM_MSG_SIZE-RAMROM_MSG_HDR_SIZE) + +#define RAMROM_APP_READ_ADDR (RAMROM_MSG_ADDR + (0*RAMROM_BUF_SIZE)) +#define RAMROM_APP_WRITE_ADDR (RAMROM_MSG_ADDR + (1*RAMROM_BUF_SIZE)) +#define RAMROM_RMON_READ_ADDR (RAMROM_MSG_ADDR + (2*RAMROM_BUF_SIZE)) +#define RAMROM_RMON_WRITE_ADDR (RAMROM_MSG_ADDR + (3*RAMROM_BUF_SIZE)) +#define RAMROM_PRINTF_ADDR (RAMROM_MSG_ADDR + (4*RAMROM_BUF_SIZE)) +#define RAMROM_LOG_ADDR (RAMROM_MSG_ADDR + (5*RAMROM_BUF_SIZE)) + +/*#define RAMROM_GIO_INTERRUPT (RAMROM_MSG_ADDR + RAMROM_MSG_SIZE - 4)*/ + +/* + * For the initial round of PIF bringup, we will load in a bootstrap loader + * 0x400 bytes into the ramrom, and the rom will be loaded at 0x2000 + */ +#ifndef _HW_VERSION_1 +#define RAMROM_BOOTSTRAP_OFFSET 0x40 +#define RAMROM_GAME_OFFSET 0x1000 +#define RAMROM_FONTDATA_OFFSET 0xb70 +#define RAMROM_FONTDATA_SIZE 1152 +#else +#define RAMROM_BOOTSTRAP_OFFSET 0x400 +#define RAMROM_GAME_OFFSET 0x2000 +#endif +#define RAMROM_CLOCKRATE_OFFSET 0x4 +#define RAMROM_CLOCKRATE_MASK 0xfffffff0 +#define RAMROM_BOOTADDR_OFFSET 0x8 +#define RAMROM_RELEASE_OFFSET 0xc +/* + * Second version of the PIF jumps to location 0x1000, and we'll put a jump to + * location 0x400 into the ramrom (for backwards compatibility). + */ +#define RAMROM_PIF2BOOTSTRAP_OFFSET 0x1000 + +typedef struct { + long type; + long length; /* in bytes of userdata */ + long magic; + char userdata[RAMROM_USER_DATA_SIZE]; +} RamRomBuffer; + +/* + * Interrupt values (must fit in 6 bits!) + * values are used for both request & response + * Transactions initiated by the host start with HOST + * and those initiated by the target start with GAME. + */ + +#define HOST_PIACCESS_REQ 1 +#define HOST_DBG_CMD_READY 2 +#define GAME_DBG_DATA_SEND 3 +#define HOST_DBG_DATA_ACK 4 +#define GAME_PRINTF_SEND 5 +#define HOST_PRINTF_ACK 6 +#define GAME_LOG_SEND 7 +#define HOST_LOG_ACK 8 +#define HOST_APP_CMD_READY 9 +#define GAME_APP_DATA_READY 10 +#define HOST_PROF_REQ 11 +#define GAME_PROF_SEND 12 +#define HOST_PROF_ACK 13 +#define GAME_FAULT_SEND 14 +#define HOST_FAULT_ACK 15 +#define GAME_EXIT 16 +#define HOST_DATA_ACK 17 + +#ifdef _EMULATOR +void __RamRomInit(int key, void *romaddr); +void __RamRomDestroy(int key); +#endif /* _EMULATOR */ + +#endif /* !_RAMROM_H */ diff --git a/lib/ultralib/include/PR/rcp.h b/lib/ultralib/include/PR/rcp.h new file mode 100644 index 0000000..47c4b34 --- /dev/null +++ b/lib/ultralib/include/PR/rcp.h @@ -0,0 +1,848 @@ +#ifndef _RCP_H_ +#define _RCP_H_ + +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * File: rcp.h + * + * This file contains register and bit definitions for RCP memory map. + * $Revision: 1.22 $ + * $Date: 1999/05/20 03:01:49 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/rcp.h,v $ + * + **************************************************************************/ + +#include "R4300.h" +#include "ultratypes.h" + +/** + * RCP memory map overview: + * + * 0x0000_0000 .. 0x03ef_ffff RDRAM memory + * 0x03f0_0000 .. 0x03ff_ffff RDRAM registers + * + * 0x0400_0000 .. 0x0400_2000 SP memory + * 0x0404_0000 .. 0x040f_ffff SP registers + * 0x0410_0000 .. 0x041f_ffff DP command registers + * 0x0420_0000 .. 0x042f_ffff DP span registers + * 0x0430_0000 .. 0x043f_ffff MI registers + * 0x0440_0000 .. 0x044f_ffff VI registers + * 0x0450_0000 .. 0x045f_ffff AI registers + * 0x0460_0000 .. 0x046f_ffff PI registers + * 0x0470_0000 .. 0x047f_ffff RI registers + * 0x0480_0000 .. 0x048f_ffff SI registers + * 0x0490_0000 .. 0x04ff_ffff unused + * + * 0x0500_0000 .. 0x05ff_ffff cartridge domain 2 + * 0x0600_0000 .. 0x07ff_ffff cartridge domain 1 + * 0x0800_0000 .. 0x0fff_ffff cartridge domain 2 + * 0x1000_0000 .. 0x1fbf_ffff cartridge domain 1 + * + * 0x1fc0_0000 .. 0x1fc0_07bf PIF Boot Rom (1984 bytes) + * 0x1fc0_07c0 .. 0x1fc0_07ff PIF (JoyChannel) RAM (64 bytes) + * 0x1fc0_0800 .. 0x1fcf_ffff Reserved + * 0x1fd0_0000 .. 0x7fff_ffff cartridge domain 1 + * 0x8000_0000 .. 0xffff_ffff external SysAD device + */ + +/** + * RDRAM memory + */ + +#define RDRAM_0_START 0x00000000 +#define RDRAM_0_END 0x001FFFFF +#define RDRAM_1_START 0x00200000 +#define RDRAM_1_END 0x003FFFFF + +#define RDRAM_START RDRAM_0_START +#define RDRAM_END RDRAM_1_END + +/** + * RDRAM registers + */ +#define RDRAM_BASE_REG 0x03F00000 + +#define RDRAM_CONFIG_REG (RDRAM_BASE_REG + 0x00) +#define RDRAM_DEVICE_TYPE_REG (RDRAM_BASE_REG + 0x00) +#define RDRAM_DEVICE_ID_REG (RDRAM_BASE_REG + 0x04) +#define RDRAM_DELAY_REG (RDRAM_BASE_REG + 0x08) +#define RDRAM_MODE_REG (RDRAM_BASE_REG + 0x0c) +#define RDRAM_REF_INTERVAL_REG (RDRAM_BASE_REG + 0x10) +#define RDRAM_REF_ROW_REG (RDRAM_BASE_REG + 0x14) +#define RDRAM_RAS_INTERVAL_REG (RDRAM_BASE_REG + 0x18) +#define RDRAM_MIN_INTERVAL_REG (RDRAM_BASE_REG + 0x1c) +#define RDRAM_ADDR_SELECT_REG (RDRAM_BASE_REG + 0x20) +#define RDRAM_DEVICE_MANUF_REG (RDRAM_BASE_REG + 0x24) + +#define RDRAM_0_DEVICE_ID 0 +#define RDRAM_1_DEVICE_ID 1 + +#define RDRAM_RESET_MODE 0 +#define RDRAM_ACTIVE_MODE 1 +#define RDRAM_STANDBY_MODE 2 + +#define RDRAM_LENGTH (2 * 512 * 2048) +#define RDRAM_0_BASE_ADDRESS (RDRAM_0_DEVICE_ID * RDRAM_LENGTH) +#define RDRAM_1_BASE_ADDRESS (RDRAM_1_DEVICE_ID * RDRAM_LENGTH) + +#define RDRAM_0_CONFIG 0x00000 +#define RDRAM_1_CONFIG 0x00400 +#define RDRAM_GLOBAL_CONFIG 0x80000 + +/** + * PIF Physical memory map (total size = 2 KB) + * + * Size Description Mode + * 1FC007FF +-------+-----------------+-----+ + * | 64 B | JoyChannel RAM | R/W | + * 1FC007C0 +-------+-----------------+-----+ + * |1984 B | Boot ROM | * | * = Reserved + * 1FC00000 +-------+-----------------+-----+ + */ +#define PIF_ROM_START 0x1FC00000 +#define PIF_ROM_END 0x1FC007BF +#define PIF_RAM_START 0x1FC007C0 +#define PIF_RAM_END 0x1FC007FF + + +/** + * Controller channel + * Each game controller channel has 4 error bits that are defined in bit 6-7 of + * the Rx and Tx data size area bytes. Programmers need to clear these bits + * when setting the Tx/Rx size area values for a channel + */ +#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */ +#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */ +#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */ +#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */ + +#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */ + + +/** + * External device info + */ +#define DEVICE_TYPE_CART 0 /* ROM cartridge */ +#define DEVICE_TYPE_BULK 1 /* ROM bulk */ +#define DEVICE_TYPE_64DD 2 /* 64 Disk Drive */ +#define DEVICE_TYPE_SRAM 3 /* SRAM */ +/* 4-6 are reserved */ +#define DEVICE_TYPE_INIT 7 /* initial value */ +/* 8-14 are reserved */ + +/** + * Signal Processor (SP) Memory + */ +#define SP_DMEM_START 0x04000000 +#define SP_DMEM_END 0x04000FFF +#define SP_IMEM_START 0x04001000 +#define SP_IMEM_END 0x04001FFF + +/** + * Signal Processor (SP) CP0 Registers + */ + +#define SP_BASE_REG 0x04040000 + +/* SP memory address (R/W): [11:0] DMEM/IMEM address, [12] 0=DMEM,1=IMEM */ +#define SP_MEM_ADDR_REG (SP_BASE_REG + 0x00) + +/* SP DRAM DMA address (R/W): [23:0] RDRAM address */ +#define SP_DRAM_ADDR_REG (SP_BASE_REG + 0x04) + +/* SP read DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip; RDRAM -> I/DMEM */ +#define SP_RD_LEN_REG (SP_BASE_REG + 0x08) + +/* SP write DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip; I/DMEM -> RDRAM */ +#define SP_WR_LEN_REG (SP_BASE_REG + 0x0C) + +/* SP status (R/W): [14:0] valid bits; see below for write/read mode */ +#define SP_STATUS_REG (SP_BASE_REG + 0x10) + +/* SP DMA full (R): [0] dma full */ +#define SP_DMA_FULL_REG (SP_BASE_REG + 0x14) + +/* SP DMA busy (R): [0] dma busy */ +#define SP_DMA_BUSY_REG (SP_BASE_REG + 0x18) + +/* SP semaphore (R/W): Read: [0] acquire semaphore; Write: [] release semaphore */ +#define SP_SEMAPHORE_REG (SP_BASE_REG + 0x1C) + +/* SP PC (R/W): [11:0] program counter */ +#define SP_PC_REG 0x04080000 + +/** + * SP_MEM_ADDR_REG: bit 12 + */ +#define SP_DMA_DMEM (0 << 12) +#define SP_DMA_IMEM (1 << 12) + +/** + * SP_STATUS_REG: write bits + */ +#define SP_CLR_HALT (1 << 0) /* clear halt */ +#define SP_SET_HALT (1 << 1) /* set halt */ +#define SP_CLR_BROKE (1 << 2) /* clear broke */ +#define SP_CLR_INTR (1 << 3) /* clear interrupt */ +#define SP_SET_INTR (1 << 4) /* set interrupt */ +#define SP_CLR_SSTEP (1 << 5) /* clear sstep */ +#define SP_SET_SSTEP (1 << 6) /* set sstep */ +#define SP_CLR_INTR_BREAK (1 << 7) /* clear interrupt on break */ +#define SP_SET_INTR_BREAK (1 << 8) /* set interrupt on break */ +#define SP_CLR_SIG0 (1 << 9) /* clear signal 0 */ +#define SP_SET_SIG0 (1 << 10) /* set signal 0 */ +#define SP_CLR_SIG1 (1 << 11) /* clear signal 1 */ +#define SP_SET_SIG1 (1 << 12) /* set signal 1 */ +#define SP_CLR_SIG2 (1 << 13) /* clear signal 2 */ +#define SP_SET_SIG2 (1 << 14) /* set signal 2 */ +#define SP_CLR_SIG3 (1 << 15) /* clear signal 3 */ +#define SP_SET_SIG3 (1 << 16) /* set signal 3 */ +#define SP_CLR_SIG4 (1 << 17) /* clear signal 4 */ +#define SP_SET_SIG4 (1 << 18) /* set signal 4 */ +#define SP_CLR_SIG5 (1 << 19) /* clear signal 5 */ +#define SP_SET_SIG5 (1 << 20) /* set signal 5 */ +#define SP_CLR_SIG6 (1 << 21) /* clear signal 6 */ +#define SP_SET_SIG6 (1 << 22) /* set signal 6 */ +#define SP_CLR_SIG7 (1 << 23) /* clear signal 7 */ +#define SP_SET_SIG7 (1 << 24) /* set signal 7 */ + +/* + * SP_STATUS_REG: read bits + */ +#define SP_STATUS_HALT (1 << 0) +#define SP_STATUS_BROKE (1 << 1) +#define SP_STATUS_DMA_BUSY (1 << 2) +#define SP_STATUS_DMA_FULL (1 << 3) +#define SP_STATUS_IO_FULL (1 << 4) +#define SP_STATUS_SSTEP (1 << 5) +#define SP_STATUS_INTR_BREAK (1 << 6) +#define SP_STATUS_SIG0 (1 << 7) +#define SP_STATUS_SIG1 (1 << 8) +#define SP_STATUS_SIG2 (1 << 9) +#define SP_STATUS_SIG3 (1 << 10) +#define SP_STATUS_SIG4 (1 << 11) +#define SP_STATUS_SIG5 (1 << 12) +#define SP_STATUS_SIG6 (1 << 13) +#define SP_STATUS_SIG7 (1 << 14) + +/* + * SP_STATUS_REG: use of SIG bits + */ +#define SP_CLR_YIELD SP_CLR_SIG0 +#define SP_SET_YIELD SP_SET_SIG0 +#define SP_STATUS_YIELD SP_STATUS_SIG0 +#define SP_CLR_YIELDED SP_CLR_SIG1 +#define SP_SET_YIELDED SP_SET_SIG1 +#define SP_STATUS_YIELDED SP_STATUS_SIG1 +#define SP_CLR_TASKDONE SP_CLR_SIG2 +#define SP_SET_TASKDONE SP_SET_SIG2 +#define SP_STATUS_TASKDONE SP_STATUS_SIG2 +#define SP_CLR_RSPSIGNAL SP_CLR_SIG3 +#define SP_SET_RSPSIGNAL SP_SET_SIG3 +#define SP_STATUS_RSPSIGNAL SP_STATUS_SIG3 +#define SP_CLR_CPUSIGNAL SP_CLR_SIG4 +#define SP_SET_CPUSIGNAL SP_SET_SIG4 +#define SP_STATUS_CPUSIGNAL SP_STATUS_SIG4 + +/* + * SP IMEM BIST REG (R/W): [6:0] BIST status bits; see below for detail + */ +#define SP_IBIST_REG 0x04080004 + +/* + * SP_IBIST_REG: write bits + */ +#define SP_IBIST_CHECK (1 << 0) /* BIST check */ +#define SP_IBIST_GO (1 << 1) /* BIST go */ +#define SP_IBIST_CLEAR (1 << 2) /* BIST clear */ + +/* + * SP_BIST_REG: read bits + * First 2 bits are same as in write mode + */ +#define SP_IBIST_DONE (1 << 2) +#define SP_IBIST_FAILED 0x78 /* bits [6:3], BIST fail */ + +/** + * Display Processor Command (DPC) Registers + */ +#define DPC_BASE_REG 0x04100000 + +/* DP CMD DMA start (R/W): [23:0] DMEM/RDRAM start address */ +#define DPC_START_REG (DPC_BASE_REG + 0x00) + +/* DP CMD DMA end (R/W): [23:0] DMEM/RDRAM end address */ +#define DPC_END_REG (DPC_BASE_REG + 0x04) + +/* DP CMD DMA end (R): [23:0] DMEM/RDRAM current address */ +#define DPC_CURRENT_REG (DPC_BASE_REG + 0x08) + +/* DP CMD status (R/W): [9:0] valid bits - see below for definitions */ +#define DPC_STATUS_REG (DPC_BASE_REG + 0x0C) + +/* DP clock counter (R): [23:0] clock counter */ +#define DPC_CLOCK_REG (DPC_BASE_REG + 0x10) + +/* DP buffer busy counter (R): [23:0] clock counter */ +#define DPC_BUFBUSY_REG (DPC_BASE_REG + 0x14) + +/* DP pipe busy counter (R): [23:0] clock counter */ +#define DPC_PIPEBUSY_REG (DPC_BASE_REG + 0x18) + +/* DP TMEM load counter (R): [23:0] clock counter */ +#define DPC_TMEM_REG (DPC_BASE_REG + 0x1C) + +/** + * DPC_STATUS_REG: write bits + */ +#define DPC_CLR_XBUS_DMEM_DMA (1 << 0) +#define DPC_SET_XBUS_DMEM_DMA (1 << 1) +#define DPC_CLR_FREEZE (1 << 2) +#define DPC_SET_FREEZE (1 << 3) +#define DPC_CLR_FLUSH (1 << 4) +#define DPC_SET_FLUSH (1 << 5) +#define DPC_CLR_TMEM_CTR (1 << 6) +#define DPC_CLR_PIPE_CTR (1 << 7) +#define DPC_CLR_CMD_CTR (1 << 8) +#define DPC_CLR_CLOCK_CTR (1 << 9) + +/** + * DPC_STATUS_REG: read bits + */ +#define DPC_STATUS_XBUS_DMEM_DMA (1 << 0) +#define DPC_STATUS_FREEZE (1 << 1) +#define DPC_STATUS_FLUSH (1 << 2) +#define DPC_STATUS_START_GCLK (1 << 3) +#define DPC_STATUS_TMEM_BUSY (1 << 4) +#define DPC_STATUS_PIPE_BUSY (1 << 5) +#define DPC_STATUS_CMD_BUSY (1 << 6) +#define DPC_STATUS_CBUF_READY (1 << 7) +#define DPC_STATUS_DMA_BUSY (1 << 8) +#define DPC_STATUS_END_VALID (1 << 9) +#define DPC_STATUS_START_VALID (1 << 10) + +/** + * Display Processor Span (DPS) Registers + */ +#define DPS_BASE_REG 0x04200000 + +/* DP tmem built-in self-test (R/W): [10:0] BIST status bits */ +#define DPS_TBIST_REG (DPS_BASE_REG + 0x00) + +/* DP span test mode (R/W): [0] Span buffer test access enable */ +#define DPS_TEST_MODE_REG (DPS_BASE_REG + 0x04) + +/* DP span buffer test address (R/W): [6:0] bits */ +#define DPS_BUFTEST_ADDR_REG (DPS_BASE_REG + 0x08) + +/* DP span buffer test data (R/W): [31:0] span buffer data */ +#define DPS_BUFTEST_DATA_REG (DPS_BASE_REG + 0x0C) + +/* + * DPS_TMEM_BIST_REG: write bits + */ +#define DPS_TBIST_CHECK (1 << 0) +#define DPS_TBIST_GO (1 << 1) +#define DPS_TBIST_CLEAR (1 << 2) + +/* + * DPS_TMEM_BIST_REG: read bits + * First 2 bits are same as in write mode + */ +#define DPS_TBIST_DONE (1 << 2) +#define DPS_TBIST_FAILED 0x7F8 /* bits [10:3], BIST fail */ + +/** + * MIPS Interface (MI) Registers + */ +#define MI_BASE_REG 0x04300000 + +/* + * MI init mode (W): [6:0] init length, [7] clear init mode, [8] set init mode + * [9/10] clear/set ebus test mode, [11] clear DP interrupt + * (R): [6:0] init length, [7] init mode, [8] ebus test mode + */ +#define MI_INIT_MODE_REG (MI_BASE_REG + 0x00) +#define MI_MODE_REG MI_INIT_MODE_REG + +/* + * MI_MODE_REG: write bits + */ +#define MI_CLR_INIT (1 << 7) /* clear init mode */ +#define MI_SET_INIT (1 << 8) /* set init mode */ +#define MI_CLR_EBUS (1 << 9) /* clear ebus test */ +#define MI_SET_EBUS (1 << 10) /* set ebus test mode */ +#define MI_CLR_DP_INTR (1 << 11) /* clear dp interrupt */ +#define MI_CLR_RDRAM (1 << 12) /* clear RDRAM reg */ +#define MI_SET_RDRAM (1 << 13) /* set RDRAM reg mode */ + +/* + * MI_MODE_REG: read bits + */ +#define MI_MODE_INIT (1 << 7) /* init mode */ +#define MI_MODE_EBUS (1 << 8) /* ebus test mode */ +#define MI_MODE_RDRAM (1 << 9) /* RDRAM reg mode */ + +/* MI version (R): [7:0] io, [15:8] rac, [23:16] rdp, [31:24] rsp */ +#define MI_VERSION_REG (MI_BASE_REG + 0x04) +#define MI_NOOP_REG MI_VERSION_REG + +/* MI interrupt (R): [5:0] valid bits - see below for bit patterns */ +#define MI_INTR_REG (MI_BASE_REG + 0x08) + +/* + * MI interrupt mask (W): [11:0] valid bits - see below for bit patterns + * (R): [5:0] valid bits - see below for bit patterns + */ +#define MI_INTR_MASK_REG (MI_BASE_REG + 0x0C) + +/* + * MI_INTR_REG: read bits + */ +#define MI_INTR_SP (1 << 0) /* SP intr */ +#define MI_INTR_SI (1 << 1) /* SI intr */ +#define MI_INTR_AI (1 << 2) /* AI intr */ +#define MI_INTR_VI (1 << 3) /* VI intr */ +#define MI_INTR_PI (1 << 4) /* PI intr */ +#define MI_INTR_DP (1 << 5) /* DP intr */ + +/* + * MI_INTR_MASK_REG: write bits + */ +#define MI_INTR_MASK_CLR_SP (1 << 0) /* clear SP mask */ +#define MI_INTR_MASK_SET_SP (1 << 1) /* set SP mask */ +#define MI_INTR_MASK_CLR_SI (1 << 2) /* clear SI mask */ +#define MI_INTR_MASK_SET_SI (1 << 3) /* set SI mask */ +#define MI_INTR_MASK_CLR_AI (1 << 4) /* clear AI mask */ +#define MI_INTR_MASK_SET_AI (1 << 5) /* set AI mask */ +#define MI_INTR_MASK_CLR_VI (1 << 6) /* clear VI mask */ +#define MI_INTR_MASK_SET_VI (1 << 7) /* set VI mask */ +#define MI_INTR_MASK_CLR_PI (1 << 8) /* clear PI mask */ +#define MI_INTR_MASK_SET_PI (1 << 9) /* set PI mask */ +#define MI_INTR_MASK_CLR_DP (1 << 10) /* clear DP mask */ +#define MI_INTR_MASK_SET_DP (1 << 11) /* set DP mask */ + +/* + * MI_INTR_MASK_REG: read bits + */ +#define MI_INTR_MASK_SP (1 << 0) /* SP intr mask */ +#define MI_INTR_MASK_SI (1 << 1) /* SI intr mask */ +#define MI_INTR_MASK_AI (1 << 2) /* AI intr mask */ +#define MI_INTR_MASK_VI (1 << 3) /* VI intr mask */ +#define MI_INTR_MASK_PI (1 << 4) /* PI intr mask */ +#define MI_INTR_MASK_DP (1 << 5) /* DP intr mask */ + +/** + * Video Interface (VI) Registers + */ +#define VI_BASE_REG 0x04400000 + +/* VI status/control (R/W): [15-0] valid bits: + * [1:0] = type[1:0] (pixel size) + * 0: blank (no data, no sync) + * 1: reserved + * 2: 5/5/5/3 ("16" bit) + * 3: 8/8/8/8 (32 bit) + * [2] = gamma_dither_enable (normally on, unless "special effect") + * [3] = gamma_enable (normally on, unless MPEG/JPEG) + * [4] = divot_enable (normally on if antialiased, unless decal lines) + * [5] = reserved - always off + * [6] = serrate (always on if interlaced, off if not) + * [7] = reserved - diagnostics only + * [9:8] = anti-alias (aa) mode[1:0] + * 0: aa & resamp (always fetch extra lines) + * 1: aa & resamp (fetch extra lines if needed) + * 2: resamp only (treat as all fully covered) + * 3: neither (replicate pixels, no interpolate) + * [11] = reserved - diagnostics only + * [15:12] = reserved + * + */ +#define VI_CONTROL_REG (VI_BASE_REG + 0x00) +#define VI_STATUS_REG VI_CONTROL_REG + +/* VI origin (R/W): [23:0] frame buffer origin in bytes */ +#define VI_ORIGIN_REG (VI_BASE_REG + 0x04) +#define VI_DRAM_ADDR_REG VI_ORIGIN_REG + +/* VI width (R/W): [11:0] frame buffer line width in pixels */ +#define VI_WIDTH_REG (VI_BASE_REG + 0x08) +#define VI_H_WIDTH_REG VI_WIDTH_REG + +/* VI vertical intr (R/W): [9:0] interrupt when current half-line = V_INTR */ +#define VI_INTR_REG (VI_BASE_REG + 0x0C) +#define VI_V_INTR_REG VI_INTR_REG + +/* + * VI current vertical line (R/W): [9:0] current half line, sampled once per + * line (the lsb of V_CURRENT is constant within a field, and in + * interlaced modes gives the field number - which is constant for non- + * interlaced modes) + * - Any write to this register will clear interrupt line + */ +#define VI_CURRENT_REG (VI_BASE_REG + 0x10) +#define VI_V_CURRENT_LINE_REG VI_CURRENT_REG + +/* + * VI video timing (R/W): [ 7: 0] horizontal sync width in pixels, + * [15: 8] color burst width in pixels, + * [19:16] vertical sync width in half lines, + * [29:20] start of color burst in pixels from h-sync + */ +#define VI_BURST_REG (VI_BASE_REG + 0x14) +#define VI_TIMING_REG VI_BURST_REG + +/* VI vertical sync (R/W): [9:0] number of half-lines per field */ +#define VI_V_SYNC_REG (VI_BASE_REG + 0x18) + +/* VI horizontal sync (R/W): [11: 0] total duration of a line in 1/4 pixel + * [20:16] a 5-bit leap pattern used for PAL only + * (h_sync_period) + */ +#define VI_H_SYNC_REG (VI_BASE_REG + 0x1C) + +/* + * VI horizontal sync leap (R/W): [11: 0] identical to h_sync_period + * [27:16] identical to h_sync_period + */ +#define VI_LEAP_REG (VI_BASE_REG + 0x20) +#define VI_H_SYNC_LEAP_REG VI_LEAP_REG + +/* + * VI horizontal video (R/W): [ 9: 0] end of active video in screen pixels + * : [25:16] start of active video in screen pixels + */ +#define VI_H_START_REG (VI_BASE_REG + 0x24) +#define VI_H_VIDEO_REG VI_H_START_REG + +/* + * VI vertical video (R/W): [ 9: 0] end of active video in screen half-lines + * : [25:16] start of active video in screen half-lines + */ +#define VI_V_START_REG (VI_BASE_REG + 0x28) +#define VI_V_VIDEO_REG VI_V_START_REG + +/* + * VI vertical burst (R/W): [ 9: 0] end of color burst enable in half-lines + * : [25:16] start of color burst enable in half-lines + */ +#define VI_V_BURST_REG (VI_BASE_REG + 0x2C) + +/* VI x-scale (R/W): [11: 0] 1/horizontal scale up factor (2.10 format) + * [27:16] horizontal subpixel offset (2.10 format) + */ +#define VI_X_SCALE_REG (VI_BASE_REG + 0x30) + +/* VI y-scale (R/W): [11: 0] 1/vertical scale up factor (2.10 format) + * [27:16] vertical subpixel offset (2.10 format) + */ +#define VI_Y_SCALE_REG (VI_BASE_REG + 0x34) + +/* + * Patterns to interpret VI_CONTROL_REG + */ +#define VI_CTRL_TYPE_16 0x00002 /* [1:0] pixel size: 16 bit */ +#define VI_CTRL_TYPE_32 0x00003 /* [1:0] pixel size: 32 bit */ +#define VI_CTRL_GAMMA_DITHER_ON 0x00004 /* 2: default = on */ +#define VI_CTRL_GAMMA_ON 0x00008 /* 3: default = on */ +#define VI_CTRL_DIVOT_ON 0x00010 /* 4: default = on */ +#define VI_CTRL_SERRATE_ON 0x00040 /* 6: on if interlaced */ +#define VI_CTRL_ANTIALIAS_MASK 0x00300 /* [9:8] anti-alias mode */ +#define VI_CTRL_ANTIALIAS_MODE_1 0x00100 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_ANTIALIAS_MODE_2 0x00200 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_ANTIALIAS_MODE_3 0x00300 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_PIXEL_ADV_MASK 0x01000 /* [15:12] pixel advance mode? */ +#define VI_CTRL_PIXEL_ADV_1 0x01000 /* Bit [15:12] pixel advance mode? */ +#define VI_CTRL_PIXEL_ADV_2 0x02000 /* Bit [15:12] pixel advance mode? */ +#define VI_CTRL_PIXEL_ADV_3 0x03000 /* Bit [15:12] pixel advance mode? */ +#define VI_CTRL_DITHER_FILTER_ON 0x10000 /* 16: dither-filter mode */ + +/* + * Possible video clocks (NTSC or PAL) + */ +#define VI_NTSC_CLOCK 48681812 /* Hz = 48.681812 MHz */ +#define VI_PAL_CLOCK 49656530 /* Hz = 49.656530 MHz */ +#define VI_MPAL_CLOCK 48628316 /* Hz = 48.628316 MHz */ + +/** + * The address and length registers are double buffered; that is, they + * can be written twice before becoming full. + * The address must be written before the length. + */ + +/** + * Audio Interface (AI) Registers + */ +#define AI_BASE_REG 0x04500000 + +/* AI DRAM address (W): [23:0] starting RDRAM address (8B-aligned) */ +#define AI_DRAM_ADDR_REG (AI_BASE_REG + 0x00) /* R0: DRAM address */ + +/* AI length (R/W): [14:0] transfer length (v1.0) - Bottom 3 bits are ignored */ +/* [17:0] transfer length (v2.0) - Bottom 3 bits are ignored */ +#define AI_LEN_REG (AI_BASE_REG + 0x04) /* R1: Length */ + +/* AI control (W): [0] DMA enable - if LSB == 1, DMA is enabled */ +#define AI_CONTROL_REG (AI_BASE_REG + 0x08) /* R2: DMA Control */ + +/* Value for control register */ +#define AI_CONTROL_DMA_ON 1 /* LSB = 1: DMA enable*/ +#define AI_CONTROL_DMA_OFF 0 /* LSB = 1: DMA enable*/ + +/* + * AI status (R): [31]/[0] ai_full (addr & len buffer full), [30] ai_busy + * Note that a 1->0 transition in ai_full will set interrupt + * (W): clear audio interrupt + */ +#define AI_STATUS_REG (AI_BASE_REG + 0x0C) /* R3: Status */ + +/* Value for status register */ +#define AI_STATUS_FIFO_FULL (1 << 31) +#define AI_STATUS_DMA_BUSY (1 << 30) + +/* + * AI DAC sample period register (W): [13:0] dac rate + * - vid_clock/(dperiod + 1) is the DAC sample rate + * - (dperiod + 1) >= 66 * (aclockhp + 1) must be true + */ +#define AI_DACRATE_REG (AI_BASE_REG + 0x10) /* R4: DAC rate 14-lsb*/ + +/* DAC rate = video clock / audio frequency + * - DAC rate >= (66 * Bit rate) must be true + */ +#define AI_MAX_DAC_RATE 16384 /* 14-bit+1 */ +#define AI_MIN_DAC_RATE 132 + +/* + * AI bit rate (W): [3:0] bit rate (abus clock half period register - aclockhp) + * - vid_clock/(2 * (aclockhp + 1)) is the DAC clock rate + * - The abus clock stops if aclockhp is zero + */ +#define AI_BITRATE_REG (AI_BASE_REG + 0x14) /* R5: Bit rate 4-lsb */ + +/* Bit rate <= (DAC rate / 66) */ +#define AI_MAX_BIT_RATE 16 /* 4-bit+1 */ +#define AI_MIN_BIT_RATE 2 + +/* + * Maximum and minimum values for audio frequency based on video clocks + * max frequency = (video clock / min dac rate) + * min frequency = (video clock / max dac rate) + */ +#define AI_NTSC_MAX_FREQ 368000 /* 368 KHz */ +#define AI_NTSC_MIN_FREQ 3000 /* 3 KHz ~ 2971 Hz */ + +#define AI_PAL_MAX_FREQ 376000 /* 376 KHz */ +#define AI_PAL_MIN_FREQ 3050 /* 3 KHz ~ 3031 Hz */ + +#define AI_MPAL_MAX_FREQ 368000 /* 368 KHz */ +#define AI_MPAL_MIN_FREQ 3000 /* 3 KHz ~ 2968 Hz */ + +/** + * Peripheral Interface (PI) Registers + */ +#define PI_BASE_REG 0x04600000 + +/* PI DRAM address (R/W): [23:0] starting RDRAM address */ +#define PI_DRAM_ADDR_REG (PI_BASE_REG + 0x00) /* DRAM address */ + +/* PI pbus (cartridge) address (R/W): [31:0] starting AD16 address */ +#define PI_CART_ADDR_REG (PI_BASE_REG + 0x04) + +/* PI read length (R/W): [23:0] read data length */ +#define PI_RD_LEN_REG (PI_BASE_REG + 0x08) + +/* PI write length (R/W): [23:0] write data length */ +#define PI_WR_LEN_REG (PI_BASE_REG + 0x0C) + +/* + * PI status (R): [0] DMA busy, [1] IO busy, [2], error + * (W): [0] reset controller (and abort current op), [1] clear intr + */ +#define PI_STATUS_REG (PI_BASE_REG + 0x10) + +/* PI dom1 latency (R/W): [7:0] domain 1 device latency */ +#define PI_BSD_DOM1_LAT_REG (PI_BASE_REG + 0x14) + +/* PI dom1 pulse width (R/W): [7:0] domain 1 device R/W strobe pulse width */ +#define PI_BSD_DOM1_PWD_REG (PI_BASE_REG + 0x18) + +/* PI dom1 page size (R/W): [3:0] domain 1 device page size */ +#define PI_BSD_DOM1_PGS_REG (PI_BASE_REG + 0x1C) /* page size */ + +/* PI dom1 release (R/W): [1:0] domain 1 device R/W release duration */ +#define PI_BSD_DOM1_RLS_REG (PI_BASE_REG + 0x20) + +/* PI dom2 latency (R/W): [7:0] domain 2 device latency */ +#define PI_BSD_DOM2_LAT_REG (PI_BASE_REG + 0x24) /* Domain 2 latency */ + +/* PI dom2 pulse width (R/W): [7:0] domain 2 device R/W strobe pulse width */ +#define PI_BSD_DOM2_PWD_REG (PI_BASE_REG + 0x28) /* pulse width */ + +/* PI dom2 page size (R/W): [3:0] domain 2 device page size */ +#define PI_BSD_DOM2_PGS_REG (PI_BASE_REG + 0x2C) /* page size */ + +/* PI dom2 release (R/W): [1:0] domain 2 device R/W release duration */ +#define PI_BSD_DOM2_RLS_REG (PI_BASE_REG + 0x30) /* release duration */ + +#define PI_DOMAIN1_REG PI_BSD_DOM1_LAT_REG +#define PI_DOMAIN2_REG PI_BSD_DOM2_LAT_REG + +#define PI_DOM_LAT_OFS 0x00 +#define PI_DOM_PWD_OFS 0x04 +#define PI_DOM_PGS_OFS 0x08 +#define PI_DOM_RLS_OFS 0x0C + +/* + * PI status register has 3 bits active when read from (PI_STATUS_REG - read) + * Bit 0: DMA busy - set when DMA is in progress + * Bit 1: IO busy - set when IO is in progress + * Bit 2: Error - set when CPU issues IO request while DMA is busy + */ +#define PI_STATUS_DMA_BUSY (1 << 0) +#define PI_STATUS_IO_BUSY (1 << 1) +#define PI_STATUS_ERROR (1 << 2) + +/* PI status register has 2 bits active when written to: + * Bit 0: When set, reset PIC + * Bit 1: When set, clear interrupt flag + * The values of the two bits can be ORed together to both reset PIC and + * clear interrupt at the same time. + * + * Note: + * - The PIC does generate an interrupt at the end of each DMA. CPU + * needs to clear the interrupt flag explicitly (from an interrupt + * handler) by writing into the STATUS register with bit 1 set. + * + * - When a DMA completes, the interrupt flag is set. CPU can issue + * another request even while the interrupt flag is set (as long as + * PIC is idle). However, it is the CPU's responsibility for + * maintaining accurate correspondence between DMA completions and + * interrupts. + * + * - When PIC is reset, if PIC happens to be busy, an interrupt will + * be generated as PIC returns to idle. Otherwise, no interrupt will + * be generated and PIC remains idle. + */ + +/* + * PI_STATUS_REG: write bits + */ +#define PI_STATUS_RESET (1 << 0) +#define PI_SET_RESET PI_STATUS_RESET + +#define PI_STATUS_CLR_INTR (1 << 1) +#define PI_CLR_INTR PI_STATUS_CLR_INTR + +#define PI_DMA_BUFFER_SIZE 128 + +#define PI_DOM1_ADDR1 0x06000000 /* to 0x07FFFFFF */ +#define PI_DOM1_ADDR2 0x10000000 /* to 0x1FBFFFFF */ +#define PI_DOM1_ADDR3 0x1FD00000 /* to 0x7FFFFFFF */ +#define PI_DOM2_ADDR1 0x05000000 /* to 0x05FFFFFF */ +#define PI_DOM2_ADDR2 0x08000000 /* to 0x0FFFFFFF */ + +/** + * RDRAM Interface (RI) Registers + */ +#define RI_BASE_REG 0x04700000 + +/* RI mode (R/W): [1:0] operating mode, [2] stop T active, [3] stop R active */ +#define RI_MODE_REG (RI_BASE_REG + 0x00) + +/* RI config (R/W): [5:0] current control input, [6] current control enable */ +#define RI_CONFIG_REG (RI_BASE_REG + 0x04) + +/* RI current load (W): [] any write updates current control register */ +#define RI_CURRENT_LOAD_REG (RI_BASE_REG + 0x08) + +/* RI select (R/W): [2:0] receive select, [2:0] transmit select */ +#define RI_SELECT_REG (RI_BASE_REG + 0x0C) + +/* RI refresh (R/W): [7:0] clean refresh delay, [15:8] dirty refresh delay, + * [16] refresh bank, [17] refresh enable + * [18] refresh optimize + */ +#define RI_REFRESH_REG (RI_BASE_REG + 0x10) +#define RI_COUNT_REG RI_REFRESH_REG + +/* RI latency (R/W): [3:0] DMA latency/overlap */ +#define RI_LATENCY_REG (RI_BASE_REG + 0x14) + +/* RI error (R): [0] nack error, [1] ack error */ +#define RI_RERROR_REG (RI_BASE_REG + 0x18) + +/* RI error (W): [] any write clears all error bits */ +#define RI_WERROR_REG (RI_BASE_REG + 0x1C) + +/** + * Serial Interface (SI) Registers + */ +#define SI_BASE_REG 0x04800000 + +/* SI DRAM address (R/W): [23:0] starting RDRAM address */ +#define SI_DRAM_ADDR_REG (SI_BASE_REG + 0x00) + +/* SI address read 64B (W): [] write begins a 64B DMA write PIF RAM -> RDRAM */ +#define SI_PIF_ADDR_RD64B_REG (SI_BASE_REG + 0x04) + +/* Address SI_BASE_REG + (0x08, 0x0C, 0x14) are reserved */ + +/* SI address write 64B (W): [] write begins a 64B DMA read RDRAM -> PIF RAM */ +#define SI_PIF_ADDR_WR64B_REG (SI_BASE_REG + 0x10) + +/* SI status (R/W): [] any write clears interrupt */ +#define SI_STATUS_REG (SI_BASE_REG + 0x18) + +/* + * SI_STATUS_REG: read bits + */ +#define SI_STATUS_DMA_BUSY (1 << 0) /* DMA in progress */ +#define SI_STATUS_RD_BUSY (1 << 1) /* IO access in progress */ +#define SI_STATUS_DMA_ERROR (1 << 3) /* Overlapping DMA requests */ +#define SI_STATUS_INTERRUPT (1 << 12) /* Interrupt is set */ + +/** + * Development Board GIO Control Registers + */ + +#define GIO_BASE_REG 0x18000000 + +/* Game to Host Interrupt */ +#define GIO_GIO_INTR_REG (GIO_BASE_REG+0x000) + +/* Game to Host SYNC */ +#define GIO_GIO_SYNC_REG (GIO_BASE_REG+0x400) + +/* Host to Game Interrupt */ +#define GIO_CART_INTR_REG (GIO_BASE_REG+0x800) + +/** + * Common macros + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +#define IO_READ(addr) (*(vu32*)PHYS_TO_K1(addr)) +#define IO_WRITE(addr,data) (*(vu32*)PHYS_TO_K1(addr)=(u32)(data)) +#define RCP_STAT_PRINT \ + rmonPrintf("current=%x start=%x end=%x dpstat=%x spstat=%x\n", \ + IO_READ(DPC_CURRENT_REG), \ + IO_READ(DPC_START_REG), \ + IO_READ(DPC_END_REG), \ + IO_READ(DPC_STATUS_REG), \ + IO_READ(SP_STATUS_REG)) + +#endif + +#endif /* _RCP_H_ */ diff --git a/lib/ultralib/include/PR/rdb.h b/lib/ultralib/include/PR/rdb.h new file mode 100644 index 0000000..e089749 --- /dev/null +++ b/lib/ultralib/include/PR/rdb.h @@ -0,0 +1,93 @@ + +/************************************************************************** + * + * $Revision: 1.6 $ + * $Date: 1997/02/11 08:29:31 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/rdb.h,v $ + * + **************************************************************************/ + +#ifndef _RDB_H +#define _RDB_H + +/* U64 side address */ +#define RDB_BASE_REG 0xc0000000 +#define RDB_WRITE_INTR_REG (RDB_BASE_REG + 0x8) +#define RDB_READ_INTR_REG (RDB_BASE_REG + 0xc) +#define RDB_BASE_VIRTUAL_ADDR 0x80000000 + +/* packet type Have six bits, so can have up to 63 types */ +#define RDB_TYPE_INVALID 0 +#define RDB_TYPE_GtoH_PRINT 1 +#define RDB_TYPE_GtoH_FAULT 2 +#define RDB_TYPE_GtoH_LOG_CT 3 +#define RDB_TYPE_GtoH_LOG 4 +#define RDB_TYPE_GtoH_READY_FOR_DATA 5 +#define RDB_TYPE_GtoH_DATA_CT 6 +#define RDB_TYPE_GtoH_DATA 7 +#define RDB_TYPE_GtoH_DEBUG 8 +#define RDB_TYPE_GtoH_RAMROM 9 +#define RDB_TYPE_GtoH_DEBUG_DONE 10 +#define RDB_TYPE_GtoH_DEBUG_READY 11 +#define RDB_TYPE_GtoH_KDEBUG 12 +#define RDB_TYPE_GtoH_PROF_DATA 22 + + +#define RDB_TYPE_HtoG_LOG_DONE 13 +#define RDB_TYPE_HtoG_DEBUG 14 +#define RDB_TYPE_HtoG_DEBUG_CT 15 +#define RDB_TYPE_HtoG_DATA 16 +#define RDB_TYPE_HtoG_DATA_DONE 17 +#define RDB_TYPE_HtoG_REQ_RAMROM 18 +#define RDB_TYPE_HtoG_FREE_RAMROM 19 +#define RDB_TYPE_HtoG_KDEBUG 20 +#define RDB_TYPE_HtoG_PROF_SIGNAL 21 + + +#define RDB_PROF_ACK_SIG 1 +#define RDB_PROF_FLUSH_SIG 2 +#define PROF_BLOCK_SIZE 2048 + +#define RDB_LOG_MAX_BLOCK_SIZE 0x8000 +#define RDB_DATA_MAX_BLOCK_SIZE 0x8000 + + +/* GIO side address */ +#define GIO_RDB_BASE_REG 0xbf480000 +#define GIO_RDB_WRITE_INTR_REG (GIO_RDB_BASE_REG + 0x8) +#define GIO_RDB_READ_INTR_REG (GIO_RDB_BASE_REG + 0xc) + +/* minor device number */ +#define GIO_RDB_PRINT_MINOR 1 +#define GIO_RDB_DEBUG_MINOR 2 + +/* interrupt bit */ +#define GIO_RDB_WRITE_INTR_BIT 0x80000000 +#define GIO_RDB_READ_INTR_BIT 0x40000000 + +/* debug command */ +#define DEBUG_COMMAND_NULL 0 +#define DEBUG_COMMAND_MEMORY 1 +#define DEBUG_COMMAND_REGISTER 2 +#define DEBUG_COMMAND_INVALID 255 + +/* debug state */ +#define DEBUG_STATE_NULL 0 +#define DEBUG_STATE_RECEIVE 1 +#define DEBUG_STATE_INVALID 255 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Structure for debug port */ +typedef struct { + unsigned type : 6; /* 0: invalid, 1: print, 2: debug */ + unsigned length : 2; /* 1, 2, or 3 */ + char buf[3]; /* character buffer */ +} rdbPacket; + +extern unsigned int __osRdbWriteOK; +extern unsigned int __osRdbSendMessage; + +#endif /* _LANGUAGE_C */ + +#endif /* !_RDB_H */ diff --git a/lib/ultralib/include/PR/region.h b/lib/ultralib/include/PR/region.h new file mode 100644 index 0000000..0ac8a25 --- /dev/null +++ b/lib/ultralib/include/PR/region.h @@ -0,0 +1,123 @@ + +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * Module: region.h + * + * $Revision: 1.8 $ + * $Date: 1997/11/26 00:30:56 $ + * $Author: mitu $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/region.h,v $ + * + * Description: + * This file contains macros and structure definitions for the region + * library. + * + **************************************************************************/ + + +#ifndef _REGION_H_ +#define _REGION_H_ + + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + + +/*************************************** + * + * Global defines + * + */ + /* Alignment sizes */ +#define ALIGNSZ (sizeof(long long)) /* 8 bytes */ +#define ALIGNOFFST (ALIGNSZ-1) + + /* size for storing index to free buffer */ +#define BUF_CTRL_SIZE ALIGNSZ + + /* Max bufcount = 32K */ +#define MAX_BUFCOUNT 0x8000 + /* code for last free buffer */ +#define BUF_FREE_WO_NEXT 0x8000 + +/* + * Global defines for alignment size (default is 8-byte alignment) + */ +#define OS_RG_ALIGN_2B 2 /* 2 bytes = 16-bit alignment */ +#define OS_RG_ALIGN_4B 4 /* 4 bytes = 32-bit alignment */ +#define OS_RG_ALIGN_8B 8 /* 8 bytes = 64-bit alignment */ +#define OS_RG_ALIGN_16B 16 /* 16 bytes = 128-bit alignment */ + +#define OS_RG_ALIGN_DEFAULT OS_RG_ALIGN_8B + + +/*************************************** + * + * Macro definitions + * + */ + +/* Perform alignment on input 's' */ +#define ALIGN(s, align) (((u32)(s) + ((align)-1)) & ~((align)-1)) + + +/*************************************** + * + * Typedefs & structure definitions + * + */ +/* + * Structure for region header/control area + */ +typedef struct _Region_s { + u8 *r_startBufferAddress; /* start address to data buffer */ + u8 *r_endAddress; /* end address of region */ + s32 r_bufferSize; /* size of buffers for this region */ + s32 r_bufferCount; /* up to 32K entries; MSB is used for + setting end-of-list/used */ + u16 r_freeList; /* point to array index of first + available memory buffer */ + u16 r_alignSize; /* alignment size (# of bytes) */ +} OSRegion; + +/* + * Macro to simplify accessing region header structure + */ +#define RP(x) rp->r_##x + + +/*************************************** + * + * Function prototypes + * + */ +extern void *osCreateRegion(void *, u32, u32, u32); +extern void *osMalloc(void *); +extern void osFree(void *, void *); +extern s32 osGetRegionBufCount(void *); +extern s32 osGetRegionBufSize(void *); + + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + + +#endif /* _REGION_H_ */ + + diff --git a/lib/ultralib/include/PR/rmon.h b/lib/ultralib/include/PR/rmon.h new file mode 100644 index 0000000..199e569 --- /dev/null +++ b/lib/ultralib/include/PR/rmon.h @@ -0,0 +1,39 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.6 $ + * $Date: 1997/02/11 08:30:08 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/rmon.h,v $ + * + **************************************************************************/ + +#ifndef _RMON_H_ +#define _RMON_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#define RMON_DBG_BUF_SIZE 2048 +#define RMON_STACKSIZE 0x1000 + +extern void rmonMain( void * ); +extern void rmonPrintf( const char *, ... ); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_H */ diff --git a/lib/ultralib/include/PR/sched.h b/lib/ultralib/include/PR/sched.h new file mode 100644 index 0000000..2d305a2 --- /dev/null +++ b/lib/ultralib/include/PR/sched.h @@ -0,0 +1,115 @@ +/*==================================================================== + * sched.h + * + * Synopsis: + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.7 $ + * $Date: 1997/02/11 08:32:02 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/sched.h,v $ + * + **************************************************************************/ + +#ifndef __sched__ +#define __sched__ + +#include + +#define OS_SC_STACKSIZE 0x2000 + +#define OS_SC_RETRACE_MSG 1 +#define OS_SC_DONE_MSG 2 +#define OS_SC_RDP_DONE_MSG 3 +#define OS_SC_PRE_NMI_MSG 4 +#define OS_SC_LAST_MSG 4 /* this should have highest number */ +#define OS_SC_MAX_MESGS 8 + +typedef struct { + short type; + char misc[30]; +} OSScMsg; + +typedef struct OSScTask_s { + struct OSScTask_s *next; /* note: this must be first */ + u32 state; + u32 flags; + void *framebuffer; /* used by graphics tasks */ + + OSTask list; + OSMesgQueue *msgQ; + OSMesg msg; +#ifndef _FINALROM /* all #ifdef items should */ + OSTime startTime; /* remain at the end!!, or */ + OSTime totalTime; /* possible conflict if */ +#endif /* FINALROM library used with */ +} OSScTask; /* non FINALROM code */ + +/* + * OSScTask flags: + */ +#define OS_SC_NEEDS_RDP 0x0001 /* uses the RDP */ +#define OS_SC_NEEDS_RSP 0x0002 /* uses the RSP */ +#define OS_SC_DRAM_DLIST 0x0004 /* SP & DP communicate through DRAM */ +#define OS_SC_PARALLEL_TASK 0x0010 /* must be first gfx task on list */ +#define OS_SC_LAST_TASK 0x0020 /* last task in queue for frame */ +#define OS_SC_SWAPBUFFER 0x0040 /* swapbuffers when gfx task done */ + +#define OS_SC_RCP_MASK 0x0003 /* mask for needs bits */ +#define OS_SC_TYPE_MASK 0x0007 /* complete type mask */ +/* + * OSScClient: + * + * Data structure used by threads that wish to communicate to the + * scheduling thread + * + */ +typedef struct SCClient_s { + struct SCClient_s *next; /* next client in the list */ + OSMesgQueue *msgQ; /* where to send the frame msg */ +} OSScClient; + +typedef struct { + OSScMsg retraceMsg; + OSScMsg prenmiMsg; + OSMesgQueue interruptQ; + OSMesg intBuf[OS_SC_MAX_MESGS]; + OSMesgQueue cmdQ; + OSMesg cmdMsgBuf[OS_SC_MAX_MESGS]; + OSThread thread; + OSScClient *clientList; + OSScTask *audioListHead; + OSScTask *gfxListHead; + OSScTask *audioListTail; + OSScTask *gfxListTail; + OSScTask *curRSPTask; + OSScTask *curRDPTask; + u32 frameCount; + s32 doAudio; +} OSSched; + +void osCreateScheduler(OSSched *s, void *stack, OSPri priority, + u8 mode, u8 numFields); +void osScAddClient(OSSched *s, OSScClient *c, OSMesgQueue *msgQ); +void osScRemoveClient(OSSched *s, OSScClient *c); +OSMesgQueue *osScGetCmdQ(OSSched *s); + +#endif + diff --git a/lib/ultralib/include/PR/sp.h b/lib/ultralib/include/PR/sp.h new file mode 100644 index 0000000..8167ca2 --- /dev/null +++ b/lib/ultralib/include/PR/sp.h @@ -0,0 +1,196 @@ +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * Sprite library include file + * + * $Revision: 1.16 $ + * $Date: 1998/04/17 05:03:46 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/sp.h,v $ + * + **************************************************************************/ + +#ifndef _SP_H_ +#define _SP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +struct bitmap { + s16 width; /* Size across to draw in texels */ + /* Done if width = 0 */ + + s16 width_img; /* Size across of bitmap in texels */ + /* Done if width = 0 */ + + s16 s; /* Horizontal offset into bitmap */ + /* if (s > width), then load only! */ + + s16 t; /* Vertical offset into base */ + + void *buf; /* Pointer to bitmap data */ + /* Don't re-load if new buf */ + /* is the same as the old one */ + /* Skip if NULL */ + + s16 actualHeight; /* True Height of this bitmap piece */ + + s16 LUToffset; /* LUT base index */ +}; + +typedef struct bitmap Bitmap; + +struct sprite { + s16 x,y; /* Target position */ + + s16 width, height; /* Target size */ + + f32 scalex, scaley; /* Texel to Pixel scale factor */ + + s16 expx, expy; /* Explosion spacing */ + + u16 attr; /* Attribute Flags */ + s16 zdepth; /* Z Depth */ + + u8 red; /* Red component */ + u8 green; /* Green component */ + u8 blue; /* Blue component */ + u8 alpha; /* Alpha component */ + + s16 startTLUT; /* Lookup Table Entry Starting index */ + s16 nTLUT; /* Total number of Lookup Table Entries */ + + int *LUT; /* Pointer to Lookup Table */ + + s16 istart; /* Starting bitmap index */ + s16 istep; /* Bitmaps index step (see SP_INCY) */ + /* if 0, then variable width bitmaps */ + + s16 nbitmaps; /* Total number of bitmaps */ + s16 ndisplist; /* Total number of display-list words */ + + s16 bmheight; /* Bitmap Texel height (Used) */ + s16 bmHreal; /* Bitmap Texel height (Real) */ + u8 bmfmt; /* Bitmap Format */ + u8 bmsiz; /* Bitmap Texel Size */ + + Bitmap *bitmap; /* Pointer to first bitmap */ + + Gfx *rsp_dl; /* Pointer to RSP display list */ + + Gfx *rsp_dl_next; /* Pointer to next RSP display entry */ + + s16 frac_s, /* Fractional Texture offsets */ + frac_t; /* These have 5 fraction bits */ +}; + +typedef struct sprite Sprite; + +/* + * DANGER! + * This is bad programming. Where the *heck* do these numbers come + * from? + * + * They are obviously 'maximums' from the sprite library, but since + * the sprite library is built on top of gbi.h, which includes macros + * that decode into multiple macros, etc., it is nearly impossible to + * know what these maximums should be. + * + * Worse, there are some gbi macros (texture alignment mostly) that + * decode into *many* macros, so if we choose that as a maximum, we + * are wasting TONS of space... + * + * These numbers work for "reasonable" sprite library usage, and + * there is an assert() in the library to detect when they aren't + * enough. (use the debug version) + */ +#define DL_BM_OVERHEAD (12) +#define DL_SPRITE_OVERHEAD (24) + +#define NUM_DL(nb) ((nb)*DL_BM_OVERHEAD +DL_SPRITE_OVERHEAD) + +/* + * Misc constants + */ + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +/* + * For sprite->attr + */ + +#define SP_TRANSPARENT 0x00000001 +#define SP_CUTOUT 0x00000002 +#define SP_HIDDEN 0x00000004 +#define SP_Z 0x00000008 +#define SP_SCALE 0x00000010 +#define SP_FASTCOPY 0x00000020 +#define SP_OVERLAP 0x00000040 +#define SP_TEXSHIFT 0x00000080 +#define SP_FRACPOS 0x00000100 +#define SP_TEXSHUF 0x00000200 +#define SP_EXTERN 0x00000400 + +/* + * Function wrapper + */ +#if defined(F3DEX_GBI_2) +#define spMove spX2Move +#define spSetZ spX2SetZ +#define spScissor spX2Scissor +#define spDraw spX2Draw +#define spInit spX2Init +#define spFinish spX2Finish +#elif defined(F3DEX_GBI) +#define spMove spXMove +#define spSetZ spXSetZ +#define spScissor spXScissor +#define spDraw spXDraw +#define spInit spXInit +#define spFinish spXFinish +#endif + +/* + * Function prototypes + */ + +void spSetAttribute (Sprite *sp, s32 attr); +void spClearAttribute (Sprite *sp, s32 attr); +void spMove (Sprite *sp, s32 x, s32 y); +void spScale (Sprite *sp, f32 sx, f32 sy); +void spSetZ (Sprite *sp, s32 z ); +void spColor (Sprite *sp, u8 red, u8 green, u8 blue, u8 alpha); +Gfx *spDraw (Sprite *sp); +void spInit( Gfx **glistp ); +void spScissor( s32 xmin, s32 xmax, s32 ymin, s32 ymax ); +void spFinish( Gfx **glistp ); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* _SP_H_ */ diff --git a/lib/ultralib/include/PR/sptask.h b/lib/ultralib/include/PR/sptask.h new file mode 100644 index 0000000..960cab9 --- /dev/null +++ b/lib/ultralib/include/PR/sptask.h @@ -0,0 +1,201 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.9 $ + * $Date: 1998/03/05 06:40:29 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/sptask.h,v $ + * + **************************************************************************/ + +#ifndef _SPTASK_H_ +#define _SPTASK_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Task List Structure. + * + * Things an app might pass to the SP via the task list. + * Not every task ucode would need/use every field, but + * + * - type (audio, gfx, video, ...) + * - flags + * - wait for DP to drain before running new task + * - SEE BIT DEFINITIONS UNDER "Task Flags field" + * - pointer to boot ucode + * - size of boot ucode + * - pointer to ucode + * - size of ucode + * - pointer to initial DMEM data + * - size of initial DMEM data + * - pointer to DRAM stack + * - size of DRAM stack (max) + * - pointer to output buffer + * - pointer to store output buffer length + * - generic data pointer (for display list, etc.) + * - generic data length (for display list, etc.) + * - pointer to buffer where to store saved DMEM (in yield case) + * - size of buffer to store saved DMEM. + * + * IMPORTANT!!! Watch alignment issues. + * + * IMPORTANT!!! Watch data cache issues. The RCP may write data into the + * dram_stack, output_buff, output_buff_size, and the yield_data_ptr areas. + * These buffers should be cache aligned and use the entire line (16 bytes) to + * avoid corruption by writebacks by the CPU (cache tearing). + * + * IMPORTANT!!! all addresses are virtual addresses. Library does + * any necessary translation. + * + */ +typedef struct { + u32 type; + u32 flags; + + u64 *ucode_boot; + u32 ucode_boot_size; + + u64 *ucode; + u32 ucode_size; + + u64 *ucode_data; + u32 ucode_data_size; + + u64 *dram_stack; + u32 dram_stack_size; + + u64 *output_buff; + u64 *output_buff_size; + + u64 *data_ptr; + u32 data_size; + + u64 *yield_data_ptr; + u32 yield_data_size; + +} OSTask_t; + +typedef union { + OSTask_t t; + long long int force_structure_alignment; +} OSTask; + +typedef u32 OSYieldResult; + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_ASSEMBLY + +/* + * For the RSP ucode: + * offsets into the task structure + */ + +#include + +#endif + +/* + * Task Flags field + */ +#define OS_TASK_YIELDED 0x0001 +#define OS_TASK_DP_WAIT 0x0002 +#define OS_TASK_LOADABLE 0x0004 +#define OS_TASK_SP_ONLY 0x0008 +#define OS_TASK_USR0 0x0010 +#define OS_TASK_USR1 0x0020 +#define OS_TASK_USR2 0x0040 +#define OS_TASK_USR3 0x0080 + +/* + * Size of Yield buffer. The taskHdrPtr->t.yield_data_ptr must point to a + * buffer of this size. (The size is in bytes). ONLY If the task will NEVER + * yield it may be a null pointer. The buffer must be aligned to a 64 bit + * boundary. The taskHdrPtr->t.yield_data_ptr must be set to point to the + * buffer BEFORE the task is started. + */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)||defined(F3DEX_GBI_2)) +#define OS_YIELD_DATA_SIZE 0xc00 +#else +#define OS_YIELD_DATA_SIZE 0x900 +#endif +#define OS_YIELD_AUDIO_SIZE 0x400 + +/************************************************************************** + * + * Global definitions + * + */ + + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* + * this macro simulates atomic action. + */ +#define osSpTaskStart(tp) \ + { \ + osSpTaskLoad((tp)); \ + osSpTaskStartGo((tp)); \ + } + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* + * break this up into two steps for debugging. + */ +extern void osSpTaskLoad(OSTask *tp); +extern void osSpTaskStartGo(OSTask *tp); + +extern void osSpTaskYield(void); +extern OSYieldResult osSpTaskYielded(OSTask *tp); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_SPTASK_H */ diff --git a/lib/ultralib/include/PR/ucode.h b/lib/ultralib/include/PR/ucode.h new file mode 100644 index 0000000..e43f52a --- /dev/null +++ b/lib/ultralib/include/PR/ucode.h @@ -0,0 +1,192 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.15 $ + * $Date: 1998/03/31 07:58:57 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ucode.h,v $ + * + **************************************************************************/ + +#ifndef _UCODE_H_ +#define _UCODE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* + * This is the recommended size of the SP DRAM stack area, used + * by the graphics ucode. This stack is used primarily for the + * matrix stack, so it needs to be AT LEAST (10 * 64bytes) in size. + */ +#define SP_DRAM_STACK_SIZE8 (1024) +#define SP_DRAM_STACK_SIZE64 (SP_DRAM_STACK_SIZE8 >> 3) + +/* + * This is the size of the IMEM, which is also the size of the + * graphics microcode. (other ucode might be less) + * This value is used in apps to tell the OS how much ucode to + * load. + */ +#define SP_UCODE_SIZE 4096 + +/* + * This is 1/2 the size of DMEM, which is the maximum amount of + * initialized DMEM data any of the ucode tasks need to start up. + * This value is dependent on all of the task ucodes, and is therefore + * fixed per release. + */ +#define SP_UCODE_DATA_SIZE 2048 + + +/************************************************************************** + * + * Extern variables + * + */ + +/* + * Symbols generated by "rsp2elf", included by "makerom" that indicate + * the location and size of the SP microcode objects. The ucode objects + * are loaded as part of the codesegment (arbitrary, could do other + * ways) + * + */ + +/* standard boot ucode: */ +extern long long int rspbootTextStart[], rspbootTextEnd[]; + +/* standard 3D ucode: */ +extern long long int gspFast3DTextStart[], gspFast3DTextEnd[]; +extern long long int gspFast3DDataStart[], gspFast3DDataEnd[]; + +/* 3D ucode with output to DRAM: */ +extern long long int gspFast3D_dramTextStart[], gspFast3D_dramTextEnd[]; +extern long long int gspFast3D_dramDataStart[], gspFast3D_dramDataEnd[]; + +/* 3D ucode with output through DRAM FIFO to RDP: */ +extern long long int gspFast3D_fifoTextStart[], gspFast3D_fifoTextEnd[]; +extern long long int gspFast3D_fifoDataStart[], gspFast3D_fifoDataEnd[]; + +/* 3D ucode without nearclip: */ +extern long long int gspF3DNoNTextStart[], gspF3DNoNTextEnd[]; +extern long long int gspF3DNoNDataStart[], gspF3DNoNDataEnd[]; + +/* 3D ucode without nearclip with output to DRAM: */ +extern long long int gspF3DNoN_dramTextStart[]; +extern long long int gspF3DNoN_dramTextEnd[]; +extern long long int gspF3DNoN_dramDataStart[]; +extern long long int gspF3DNoN_dramDataEnd[]; + +/* 3D ucode without nearclip with output through DRAM FIFO to RDP: */ +extern long long int gspF3DNoN_fifoTextStart[]; +extern long long int gspF3DNoN_fifoTextEnd[]; +extern long long int gspF3DNoN_fifoDataStart[]; +extern long long int gspF3DNoN_fifoDataEnd[]; + +/* 3D line ucode: */ +extern long long int gspLine3DTextStart[], gspLine3DTextEnd[]; +extern long long int gspLine3DDataStart[], gspLine3DDataEnd[]; + +/* 3D line ucode with output to DRAM: */ +extern long long int gspLine3D_dramTextStart[], gspLine3D_dramTextEnd[]; +extern long long int gspLine3D_dramDataStart[], gspLine3D_dramDataEnd[]; + +/* 3D line ucode with output through DRAM FIFO to RDP: */ +extern long long int gspLine3D_fifoTextStart[], gspLine3D_fifoTextEnd[]; +extern long long int gspLine3D_fifoDataStart[], gspLine3D_fifoDataEnd[]; + +/* 2D sprite ucode: */ +extern long long int gspSprite2DTextStart[], gspSprite2DTextEnd[]; +extern long long int gspSprite2DDataStart[], gspSprite2DDataEnd[]; + +/* 2D sprite ucode with output to DRAM: */ +extern long long int gspSprite2D_dramTextStart[], gspSprite2D_dramTextEnd[]; +extern long long int gspSprite2D_dramDataStart[], gspSprite2D_dramDataEnd[]; + +/* 2D sprite ucode with output through DRAM FIFO to RDP: */ +extern long long int gspSprite2D_fifoTextStart[], gspSprite2D_fifoTextEnd[]; +extern long long int gspSprite2D_fifoDataStart[], gspSprite2D_fifoDataEnd[]; + +/* basic audio ucode: */ +extern long long int aspMainTextStart[], aspMainTextEnd[]; +extern long long int aspMainDataStart[], aspMainDataEnd[]; + +/*========== F3DEX/F3DLX/F3DLP/L3DEX ==========*/ +/* FIFO version only */ +extern long long int gspF3DEX_fifoTextStart[], gspF3DEX_fifoTextEnd[]; +extern long long int gspF3DEX_fifoDataStart[], gspF3DEX_fifoDataEnd[]; +extern long long int gspF3DEX_NoN_fifoTextStart[], gspF3DEX_NoN_fifoTextEnd[]; +extern long long int gspF3DEX_NoN_fifoDataStart[], gspF3DEX_NoN_fifoDataEnd[]; + +extern long long int gspF3DLX_fifoTextStart[], gspF3DLX_fifoTextEnd[]; +extern long long int gspF3DLX_fifoDataStart[], gspF3DLX_fifoDataEnd[]; +extern long long int gspF3DLX_NoN_fifoTextStart[], gspF3DLX_NoN_fifoTextEnd[]; +extern long long int gspF3DLX_NoN_fifoDataStart[], gspF3DLX_NoN_fifoDataEnd[]; +extern long long int gspF3DLX_Rej_fifoTextStart[], gspF3DLX_Rej_fifoTextEnd[]; +extern long long int gspF3DLX_Rej_fifoDataStart[], gspF3DLX_Rej_fifoDataEnd[]; + +extern long long int gspF3DLP_Rej_fifoTextStart[], gspF3DLP_Rej_fifoTextEnd[]; +extern long long int gspF3DLP_Rej_fifoDataStart[], gspF3DLP_Rej_fifoDataEnd[]; +extern long long int gspL3DEX_fifoTextStart[], gspL3DEX_fifoTextEnd[]; +extern long long int gspL3DEX_fifoDataStart[], gspL3DEX_fifoDataEnd[]; + +/*========== F3DEX2/F3DLX2/F3DLP2/L3DEX2 ==========*/ +/* FIFO version */ +extern long long int gspF3DEX2_fifoTextStart[], gspF3DEX2_fifoTextEnd[]; +extern long long int gspF3DEX2_fifoDataStart[], gspF3DEX2_fifoDataEnd[]; +extern long long int gspF3DEX2_NoN_fifoTextStart[],gspF3DEX2_NoN_fifoTextEnd[]; +extern long long int gspF3DEX2_NoN_fifoDataStart[],gspF3DEX2_NoN_fifoDataEnd[]; +extern long long int gspF3DEX2_Rej_fifoTextStart[],gspF3DEX2_Rej_fifoTextEnd[]; +extern long long int gspF3DEX2_Rej_fifoDataStart[],gspF3DEX2_Rej_fifoDataEnd[]; +extern long long int gspF3DLX2_Rej_fifoTextStart[],gspF3DLX2_Rej_fifoTextEnd[]; +extern long long int gspF3DLX2_Rej_fifoDataStart[],gspF3DLX2_Rej_fifoDataEnd[]; +extern long long int gspL3DEX2_fifoTextStart[], gspL3DEX2_fifoTextEnd[]; +extern long long int gspL3DEX2_fifoDataStart[], gspL3DEX2_fifoDataEnd[]; + +/* XBUS version */ +extern long long int gspF3DEX2_xbusTextStart[], gspF3DEX2_xbusTextEnd[]; +extern long long int gspF3DEX2_xbusDataStart[], gspF3DEX2_xbusDataEnd[]; +extern long long int gspF3DEX2_NoN_xbusTextStart[],gspF3DEX2_NoN_xbusTextEnd[]; +extern long long int gspF3DEX2_NoN_xbusDataStart[],gspF3DEX2_NoN_xbusDataEnd[]; +extern long long int gspF3DEX2_Rej_xbusTextStart[],gspF3DEX2_Rej_xbusTextEnd[]; +extern long long int gspF3DEX2_Rej_xbusDataStart[],gspF3DEX2_Rej_xbusDataEnd[]; +extern long long int gspF3DLX2_Rej_xbusTextStart[],gspF3DLX2_Rej_xbusTextEnd[]; +extern long long int gspF3DLX2_Rej_xbusDataStart[],gspF3DLX2_Rej_xbusDataEnd[]; +extern long long int gspL3DEX2_xbusTextStart[], gspL3DEX2_xbusTextEnd[]; +extern long long int gspL3DEX2_xbusDataStart[], gspL3DEX2_xbusDataEnd[]; + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_UCODE_H */ diff --git a/lib/ultralib/include/PR/ultraerror.h b/lib/ultralib/include/PR/ultraerror.h new file mode 100644 index 0000000..ebaf59a --- /dev/null +++ b/lib/ultralib/include/PR/ultraerror.h @@ -0,0 +1,165 @@ +/*==================================================================== + * ultraerror.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.27 $ + * $Date: 1999/07/14 02:44:00 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultraerror.h,v $ + * + **************************************************************************/ + +#ifndef __ULTRAERROR_H__ +#define __ULTRAERROR_H__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" + +#define OS_ERROR_FMT "/usr/lib/PR/error.fmt" +#define OS_ERROR_MAGIC 0x6b617479 + +/* OS error codes */ + +#define ERR_OSCREATETHREAD_SP 1 +#define ERR_OSCREATETHREAD_PRI 2 +#define ERR_OSSTARTTHREAD 3 +#define ERR_OSSETTHREADPRI 4 +#define ERR_OSCREATEMESGQUEUE 5 +#define ERR_OSSENDMESG 6 +#define ERR_OSJAMMESG 7 +#define ERR_OSRECVMESG 8 +#define ERR_OSSETEVENTMESG 9 +#define ERR_OSMAPTLB_INDEX 10 +#define ERR_OSMAPTLB_ASID 11 +#define ERR_OSUNMAPTLB 12 +#define ERR_OSSETTLBASID 13 +#define ERR_OSAISETFREQUENCY 14 +#define ERR_OSAISETNEXTBUFFER_ADDR 15 +#define ERR_OSAISETNEXTBUFFER_SIZE 16 +#define ERR_OSDPSETNEXTBUFFER_ADDR 17 +#define ERR_OSDPSETNEXTBUFFER_SIZE 18 +#define ERR_OSPIRAWREADIO 19 +#define ERR_OSPIRAWWRITEIO 20 +#define ERR_OSPIRAWSTARTDMA_DIR 21 +#define ERR_OSPIRAWSTARTDMA_DEVADDR 22 +#define ERR_OSPIRAWSTARTDMA_ADDR 23 +#define ERR_OSPIRAWSTARTDMA_SIZE 24 +#define ERR_OSPIRAWSTARTDMA_RANGE 25 +#define ERR_OSPIREADIO 26 +#define ERR_OSPIWRITEIO 27 +#define ERR_OSPISTARTDMA_PIMGR 28 +#define ERR_OSPISTARTDMA_PRI 29 +#define ERR_OSPISTARTDMA_DIR 30 +#define ERR_OSPISTARTDMA_DEVADDR 31 +#define ERR_OSPISTARTDMA_ADDR 32 +#define ERR_OSPISTARTDMA_SIZE 33 +#define ERR_OSPISTARTDMA_RANGE 34 +#define ERR_OSCREATEPIMANAGER 35 +#define ERR_OSVIGETCURRENTMODE 36 +#define ERR_OSVIGETCURRENTFRAMEBUFFER 37 +#define ERR_OSVIGETNEXTFRAMEBUFFER 38 +#define ERR_OSVISETXSCALE_VALUE 39 +#define ERR_OSVISETXSCALE_VIMGR 40 +#define ERR_OSVISETYSCALE_VALUE 41 +#define ERR_OSVISETYSCALE_VIMGR 42 +#define ERR_OSVISETSPECIAL_VALUE 43 +#define ERR_OSVISETSPECIAL_VIMGR 44 +#define ERR_OSVISETMODE 45 +#define ERR_OSVISETEVENT 46 +#define ERR_OSVISWAPBUFFER_ADDR 47 +#define ERR_OSVISWAPBUFFER_VIMGR 48 +#define ERR_OSCREATEVIMANAGER 49 +#define ERR_OSCREATEREGION_ALIGN 50 +#define ERR_OSCREATEREGION_SIZE 51 +#define ERR_OSMALLOC 52 +#define ERR_OSFREE_REGION 53 +#define ERR_OSFREE_ADDR 54 +#define ERR_OSGETREGIONBUFCOUNT 55 +#define ERR_OSGETREGIONBUFSIZE 56 +#define ERR_OSSPTASKLOAD_DRAM 57 +#define ERR_OSSPTASKLOAD_OUT 58 +#define ERR_OSSPTASKLOAD_OUTSIZE 59 +#define ERR_OSSPTASKLOAD_YIELD 60 +#define ERR_OSPROFILEINIT_STR 61 +#define ERR_OSPROFILEINIT_CNT 62 +#define ERR_OSPROFILEINIT_ALN 63 +#define ERR_OSPROFILEINIT_ORD 64 +#define ERR_OSPROFILEINIT_SIZ 65 +#define ERR_OSPROFILESTART_TIME 66 +#define ERR_OSPROFILESTART_FLAG 67 +#define ERR_OSPROFILESTOP_FLAG 68 +#define ERR_OSPROFILESTOP_TIMER 69 +#define ERR_OSREADHOST_ADDR 70 +#define ERR_OSREADHOST_SIZE 71 +#define ERR_OSWRITEHOST_ADDR 72 +#define ERR_OSWRITEHOST_SIZE 73 +#define ERR_OSGETTIME 74 +#define ERR_OSSETTIME 75 +#define ERR_OSSETTIMER 76 +#define ERR_OSSTOPTIMER 77 +#define ERR_ALSEQP_NO_SOUND 100 +#define ERR_ALSEQP_NO_VOICE 101 +#define ERR_ALSEQP_MAP_VOICE 102 +#define ERR_ALSEQP_OFF_VOICE 103 +#define ERR_ALSEQP_POLY_VOICE 104 +#define ERR_ALSNDP_NO_VOICE 105 +#define ERR_ALSYN_NO_UPDATE 106 +#define ERR_ALSNDPDEALLOCATE 107 +#define ERR_ALSNDPDELETE 108 +#define ERR_ALSNDPPLAY 109 +#define ERR_ALSNDPSETSOUND 110 +#define ERR_ALSNDPSETPRIORITY 111 +#define ERR_ALSNDPSETPAR 112 +#define ERR_ALBNKFNEW 113 +#define ERR_ALSEQNOTMIDI 114 +#define ERR_ALSEQNOTMIDI0 115 +#define ERR_ALSEQNUMTRACKS 116 +#define ERR_ALSEQTIME 117 +#define ERR_ALSEQTRACKHDR 118 +#define ERR_ALSEQSYSEX 119 +#define ERR_ALSEQMETA 120 +#define ERR_ALSEQPINVALIDPROG 121 +#define ERR_ALSEQPUNKNOWNMIDI 122 +#define ERR_ALSEQPUNMAP 123 +#define ERR_ALEVENTNOFREE 124 +#define ERR_ALHEAPNOFREE 125 +#define ERR_ALHEAPCORRUPT 126 +#define ERR_ALHEAPFIRSTBLOCK 127 +#define ERR_ALCSEQZEROSTATUS 128 +#define ERR_ALCSEQZEROVEL 129 +#define ERR_ALCSPVNOTFREE 130 +#define ERR_ALSEQOVERRUN 131 +#define ERR_OSAISETNEXTBUFFER_ENDADDR 132 +#define ERR_ALMODDELAYOVERFLOW 133 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +typedef void (*OSErrorHandler)(s16, s16, ...); + +OSErrorHandler osSetErrorHandler(OSErrorHandler); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* __ULTRAERROR_H__ */ diff --git a/lib/ultralib/include/PR/ultralog.h b/lib/ultralib/include/PR/ultralog.h new file mode 100644 index 0000000..48b84b9 --- /dev/null +++ b/lib/ultralib/include/PR/ultralog.h @@ -0,0 +1,74 @@ +/*==================================================================== + * ultralog.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.6 $ + * $Date: 1997/02/11 08:39:05 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultralog.h,v $ + * + **************************************************************************/ + +#ifndef __log__ +#define __log__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#define OS_LOG_MAX_ARGS 16 +#define OS_LOG_MAGIC 0x20736a73 +#define OS_LOG_FLOAT(x) (*(int *) &(x)) +#define OS_LOG_VERSION 1 + +typedef struct { + u32 magic; /* log identifier */ + u32 len; /* length of log data + log structure */ + u32 *base; /* starting addr array */ + s32 startCount; /* read offset from dataBase */ + s32 writeOffset; /* write offset from dataBase */ +} OSLog; + +typedef struct { + u32 magic; + u32 timeStamp; + u16 argCount; + u16 eventID; +} OSLogItem; + +typedef struct { + u32 magic; /* log identifier */ + u32 version; /* 1 */ +} OSLogFileHdr; + +void osCreateLog(OSLog *log, u32 *base, s32 len); +void osLogEvent(OSLog *log, s16 code, s16 numArgs, ...); +void osFlushLog(OSLog *log); +u32 osLogFloat(f32); + +extern void osDelay(int count); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif diff --git a/lib/ultralib/include/PR/ultratypes.h b/lib/ultralib/include/PR/ultratypes.h new file mode 100644 index 0000000..235cc73 --- /dev/null +++ b/lib/ultralib/include/PR/ultratypes.h @@ -0,0 +1,85 @@ +#ifndef _ULTRATYPES_H_ +#define _ULTRATYPES_H_ + + +/************************************************************************** + * * + * Copyright (C) 1995, 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. * + * * + **************************************************************************/ + + +/************************************************************************* + * + * File: ultratypes.h + * + * This file contains various types used in Ultra64 interfaces. + * + * $Revision: 1.6 $ + * $Date: 1997/12/17 04:02:06 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultratypes.h,v $ + * + **************************************************************************/ + + + +/********************************************************************** + * General data types for R4300 + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef unsigned char u8; /* unsigned 8-bit */ +typedef unsigned short u16; /* unsigned 16-bit */ +typedef unsigned long u32; /* unsigned 32-bit */ +typedef unsigned long long u64; /* unsigned 64-bit */ + +typedef signed char s8; /* signed 8-bit */ +typedef short s16; /* signed 16-bit */ +typedef long s32; /* signed 32-bit */ +typedef long long s64; /* signed 64-bit */ + +typedef volatile unsigned char vu8; /* unsigned 8-bit */ +typedef volatile unsigned short vu16; /* unsigned 16-bit */ +typedef volatile unsigned long vu32; /* unsigned 32-bit */ +typedef volatile unsigned long long vu64; /* unsigned 64-bit */ + +typedef volatile signed char vs8; /* signed 8-bit */ +typedef volatile short vs16; /* signed 16-bit */ +typedef volatile long vs32; /* signed 32-bit */ +typedef volatile long long vs64; /* signed 64-bit */ + +typedef float f32; /* single prec floating point */ +typedef double f64; /* double prec floating point */ + +#if !defined(_SIZE_T) && !defined(_SIZE_T_) && !defined(_SIZE_T_DEF) +#define _SIZE_T +#define _SIZE_T_DEF /* exeGCC size_t define label */ +#if (_MIPS_SZLONG == 32) +typedef unsigned int size_t; +#endif +#if (_MIPS_SZLONG == 64) +typedef unsigned long size_t; +#endif +#endif + +#endif /* _LANGUAGE_C */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* _ULTRATYPES_H_ */ diff --git a/lib/ultralib/include/asm.h b/lib/ultralib/include/asm.h new file mode 100644 index 0000000..1de9f0a --- /dev/null +++ b/lib/ultralib/include/asm.h @@ -0,0 +1 @@ +#include diff --git a/lib/ultralib/include/assert.h b/lib/ultralib/include/assert.h new file mode 100644 index 0000000..bfbf255 --- /dev/null +++ b/lib/ultralib/include/assert.h @@ -0,0 +1,12 @@ +#ifndef __ASSERT_H__ +#define __ASSERT_H__ + +#ifdef NDEBUG +#undef assert +#define assert(EX) ((void)0) +#else +extern void __assert(const char *, const char *, int); +#define assert(EX) ((EX)?((void)0):__assert("EX", __FILE__, __LINE__)) +#endif /* NDEBUG */ + +#endif /* !__ASSERT_H__ */ diff --git a/lib/ultralib/include/dbgdefs.h b/lib/ultralib/include/dbgdefs.h new file mode 100644 index 0000000..f7ead71 --- /dev/null +++ b/lib/ultralib/include/dbgdefs.h @@ -0,0 +1,8 @@ +#ifndef _DBGDEFS_H__ +#define _DBGDEFS_H__ + +typedef int TVid; +typedef unsigned short TVushort; +typedef char TVuchar; + +#endif diff --git a/lib/ultralib/include/dbgproto.h b/lib/ultralib/include/dbgproto.h new file mode 100644 index 0000000..2eabf9a --- /dev/null +++ b/lib/ultralib/include/dbgproto.h @@ -0,0 +1,402 @@ +#ifndef _DBGPROTO_H__ +#define _DBGPROTO_H__ + +#include "dbgdefs.h" + +#define KK_REV 2 + +#define KK_CODE_THREAD_STATUS 4 + +#define KK_TYPE_REQUEST 0 +#define KK_TYPE_REPLY 1 +#define KK_TYPE_EXCEPTION 2 +#define KK_TYPE_THREAD_EXIT 3 +#define KK_TYPE_PROCESS_EXIT 4 +#define KK_TYPE_CONSOLE 5 + +#define TV_ERROR_NO_ERROR 0 +#define TV_ERROR_ILLEGAL_CALL -1 +#define TV_ERROR_INVALID_ID -2 +#define TV_ERROR_INVALID_TYPE -3 +#define TV_ERROR_OPERATIONS_PROTECTED -4 +#define TV_ERROR_INVALID_ADDRESS -5 +#define TV_ERROR_INVALID_PRIORITY -6 +#define TV_ERROR_INVALID_FLAGS -7 +#define TV_ERROR_INVALID_CAPABILITY -8 +#define TV_ERROR_NO_HANDLER -9 +#define TV_ERROR_NO_MORE_IDS -10 +#define TV_ERROR_NO_MORE_MESSAGES -11 +#define TV_ERROR_NO_MORE_PROCESSES -12 +#define TV_ERROR_NO_MORE_THREADS -13 +#define TV_ERROR_NO_MORE_REGIONS -14 +#define TV_ERROR_NO_MORE_TIMERS -15 +#define TV_ERROR_NO_MORE_LOCKS -16 +#define TV_ERROR_NO_MORE_QUEUES -17 +#define TV_ERROR_NO_MORE_SETS -18 +#define TV_ERROR_NO_MORE_MEMORY -19 +#define TV_ERROR_NOT_LOCKED -20 + +typedef struct __KKTimeStruct { + long seconds; + long nanoseconds; +} KKTimeStruct; + +typedef struct __KKObjsStruct { + TVushort number; + TVid objects[1]; +} KKObjs; + +typedef struct __KKFaultInfoStruct { + unsigned int addr; + short major; + short minor; +} KKFaultInfo; + +typedef struct __KKThreadStatusStruct { + int flags; + short why; + short what; + TVid tid; + TVid pid; + unsigned int instr; + KKFaultInfo info; + int priority; + int start; + int rv; + unsigned int args[6]; +} KKThreadStatus; + +#define KK_RUN_SSTEP (1 << 0) +#define KK_RUN_SETPC (1 << 1) + +typedef struct __KKRunStruct { + int flags; + unsigned int vaddr; +} KKRun; + +typedef struct __KKFaultStruct { + short majorMask; + short minorMask; +} KKFault; + +typedef struct __KKRegionStruct { + unsigned int vaddr; + unsigned int size; + short flags; + unsigned int paddr; +} KKRegion; + +typedef struct __KKGregSetStruct { + unsigned int gregs[37]; +} KKGregSet; + +typedef struct __KKFPregSetStruct { + union { + double dregs[16]; + float fregs[32]; + unsigned int regs[32]; + } fpregs; + unsigned int fpcsr; + unsigned int fppad; +} KKFPregSet; + +typedef struct __KKRegisterContextStruct { + KKGregSet gregs; + KKFPregSet fpregs; +} KKRegisterContext; + +typedef struct __KKCpScalarSetStruct { + unsigned int sregs[40]; +} KKCpScalarRegSet; + +typedef struct __KKCpVectorSetStruct { + unsigned int vregs[128]; +} KKCpVectorRegSet; + +typedef struct __KKCpRegisterContextStruct { + KKCpScalarRegSet sregs; + KKCpVectorRegSet vregs; +} KKCpRegisterContext; + +typedef struct __KKUsageStruct { + KKTimeStruct tstamp; + KKTimeStruct created; + KKTimeStruct states[10]; +} KKUsage; + +typedef struct __KKLogEventSetStruct { + int from; + int to; +} KKLogEventSet; + +typedef struct __KKLogStatusStruct { + int bufferType; + int bufferSize; + int dataSize; + int logState; + int flushLimit; +} KKLogStatus; + +typedef struct __KKProcUsageStruct { + TVid pid; + KKTimeStruct states[10]; +} KKProcUsage; + +typedef struct __KKHeaderStruct { + int length; + char code; + char type; + short error; + char rev; + char method; + short notused2; +} KKHeader; + +typedef struct __KKGetFrameRequestStruct { + KKHeader header; + int height; + int width; + int which; +} KKGetFrameRequest; + +typedef struct __KKLoadExecutableRequestStruct { + KKHeader header; + char str[1]; +} KKLoadExecutableRequest; + +typedef struct __KKObjectRequestStruct { + KKHeader header; + TVid object; +} KKObjectRequest; + +typedef struct __KKRunThreadRequestStruct { + KKHeader header; + TVid tid; + KKRun actions; +} KKRunThreadRequest; + +typedef struct __KKFaultRequestStruct { + KKHeader header; + TVid tid; + KKFault fault; + TVuchar stopAllThreads; +} KKFaultRequest; + +typedef struct __KKGRegsetRequestStruct { + KKHeader header; + TVid tid; + KKGregSet registers; +} KKGRegsetRequest; + +typedef struct __KKFPRegsetRequestStruct { + KKHeader header; + TVid tid; + KKFPregSet registers; +} KKFPRegsetRequest; + +typedef struct __KKCpScalarRegsetRequestStruct { + KKHeader header; + TVid tid; + KKCpScalarRegSet registers; +} KKCpScalarRegsetRequest; + +typedef struct __KKCpVectorRegsetRequestStruct { + KKHeader header; + TVid tid; + KKCpVectorRegSet registers; +} KKCpVectorRegsetRequest; + +typedef struct __KKReadRequestStruct { + KKHeader header; + TVid object; + unsigned int addr; + unsigned int nbytes; +} KKReadRequest; + +typedef struct __KKWriteHeaderStruct { + KKHeader header; + TVid object; + unsigned int addr; + unsigned int nbytes; +} KKWriteHeader; + +typedef struct __KKWriteRequestStruct { + KKWriteHeader writeHeader; + char buffer[1]; +} KKWriteRequest; + +typedef struct __KKSetBkptRequestStruct { + KKHeader header; + TVid object; + unsigned int addr; +} KKSetBkptRequest; + +typedef struct __KKClrBkptRequestStruct { + KKHeader header; + TVid object; + TVid bp; +} KKClrBkptRequest; + +typedef struct __KKWatchRequestStruct { + KKHeader header; + TVid object; + unsigned int number; + KKRegion wp[1]; +} KKWatchRequest; + +typedef struct __KKSetCommRequestStruct { + KKHeader header; + unsigned int how; + unsigned int addr; +} KKSetCommRequest; + +typedef struct __KKSysCallSetStruct { + unsigned int word[8]; +} KKSysCallSet; + +typedef struct __KKSysCallRequestStruct { + KKHeader header; + TVid pid; + KKSysCallSet syscallset; +} KKSysCallRequest; + +typedef struct __KKLogEventRequestStruct { + KKHeader header; + unsigned int numSet; + KKLogEventSet set[1]; +} KKLogEventRequest; + +typedef struct __KKNewLogRequestStruct { + KKHeader header; + char str[1]; +} KKNewLogRequest; + +typedef struct __KKRemoteRequestStruct { + KKHeader header; + int len; + char buf[16]; +} KKRemoteRequest; + +typedef struct __KKFlushLogRequestStruct { + KKHeader header; + int no_block; +} KKFlushLogRequest; + +typedef struct __KKLogControlRequestStruct { + KKHeader header; + int command; + int arg; +} KKLogControlRequest; + +typedef struct __KKSetTrptRequestStruct { + KKSetBkptRequest bpRequest; + unsigned short code; +} KKSetTrptRequest; + +typedef KKClrBkptRequest KKClrTrptRequest; + +typedef struct __KKObjectEventStruct { + KKHeader header; + TVid object; +} KKObjectEvent; + +typedef struct __KKObjsEventStruct { + KKHeader header; + TVid object; + KKObjs objs; +} KKObjsEvent; + +typedef struct __KKBufferEventStruct { + KKHeader header; + TVid object; + char buffer[1]; +} KKBufferEvent; + +typedef struct __KKStatusEventStruct { + KKHeader header; + KKThreadStatus status; +} KKStatusEvent; + +typedef struct __KKFaultEventStruct { + KKHeader header; + TVid tid; + KKFault fault; + TVuchar stopAllThreads; +} KKFaultEvent; + +typedef struct __KKNumberEventStruct { + KKHeader header; + TVid object; + unsigned int number; +} KKNumberEvent; + +typedef struct __KKRegionEventStruct { + KKHeader header; + TVid object; + unsigned int number; + KKRegion regions[1]; +} KKRegionEvent; + +typedef struct __KKGregEventStruct { + KKHeader header; + TVid tid; + KKGregSet registers; +} KKGregEvent; + +typedef struct __KKFPregEventStruct { + KKHeader header; + TVid tid; + KKFPregSet registers; +} KKFPregEvent; + +typedef struct __KKCpSregEventStruct { + KKHeader header; + TVid tid; + KKCpScalarRegSet registers; +} KKCpSregEvent; + +typedef struct __KKCpVregEventStruct { + KKHeader header; + TVid tid; + KKCpVectorRegSet registers; +} KKCpVregEvent; + +typedef struct __KKBkptEventStruct { + KKHeader header; + TVid object; + TVid bp; + unsigned int instruction; +} KKBkptEvent; + +typedef struct __KKUsageEventStruct { + KKHeader header; + TVid tid; + KKUsage usage; +} KKUsageEvent; + +typedef struct __KKFlushEventStruct { + KKHeader header; + int bufferType; + char buffer[1]; +} KKFlushEvent; + +typedef struct __KKLogStatusEventStruct { + KKHeader header; + KKLogStatus status; +} KKLogStatusEvent; + +typedef struct __KKSysUsageEventStruct { + KKHeader header; + KKTimeStruct tstamp; + int numProc; + KKProcUsage usage[1]; +} KKSysUsageEvent; + +typedef struct __KKStringEventStruct { + KKHeader header; + char str[1]; +} KKStringEvent; + +typedef KKSysCallRequest KKSysCallEvent; + +#endif diff --git a/lib/ultralib/include/fpregdef.h b/lib/ultralib/include/fpregdef.h new file mode 100644 index 0000000..e69de29 diff --git a/lib/ultralib/include/gcc/math.h b/lib/ultralib/include/gcc/math.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/gcc/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/gcc/memory.h b/lib/ultralib/include/gcc/memory.h new file mode 100644 index 0000000..edfff5e --- /dev/null +++ b/lib/ultralib/include/gcc/memory.h @@ -0,0 +1,23 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +/* + memory.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +void *memccpy(void *,void *,int,size_t); +void *memchr(void *,int,size_t); +int memcmp(const void *,const void *,size_t); +void *memcpy(void *,const void *,size_t); +int memicmp(void *,void *,size_t); +void *memmove(void *,void *,size_t); +void *memset(void *,int,size_t); + +void movmem(void *,void *,unsigned); +void setmem(void *,unsigned,int); + +#endif 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 . + + 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/gcc/stdarg.h b/lib/ultralib/include/gcc/stdarg.h new file mode 100644 index 0000000..af337f6 --- /dev/null +++ b/lib/ultralib/include/gcc/stdarg.h @@ -0,0 +1,121 @@ +#ifndef _STDARG_H +#define _STDARG_H +/* ---------------------------------------- */ +/* VARARGS for MIPS/GNU CC */ +/* */ +/* */ +/* */ +/* */ +/* ---------------------------------------- */ + +/* These macros implement varargs for GNU C--either traditional or ANSU. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef char * __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +#if __mips>=3 +#define __va_rounded_size(__TYPE) \ + (((sizeof (__TYPE) + 8 - 1) / 8) * 8) +#else +#define __va_rounded_size(__TYPE) \ + (((sizeof (__TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#endif + +/* Get definitions for _MIPS_SIM_ABI64 etc. */ +#ifdef _MIPS_SIM +#include +#endif + +#ifdef _STDARG_H +#if defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64) +#define va_start(__AP, __LASTARG) \ + (__AP = __builtin_next_arg (__LASTARG) - 64 \ + + (__builtin_args_info (2) > 8 ? 64 : __builtin_args_info(2) * 8)) +#else +#define va_start(__AP, __LASTARG) \ + (__AP = (__gnuc_va_list) __builtin_next_arg (__LASTARG)) +#endif + +#else +#define va_alist __builtin_va_alist +#if __mips>=3 +/* This assumes that `long long int' is always a 64 bit type. */ +#define va_dcl long long int __builtin_va_alist; __va_ellipsis +#else +#define va_dcl int __builtin_va_alist; __va_ellipsis +#endif +/* Need alternate code for _MIPS_SIM_ABI64, but don't use that symbol + because it may not be defined. */ +#if defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64) +#define va_start(__AP) \ + (__AP = __builtin_next_arg () - 64 \ + + (__builtin_args_info (2) > 8 ? 64 : __builtin_args_info(2) * 8)) +#else +#define va_start(__AP) __AP = (char *) &__builtin_va_alist +#endif +#endif + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#endif +#define va_end(__AP) ((void)0) + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +/* The __mips>=3 cases are reversed from the 32 bit cases, because the standard + 32 bit calling convention left-aligns all parameters smaller than a word, + whereas the __mips>=3 calling convention does not (and hence they are + right aligned). */ +#if __mips>=3 +#ifdef __MIPSEB__ +#define va_arg(__AP, __type) \ + ((__type *) (void *) (__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \ + + __va_rounded_size (__type))))[-1] +#else +#define va_arg(__AP, __type) \ + ((__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \ + + __va_rounded_size (__type))), \ + *(__type *) (void *) (__AP - __va_rounded_size (__type))) +#endif + +#else /* not __mips>=3 */ + +#ifdef __MIPSEB__ +/* For big-endian machines. */ +#define va_arg(__AP, __type) \ + ((__AP = (char *) ((__alignof__ (__type) > 4 \ + ? ((int)__AP + 8 - 1) & -8 \ + : ((int)__AP + 4 - 1) & -4) \ + + __va_rounded_size (__type))), \ + *(__type *) (void *) (__AP - __va_rounded_size (__type))) +#else +/* For little-endian machines. */ +#define va_arg(__AP, __type) \ + ((__type *) (void *) (__AP = (char *) ((__alignof__(__type) > 4 \ + ? ((int)__AP + 8 - 1) & -8 \ + : ((int)__AP + 4 - 1) & -4) \ + + __va_rounded_size(__type))))[-1] +#endif +#endif + +typedef __gnuc_va_list va_list; + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ +#endif diff --git a/lib/ultralib/include/gcc/stdio.h b/lib/ultralib/include/gcc/stdio.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/gcc/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/gcc/stdlib.h b/lib/ultralib/include/gcc/stdlib.h new file mode 100644 index 0000000..98f8a2e --- /dev/null +++ b/lib/ultralib/include/gcc/stdlib.h @@ -0,0 +1,81 @@ +#ifndef _STDLIB_H +#define _STDLIB_H +/* + stdlib.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#ifndef _DIV_T_DEF +#define _DIV_T_DEF +typedef struct DIV_T { + int quot; + int rem; +} div_t; +#endif + +#ifndef _LDIV_T_DEF +#define _LDIV_T_DEF +typedef struct LDIV_T { + long quot; + long rem; +} ldiv_t; +#endif + +#ifndef _LLDIV_T_DEF +#define _LLDIV_T_DEF +typedef struct lldiv_t +{ + long long quot; + long long rem; +} lldiv_t; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define _max(a,b) (((a) > (b)) ? (a) : (b)) +#define _min(a,b) (((a) < (b)) ? (a) : (b)) + +#define RAND_MAX 32767 + +int rand(void); +void srand(unsigned); + +int abs(int); +long labs(long); + +div_t div(int,int); +ldiv_t ldiv(long,long); +lldiv_t lldiv(long long, long long); + +int atoi(const char *); +long atol(const char *); + +long strtol(const char *,char **,int); +unsigned long strtoul(const char *,char **,int); + +char *itoa(int,char *,int); +char *ltoa(long,char *,int); +char *ultoa(unsigned long,char *,int); + +double atof(const char *); +double strtod(const char *,char **); + +void qsort(void *,size_t,size_t,int (*)(const void *,const void *)); +void *bsearch(const void *,const void *,size_t,size_t,int (*)(const void *,const void *)); + +void *malloc(size_t); +void *calloc(size_t,size_t); +void *realloc(void *,size_t); +void free(void *); + +void exit(int); + +void abort(void); + +#endif diff --git a/lib/ultralib/include/gcc/string.h b/lib/ultralib/include/gcc/string.h new file mode 100644 index 0000000..d82e1f1 --- /dev/null +++ b/lib/ultralib/include/gcc/string.h @@ -0,0 +1,42 @@ +#ifndef _STRING_H +#define _STRING_H +/* + string.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#include "memory.h" + +char *stpcpy(char *,const char *); +char *strcat(char *,const char *); +char *strchr(const char *,int); +int strcmp(const char *,const char *); +char *strcpy(char *,const char *); +size_t strcspn(const char *,const char *); +char *strdup(const char *); +char *strerror(int); +int stricmp(const char *,const char *); +size_t strlen(const char *); +char *strlwr(char *); +char *strncat(char *,const char *,size_t); +int strncmp(const char *,const char *,size_t); +char *strncpy(char *,const char *,size_t); +int strnicmp(const char *,const char *,size_t); +char *strnset(char *,int,size_t); +char *strpbrk(const char *,const char *); +char *strrchr(const char *,int); +char *strrev(char *); +char *strset(char *,int); +size_t strspn(const char *,const char *); +char *strstr(const char *,const char *); +char *strtok(char *,const char *); +char *strupr(char *); + +#define strcmpi(s1,s2) stricmp(s1,s2) +#define strncmpi(s1,s2,n) strnicmp(s1,s2,n) + +#endif diff --git a/lib/ultralib/include/ido/math.h b/lib/ultralib/include/ido/math.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/ido/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/ido/memory.h b/lib/ultralib/include/ido/memory.h new file mode 100644 index 0000000..edfff5e --- /dev/null +++ b/lib/ultralib/include/ido/memory.h @@ -0,0 +1,23 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +/* + memory.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +void *memccpy(void *,void *,int,size_t); +void *memchr(void *,int,size_t); +int memcmp(const void *,const void *,size_t); +void *memcpy(void *,const void *,size_t); +int memicmp(void *,void *,size_t); +void *memmove(void *,void *,size_t); +void *memset(void *,int,size_t); + +void movmem(void *,void *,unsigned); +void setmem(void *,unsigned,int); + +#endif diff --git a/lib/ultralib/include/ido/stdarg.h b/lib/ultralib/include/ido/stdarg.h new file mode 100644 index 0000000..62f68e0 --- /dev/null +++ b/lib/ultralib/include/ido/stdarg.h @@ -0,0 +1,33 @@ +#ifndef _STDARG_H +#define _STDARG_H + +typedef char *va_list; +#define _FP 1 +#define _INT 0 +#define _STRUCT 2 + +#define _VA_FP_SAVE_AREA 0x10 +#define _VA_ALIGN(p, a) (((unsigned int)(((char *)p) + ((a) > 4 ? (a) : 4) - 1)) & -((a) > 4 ? (a) : 4)) +#define va_start(vp, parmN) (vp = ((va_list)&parmN + sizeof(parmN))) + +#define __va_stack_arg(list, mode) \ + ( \ + ((list) = (char *)_VA_ALIGN(list, __builtin_alignof(mode)) + \ + _VA_ALIGN(sizeof(mode), 4)), \ + (((char *)list) - (_VA_ALIGN(sizeof(mode), 4) - sizeof(mode)))) + +#define __va_double_arg(list, mode) \ + ( \ + (((long)list & 0x1) /* 1 byte aligned? */ \ + ? (list = (char *)((long)list + 7), (char *)((long)list - 6 - _VA_FP_SAVE_AREA)) \ + : (((long)list & 0x2) /* 2 byte aligned? */ \ + ? (list = (char *)((long)list + 10), (char *)((long)list - 24 - _VA_FP_SAVE_AREA)) \ + : __va_stack_arg(list, mode)))) + +#define va_arg(list, mode) ((mode *)(((__builtin_classof(mode) == _FP && \ + __builtin_alignof(mode) == sizeof(double)) \ + ? __va_double_arg(list, mode) \ + : __va_stack_arg(list, mode))))[-1] +#define va_end(__list) + +#endif /* STDARG_H */ diff --git a/lib/ultralib/include/ido/stdio.h b/lib/ultralib/include/ido/stdio.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/ido/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/ido/stdlib.h b/lib/ultralib/include/ido/stdlib.h new file mode 100644 index 0000000..98f8a2e --- /dev/null +++ b/lib/ultralib/include/ido/stdlib.h @@ -0,0 +1,81 @@ +#ifndef _STDLIB_H +#define _STDLIB_H +/* + stdlib.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#ifndef _DIV_T_DEF +#define _DIV_T_DEF +typedef struct DIV_T { + int quot; + int rem; +} div_t; +#endif + +#ifndef _LDIV_T_DEF +#define _LDIV_T_DEF +typedef struct LDIV_T { + long quot; + long rem; +} ldiv_t; +#endif + +#ifndef _LLDIV_T_DEF +#define _LLDIV_T_DEF +typedef struct lldiv_t +{ + long long quot; + long long rem; +} lldiv_t; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define _max(a,b) (((a) > (b)) ? (a) : (b)) +#define _min(a,b) (((a) < (b)) ? (a) : (b)) + +#define RAND_MAX 32767 + +int rand(void); +void srand(unsigned); + +int abs(int); +long labs(long); + +div_t div(int,int); +ldiv_t ldiv(long,long); +lldiv_t lldiv(long long, long long); + +int atoi(const char *); +long atol(const char *); + +long strtol(const char *,char **,int); +unsigned long strtoul(const char *,char **,int); + +char *itoa(int,char *,int); +char *ltoa(long,char *,int); +char *ultoa(unsigned long,char *,int); + +double atof(const char *); +double strtod(const char *,char **); + +void qsort(void *,size_t,size_t,int (*)(const void *,const void *)); +void *bsearch(const void *,const void *,size_t,size_t,int (*)(const void *,const void *)); + +void *malloc(size_t); +void *calloc(size_t,size_t); +void *realloc(void *,size_t); +void free(void *); + +void exit(int); + +void abort(void); + +#endif diff --git a/lib/ultralib/include/ido/string.h b/lib/ultralib/include/ido/string.h new file mode 100644 index 0000000..d82e1f1 --- /dev/null +++ b/lib/ultralib/include/ido/string.h @@ -0,0 +1,42 @@ +#ifndef _STRING_H +#define _STRING_H +/* + string.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#include "memory.h" + +char *stpcpy(char *,const char *); +char *strcat(char *,const char *); +char *strchr(const char *,int); +int strcmp(const char *,const char *); +char *strcpy(char *,const char *); +size_t strcspn(const char *,const char *); +char *strdup(const char *); +char *strerror(int); +int stricmp(const char *,const char *); +size_t strlen(const char *); +char *strlwr(char *); +char *strncat(char *,const char *,size_t); +int strncmp(const char *,const char *,size_t); +char *strncpy(char *,const char *,size_t); +int strnicmp(const char *,const char *,size_t); +char *strnset(char *,int,size_t); +char *strpbrk(const char *,const char *); +char *strrchr(const char *,int); +char *strrev(char *); +char *strset(char *,int); +size_t strspn(const char *,const char *); +char *strstr(const char *,const char *); +char *strtok(char *,const char *); +char *strupr(char *); + +#define strcmpi(s1,s2) stricmp(s1,s2) +#define strncmpi(s1,s2,n) strnicmp(s1,s2,n) + +#endif diff --git a/lib/ultralib/include/macros.h b/lib/ultralib/include/macros.h new file mode 100644 index 0000000..3057fc8 --- /dev/null +++ b/lib/ultralib/include/macros.h @@ -0,0 +1,16 @@ +#ifndef __MACROS_H__ +#define __MACROS_H__ + +#define ALIGNED(x) __attribute__((aligned(x))) + +#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0]))) + +#define STUBBED_PRINTF(x) ((void)(x)) + +#define UNUSED __attribute__((unused)) + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +#endif diff --git a/lib/ultralib/include/regdef.h b/lib/ultralib/include/regdef.h new file mode 100644 index 0000000..c29cc69 --- /dev/null +++ b/lib/ultralib/include/regdef.h @@ -0,0 +1,3 @@ +#include +#include +#include diff --git a/lib/ultralib/include/sgidefs.h b/lib/ultralib/include/sgidefs.h new file mode 100644 index 0000000..8d4b6e1 --- /dev/null +++ b/lib/ultralib/include/sgidefs.h @@ -0,0 +1,3 @@ +#ifdef __GNUC__ +#include "gcc/sgidefs.h" +#endif diff --git a/lib/ultralib/include/sys/asm.h b/lib/ultralib/include/sys/asm.h new file mode 100644 index 0000000..97f8fb2 --- /dev/null +++ b/lib/ultralib/include/sys/asm.h @@ -0,0 +1,116 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __ASM_H__ +#define __ASM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define _MIPS_ISA_MIPS1 1 /* R2/3K */ +#define _MIPS_ISA_MIPS2 2 /* R4K/6K */ +#define _MIPS_ISA_MIPS3 3 /* R4K */ +#define _MIPS_ISA_MIPS4 4 /* TFP */ + +#define _MIPS_SIM_ABI32 1 /* MIPS MSIG calling convention */ +#define _MIPS_SIM_NABI32 2 /* MIPS new 32-bit abi */ + /* NABI32 is 64bit calling convention but 32bit type sizes) */ +#define _MIPS_SIM_ABI64 3 /* MIPS 64 calling convention */ + + +/* libgultra doesn't match with the .type directive but iQue sdk asm.h uses it */ +#ifdef BBPLAYER +#define ASM_TYPE_FUNC(x) .type x, @function +#else +#define ASM_TYPE_FUNC(x) +#endif + +#define LEAF(x) \ + .globl x ;\ + .align 2 ;\ + ASM_TYPE_FUNC(x) ;\ + .ent x,0 ;\ + x: ;\ + .frame sp,0,ra + +#if defined(BBPLAYER) || defined(__sgi) +#define XLEAF(x) \ + .globl x ;\ + .aent x,0 ;\ + x: +#else +#define XLEAF(x) \ + .globl x +#endif + +#ifdef BBPLAYER +#define END(proc) \ + .end proc ;\ + .size proc, . - proc +#else +#define END(proc) \ + .end proc +#endif + +#define ABS(x, y) \ + .globl x ;\ + x = y + +#define EXPORT(x) \ + .globl x ;\ + x: + +#if defined(BBPLAYER) || defined(__sgi) +#define WEAK(x, y) \ + .weakext x, y +#else +#define WEAK(x, y) +#endif + + + +#define STAY1(stmnt) \ + .set noreorder ;\ + stmnt ;\ + .set reorder + +#define STAY2(stmnt, arg1) \ + .set noreorder ;\ + stmnt, arg1 ;\ + .set reorder + +#define STAY3(stmnt, arg1, arg2) \ + .set noreorder ;\ + stmnt, arg1, arg2 ;\ + .set reorder + +#define NOP \ + .set noreorder ;\ + nop ;\ + .set reorder + +#define CACHE(op, reg) \ + .set noreorder ;\ + cache op, reg ;\ + .set reorder + +#ifdef __cplusplus +} +#endif + +#endif /* !__ASM_H__ */ diff --git a/lib/ultralib/include/sys/fpregdef.h b/lib/ultralib/include/sys/fpregdef.h new file mode 100644 index 0000000..e69de29 diff --git a/lib/ultralib/include/sys/regdef.h b/lib/ultralib/include/sys/regdef.h new file mode 100644 index 0000000..ac9c109 --- /dev/null +++ b/lib/ultralib/include/sys/regdef.h @@ -0,0 +1,187 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __REGDEF_H__ +#define __REGDEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef mips + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define ta0 $12 +#define t5 $13 +#define ta1 $13 +#define t6 $14 +#define ta2 $14 +#define t7 $15 +#define ta3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define a4 $8 +#define ta0 $8 +#define a5 $9 +#define ta1 $9 +#define a6 $10 +#define ta2 $10 +#define a7 $11 +#define ta3 $11 +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define fv0 $f0 +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +#define fa0 $f12 +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +#define ft0 $f4 +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +#define fs0 $f20 +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define fv0 $f0 +#define fv1 $f2 +#define fa0 $f12 +#define fa1 $f13 +#define fa2 $f14 +#define fa3 $f15 +#define fa4 $f16 +#define fa5 $f17 +#define fa6 $f18 +#define fa7 $f19 +#define ft0 $f4 +#define ft1 $f5 +#define ft2 $f6 +#define ft3 $f7 +#define ft4 $f8 +#define ft5 $f9 +#define ft6 $f10 +#define ft7 $f11 +#define ft8 $f20 +#define ft9 $f21 +#define ft10 $f22 +#define ft11 $f23 +#define ft12 $f1 +#define ft13 $f3 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 +#endif + +#define fcr31 $31 + +#endif /* mips */ + +#ifdef __cplusplus +} +#endif + +#endif /* !__REGDEF_H__ */ diff --git a/lib/ultralib/include/ultra64.h b/lib/ultralib/include/ultra64.h new file mode 100644 index 0000000..053db38 --- /dev/null +++ b/lib/ultralib/include/ultra64.h @@ -0,0 +1,40 @@ + +/************************************************************************** + * * + * 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. * + * * + *************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.10 $ + * $Date: 1997/02/11 08:37:33 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultra64.h,v $ + * + **************************************************************************/ + +#ifndef _ULTRA64_H_ +#define _ULTRA64_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/lib/ultralib/include/ultrahost.h b/lib/ultralib/include/ultrahost.h new file mode 100644 index 0000000..2c50b95 --- /dev/null +++ b/lib/ultralib/include/ultrahost.h @@ -0,0 +1,59 @@ +/************************************************************************** + * + * $Revision: 1.1 $ + * $Date: 1999/07/05 02:16:07 $ + * + **************************************************************************/ + +#ifndef _ULTRAHOST_H_ +#define _ULTRAHOST_H_ + +#ifdef WIN32 /* { */ + +int __stdcall uhOpenGame(char *); +int __stdcall uhCloseGame(int); +int __stdcall uhReadGame(int hfd,void *buf,int count); +int __stdcall uhWriteGame(int hfd,void *buf,int count); +int __stdcall uhReadRamrom(int hfd,void *ramrom_adr,void *buf,int count); +int __stdcall uhWriteRamrom(int hfd,void *ramrom_adr,void *buf,int count); +int __stdcall uhPartnerInit(int hfd); +int __stdcall uhPartnerCmd(int hfd,char *ptcmd); +int __stdcall uhGload(int hfd,char *loadfile); + +#else /* }{ */ +#ifdef PTN64 /* { */ + +#define execl execl_pt + +#define uhOpenGame uhOpenGame_pt +#define uhCloseGame uhCloseGame_pt + +#define uhReadGame uhReadGame_pt +#define uhWriteGame uhWriteGame_pt +#define uhReadRamrom uhReadRamrom_pt +#define uhWriteRamrom uhWriteRamrom_pt +#define uhPartnerCmd uhPartnerCmd_pt +#define uhGload uhGload_pt + +int uhPartnerCmd(int,char *); +int uhGload(int,char *); + +#endif /* } */ + +#ifdef __cplusplus +extern "C" { +#endif +int uhOpenGame(const char *); +int uhCloseGame(int); + +int uhReadGame(int, void *, int); +int uhWriteGame(int, void *, int); +int uhWriteRamrom(int, void *, void*, int); +int uhReadRamrom(int, void *, void*, int); + +#ifdef __cplusplus +} +#endif +#endif /* } */ + +#endif /* ULTRAHOST */ diff --git a/lib/ultralib/src/audio/Makefile b/lib/ultralib/src/audio/Makefile new file mode 100644 index 0000000..d8fdce4 --- /dev/null +++ b/lib/ultralib/src/audio/Makefile @@ -0,0 +1,120 @@ +#!smake +# +# Makefile for audio library subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = \ + drvrnew.c \ + load.c \ + auxbus.c \ + bnkf.c \ + env.c \ + event.c \ + filter.c \ + mainbus.c \ + resample.c \ + reverb.c \ + save.c \ + seq.c \ + sl.c \ + heapcheck.c \ + heapinit.c \ + heapalloc.c \ + copy.c \ + seqpdelete.c \ + seqpgetfxmix.c \ + seqpgetpan.c \ + seqpgetchlvol.c \ + seqpgetpriority.c \ + seqpgetprogram.c \ + seqpgetseq.c \ + seqpgettempo.c \ + seqpgetvol.c \ + seqpgetstate.c \ + seqploop.c \ + seqpplay.c \ + seqpsendmidi.c \ + seqpsetbank.c \ + seqpsetfxmix.c \ + seqpsetpan.c \ + seqpsetchlvol.c \ + seqpsetpriority.c \ + seqpsetprogram.c \ + seqpsetseq.c \ + seqpsettempo.c \ + seqpsetvol.c \ + seqpstop.c \ + seqplayer.c \ + cseq.c \ + cspdelete.c \ + cspgetfxmix.c \ + cspgetpan.c \ + cspgetchlvol.c \ + cspgetpriority.c \ + cspgetprogram.c \ + cspgetseq.c \ + cspgettempo.c \ + cspgetvol.c \ + cspgetstate.c \ + cspplay.c \ + cspsendmidi.c \ + cspsetbank.c \ + cspsetfxmix.c \ + cspsetpan.c \ + cspsetchlvol.c \ + cspsetpriority.c \ + cspsetprogram.c \ + cspsetseq.c \ + cspsettempo.c \ + cspsetvol.c \ + cspstop.c \ + csplayer.c \ + sndplayer.c \ + sndpdelete.c \ + sndpallocate.c \ + sndpdeallocate.c \ + sndpsetsound.c \ + sndpplay.c \ + sndpplayat.c \ + sndpgetsound.c \ + sndpstop.c \ + sndpgetstate.c \ + sndpsetpitch.c \ + sndpsetpriority.c \ + sndpsetvol.c \ + sndpsetpan.c \ + sndpsetfxmix.c \ + synthesizer.c \ + syndelete.c \ + synaddplayer.c \ + synremoveplayer.c \ + synfreevoice.c \ + synallocvoice.c \ + synstopvoice.c \ + synstartvoice.c \ + synstartvoiceparam.c \ + synsetpitch.c \ + synsetvol.c \ + synsetfxmix.c \ + synsetpan.c \ + syngetpriority.c \ + synsetpriority.c \ + synallocfx.c \ + synfreefx.c \ + syngetfxref.c \ + synsetfxparam.c \ + cents2ratio.c \ + parse_abi.c + +TARGETS = $(CFILES:.c=.o) + +default : $(TARGETS) + +include $(COMMONRULES) + + diff --git a/src/libultra/al/auxbus.c b/lib/ultralib/src/audio/auxbus.c similarity index 100% rename from src/libultra/al/auxbus.c rename to lib/ultralib/src/audio/auxbus.c diff --git a/src/libultra/al/bnkf.c b/lib/ultralib/src/audio/bnkf.c similarity index 100% rename from src/libultra/al/bnkf.c rename to lib/ultralib/src/audio/bnkf.c diff --git a/lib/ultralib/src/audio/cents2ratio.c b/lib/ultralib/src/audio/cents2ratio.c new file mode 100644 index 0000000..55cd2a3 --- /dev/null +++ b/lib/ultralib/src/audio/cents2ratio.c @@ -0,0 +1,33 @@ +/* + * alCents2Ratio() + * + * Calculates the pitch shift ratio from the number of cents according to + * ratio = 2^(cents/1200) + * + * This is accurate to within one cent for ratios up and octave and down + * two ocataves. + */ + +#include + +f32 alCents2Ratio(s32 cents) +{ + f32 x; + f32 ratio = 1.0f; + + if (cents >= 0) { + x = 1.00057779f; /* 2^(1/1200) */ + } else { + x = 0.9994225441f; /* 2^(-1/1200) */ + cents = -cents; + } + + while (cents) { + if (cents & 1) + ratio *= x; + x *= x; + cents >>= 1; + } + + return ratio; +} diff --git a/src/libultra/al/copy.c b/lib/ultralib/src/audio/copy.c similarity index 99% rename from src/libultra/al/copy.c rename to lib/ultralib/src/audio/copy.c index e1d7955..e80a8df 100644 --- a/src/libultra/al/copy.c +++ b/lib/ultralib/src/audio/copy.c @@ -32,3 +32,4 @@ void alCopy(void *src, void *dest, s32 len) *d++ = *s++; } } + diff --git a/lib/ultralib/src/audio/cseq.c b/lib/ultralib/src/audio/cseq.c new file mode 100644 index 0000000..9c4b8bd --- /dev/null +++ b/lib/ultralib/src/audio/cseq.c @@ -0,0 +1,409 @@ +/*==================================================================== + * cseq.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include +#include "cseq.h" + + +static u32 __readVarLen(ALCSeq *s,u32 track); +static u8 __getTrackByte(ALCSeq *s,u32 track); +static u32 __alCSeqGetTrackEvent(ALCSeq *seq, u32 track, ALEvent *event); + +void alCSeqNew(ALCSeq *seq, u8 *ptr) +{ + u32 i,tmpOff,flagTmp; + + /* load the seqence pointed to by ptr */ + seq->base = (ALCMidiHdr*)ptr; + seq->validTracks = 0; + seq->lastDeltaTicks = 0; + seq->lastTicks = 0; + seq->deltaFlag = 1; + + for(i = 0; i < 16; i++) + { + seq->lastStatus[i] = 0; + seq->curBUPtr[i] = 0; + seq->curBULen[i] = 0; + tmpOff = seq->base->trackOffset[i]; + if(tmpOff) /* if the track is valid */ + { + flagTmp = 1 << i; + seq->validTracks |= flagTmp; + seq->curLoc[i] = (u8*)((u32)ptr + tmpOff); + seq->evtDeltaTicks[i] = __readVarLen(seq,i); + /*__alCSeqGetTrackEvent(seq,i); prime the event buffers */ + } + else + seq->curLoc[i] = 0; + } + + seq->qnpt = 1.0/(f32)seq->base->division; +} + +void alCSeqNextEvent(ALCSeq *seq,ALEvent *evt) +{ + u32 i; + u32 firstTime = 0xFFFFFFFF; + u32 firstTrack; + u32 lastTicks = seq->lastDeltaTicks; + +#ifdef _DEBUG + /* sct 1/17/96 - Warn if we are beyond the end of sequence. */ + if (!seq->validTracks) + __osError(ERR_ALSEQOVERRUN, 0); +#endif + + + for(i = 0; i < 16 ; i++) + { + if((seq->validTracks >> i) & 1) + { + if(seq->deltaFlag) + seq->evtDeltaTicks[i] -= lastTicks; + if(seq->evtDeltaTicks[i] < firstTime) + { + firstTime = seq->evtDeltaTicks[i]; + firstTrack = i; + } + } + } + + __alCSeqGetTrackEvent(seq,firstTrack,evt); + + evt->msg.midi.ticks = firstTime; + seq->lastTicks += firstTime; + seq->lastDeltaTicks = firstTime; + if(evt->type != AL_TRACK_END) + seq->evtDeltaTicks[firstTrack] += __readVarLen(seq,firstTrack); + seq->deltaFlag = 1; + +} + + +/* + Note: If there are no valid tracks (ie. all tracks have + reached the end of their data stream), then return FALSE + to indicate that there is no next event. +*/ +char __alCSeqNextDelta(ALCSeq *seq, s32 *pDeltaTicks) +{ + u32 i; + u32 firstTime = 0xFFFFFFFF; + u32 lastTicks = seq->lastDeltaTicks; + + if (!seq->validTracks) + return FALSE; + + for(i = 0; i < 16 ; i++) + { + if((seq->validTracks >> i) & 1) + { + if(seq->deltaFlag) + seq->evtDeltaTicks[i] -= lastTicks; + + if(seq->evtDeltaTicks[i] < firstTime) + firstTime = seq->evtDeltaTicks[i]; + } + } + + seq->deltaFlag = 0; + *pDeltaTicks = firstTime; + + return TRUE; +} + +/* only call alCSeqGetTrackEvent with a valid track !! */ +static u32 __alCSeqGetTrackEvent(ALCSeq *seq, u32 track, ALEvent *event) +{ + u32 offset; + u8 status, loopCt, curLpCt, *tmpPtr; + + + status = __getTrackByte(seq,track); /* read the status byte */ + + if (status == AL_MIDI_Meta) /* running status not allowed on meta events!! */ + { + u8 type = __getTrackByte(seq,track); + + if (type == AL_MIDI_META_TEMPO) + { + event->type = AL_TEMPO_EVT; + event->msg.tempo.status = status; + event->msg.tempo.type = type; + event->msg.tempo.byte1 = __getTrackByte(seq,track); + event->msg.tempo.byte2 = __getTrackByte(seq,track); + event->msg.tempo.byte3 = __getTrackByte(seq,track); + seq->lastStatus[track] = 0; /* lastStatus not supported after meta */ + } + else if (type == AL_MIDI_META_EOT) + { + u32 flagMask; + + flagMask = 0x01 << track; + seq->validTracks = seq->validTracks ^ flagMask; + + if(seq->validTracks) /* there is music left don't end */ + event->type = AL_TRACK_END; + else /* no more music send AL_SEQ_END_EVT msg */ + event->type = AL_SEQ_END_EVT; + } + else if (type == AL_CMIDI_LOOPSTART_CODE) + { + status = __getTrackByte(seq,track); /* get next two bytes, ignore them */ + status = __getTrackByte(seq,track); + seq->lastStatus[track] = 0; + event->type = AL_CSP_LOOPSTART; + } + else if (type == AL_CMIDI_LOOPEND_CODE) + { + tmpPtr = seq->curLoc[track]; + loopCt = *tmpPtr++; + curLpCt = *tmpPtr; + if(curLpCt == 0) /* done looping */ + { + *tmpPtr = loopCt; /* reset current loop count */ + seq->curLoc[track] = tmpPtr + 5; /* move pointer to end of event */ + } + else + { + if(curLpCt != 0xFF) /* not a loop forever */ + *tmpPtr = curLpCt - 1; /* decrement current loop count */ + tmpPtr++; /* get offset from end of event */ + offset = (*tmpPtr++) << 24; + offset += (*tmpPtr++) << 16; + offset += (*tmpPtr++) << 8; + offset += *tmpPtr++; + seq->curLoc[track] = tmpPtr - offset; + } + seq->lastStatus[track] = 0; + event->type = AL_CSP_LOOPEND; + } + +#ifdef _DEBUG + else + __osError(ERR_ALSEQMETA, 1, type); +#endif + + } + else + { + event->type = AL_SEQ_MIDI_EVT; + if (status & 0x80) /* if high bit is set, then new status */ + { + event->msg.midi.status = status; + event->msg.midi.byte1 = __getTrackByte(seq,track); + seq->lastStatus[track] = status; + } + else /* running status */ + { +#ifdef _DEBUG + if(seq->lastStatus[track] == 0) + __osError(ERR_ALCSEQZEROSTATUS, 1, track); +#endif + event->msg.midi.status = seq->lastStatus[track]; + event->msg.midi.byte1 = status; + } + + if (((event->msg.midi.status & 0xf0) != AL_MIDI_ProgramChange) && + ((event->msg.midi.status & 0xf0) != AL_MIDI_ChannelPressure)) + { + event->msg.midi.byte2 = __getTrackByte(seq,track); + if((event->msg.midi.status & 0xf0) == AL_MIDI_NoteOn) + { + event->msg.midi.duration = __readVarLen(seq,track); +#ifdef _DEBUG + if(event->msg.midi.byte2 == 0) + __osError( ERR_ALCSEQZEROVEL, 1, track); +#endif + } + } + else + event->msg.midi.byte2 = 0; + } + return TRUE; +} + +f32 alCSeqTicksToSec(ALCSeq *seq, s32 ticks, u32 tempo) +{ + return ((f32) (((f32)(ticks) * (f32)(tempo)) / + ((f32)(seq->base->division) * 1000000.0))); +} + +u32 alCSeqSecToTicks(ALCSeq *seq, f32 sec, u32 tempo) +{ + return (u32)(((sec * 1000000.0) * seq->base->division) / tempo); +} + + +s32 alCSeqGetTicks(ALCSeq *seq) +{ + return seq->lastTicks; +} + + +void alCSeqNewMarker(ALCSeq *seq, ALCSeqMarker *m, u32 ticks) +{ + ALEvent evt; + ALCSeq tempSeq; + s32 i; + + + alCSeqNew(&tempSeq, (u8*)seq->base); + + do { + m->validTracks = tempSeq.validTracks; + m->lastTicks = tempSeq.lastTicks; + m->lastDeltaTicks = tempSeq.lastDeltaTicks; + + for(i=0;i<16;i++) + { + m->curLoc[i] = tempSeq.curLoc[i]; + m->curBUPtr[i] = tempSeq.curBUPtr[i]; + m->curBULen[i] = tempSeq.curBULen[i]; + m->lastStatus[i] = tempSeq.lastStatus[i]; + m->evtDeltaTicks[i] = tempSeq.evtDeltaTicks[i]; + } + + alCSeqNextEvent(&tempSeq, &evt); + + if (evt.type == AL_SEQ_END_EVT) + break; + + } while (tempSeq.lastTicks < ticks); + +} + +void alCSeqSetLoc(ALCSeq *seq, ALCSeqMarker *m) +{ + s32 i; + + seq->validTracks = m->validTracks; + seq->lastTicks = m->lastTicks; + seq->lastDeltaTicks = m->lastDeltaTicks; + + for(i=0;i<16;i++) + { + seq->curLoc[i] = m->curLoc[i]; + seq->curBUPtr[i] = m->curBUPtr[i]; + seq->curBULen[i] = m->curBULen[i]; + seq->lastStatus[i] = m->lastStatus[i]; + seq->evtDeltaTicks[i] = m->evtDeltaTicks[i]; + } +} + +void alCSeqGetLoc(ALCSeq *seq, ALCSeqMarker *m) +{ + s32 i; + + m->validTracks = seq->validTracks; + m->lastTicks = seq->lastTicks; + m->lastDeltaTicks = seq->lastDeltaTicks; + + for(i=0;i<16;i++) + { + m->curLoc[i] = seq->curLoc[i]; + m->curBUPtr[i] = seq->curBUPtr[i]; + m->curBULen[i] = seq->curBULen[i]; + m->lastStatus[i] = seq->lastStatus[i]; + m->evtDeltaTicks[i] = seq->evtDeltaTicks[i]; + } +} + +/* non-aligned byte reading routines */ +static u8 __getTrackByte(ALCSeq *seq,u32 track) +{ + u8 theByte; + + + if(seq->curBULen[track]) + { + theByte = *seq->curBUPtr[track]; + seq->curBUPtr[track]++; + seq->curBULen[track]--; + } + else /* need to handle backup mode */ + { + theByte = *seq->curLoc[track]; + seq->curLoc[track]++; + if(theByte == AL_CMIDI_BLOCK_CODE) + { + u8 loBackUp,hiBackUp,theLen,nextByte; + u32 backup; + + nextByte = *seq->curLoc[track]; + seq->curLoc[track]++; + if(nextByte != AL_CMIDI_BLOCK_CODE) + { + /* if here, then got a backup section. get the amount of + backup, and the len of the section. Subtract the amount of + backup from the curLoc ptr, and subtract four more, since + curLoc has been advanced by four while reading the codes. */ + hiBackUp = nextByte; + loBackUp = *seq->curLoc[track]; + seq->curLoc[track]++; + theLen = *seq->curLoc[track]; + seq->curLoc[track]++; + backup = (u32)hiBackUp; + backup = backup << 8; + backup += loBackUp; + seq->curBUPtr[track] = seq->curLoc[track] - (backup + 4); + seq->curBULen[track] = (u32)theLen; + + /* now get the byte */ + theByte = *seq->curBUPtr[track]; + seq->curBUPtr[track]++; + seq->curBULen[track]--; + } + } + } + + return theByte; +} + +static u32 __readVarLen(ALCSeq *seq,u32 track) +{ + u32 value; + u32 c; + + value = (u32)__getTrackByte(seq,track); + if ( value & 0x00000080 ) + { + value &= 0x7f; + do + { + c = (u32)__getTrackByte(seq,track); + value = (value << 7) + (c & 0x7f); + } while (c & 0x80); + } + return (value); +} + + + + + + + + + + diff --git a/lib/ultralib/src/audio/cseq.h b/lib/ultralib/src/audio/cseq.h new file mode 100644 index 0000000..0342398 --- /dev/null +++ b/lib/ultralib/src/audio/cseq.h @@ -0,0 +1,11 @@ + + + +#ifndef __cseq__ +#define __cseq__ + + +char __alCSeqNextDelta(ALCSeq *seq, s32 *pDeltaTicks); + + +#endif /* __cseq__ */ diff --git a/lib/ultralib/src/audio/cseqp.h b/lib/ultralib/src/audio/cseqp.h new file mode 100644 index 0000000..bb72541 --- /dev/null +++ b/lib/ultralib/src/audio/cseqp.h @@ -0,0 +1,10 @@ + + +#ifndef __cseqp__ +#define __cseqp__ + + +void __CSPPostNextSeqEvent(ALCSPlayer *seqp); + + +#endif /* __cseqp__ */ diff --git a/lib/ultralib/src/audio/cspdelete.c b/lib/ultralib/src/audio/cspdelete.c new file mode 100644 index 0000000..063c543 --- /dev/null +++ b/lib/ultralib/src/audio/cspdelete.c @@ -0,0 +1,29 @@ +/*==================================================================== + * cspdelete.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPDelete(ALCSPlayer *seqp) +{ + alSynRemovePlayer(seqp->drvr, &seqp->node); +} + diff --git a/lib/ultralib/src/audio/cspgetchlvol.c b/lib/ultralib/src/audio/cspgetchlvol.c new file mode 100644 index 0000000..23d256e --- /dev/null +++ b/lib/ultralib/src/audio/cspgetchlvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspgetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alCSPGetChlVol(ALCSPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].vol; +} + diff --git a/lib/ultralib/src/audio/cspgetfxmix.c b/lib/ultralib/src/audio/cspgetfxmix.c new file mode 100644 index 0000000..c67e033 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetfxmix.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspgetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alCSPGetChlFXMix(ALCSPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].fxmix; +} + diff --git a/lib/ultralib/src/audio/cspgetpan.c b/lib/ultralib/src/audio/cspgetpan.c new file mode 100644 index 0000000..5c0e322 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetpan.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspgetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALPan alCSPGetChlPan(ALCSPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].pan; +} + diff --git a/lib/ultralib/src/audio/cspgetpriority.c b/lib/ultralib/src/audio/cspgetpriority.c new file mode 100644 index 0000000..ac38cae --- /dev/null +++ b/lib/ultralib/src/audio/cspgetpriority.c @@ -0,0 +1,26 @@ +/*==================================================================== + * cspgetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alCSPGetChlPriority(ALCSPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].priority; +} diff --git a/lib/ultralib/src/audio/cspgetprogram.c b/lib/ultralib/src/audio/cspgetprogram.c new file mode 100644 index 0000000..382616f --- /dev/null +++ b/lib/ultralib/src/audio/cspgetprogram.c @@ -0,0 +1,42 @@ +/*==================================================================== + * cspgetprogram.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alCSPGetChlProgram(ALCSPlayer *seqp, u8 chan) + +{ + s32 i; + ALBank *b = seqp->bank; + ALInstrument *inst; + ALChanState s; + + s = seqp->chanState[chan]; + for (i=0; iinstCount; i++){ + inst = b->instArray[i]; + if (inst == s.instrument) + return i; + } + return(-1); + +} + diff --git a/lib/ultralib/src/audio/cspgetseq.c b/lib/ultralib/src/audio/cspgetseq.c new file mode 100644 index 0000000..85d2545 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetseq.c @@ -0,0 +1,29 @@ +/*==================================================================== + * cspgetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALCSeq *alCSPGetSeq(ALCSPlayer *seqp) +{ + return seqp->target; +} + diff --git a/lib/ultralib/src/audio/cspgetstate.c b/lib/ultralib/src/audio/cspgetstate.c new file mode 100644 index 0000000..9be7937 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetstate.c @@ -0,0 +1,29 @@ +/*==================================================================== + * cspgetstate.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alCSPGetState(ALCSPlayer *seqp) +{ + return seqp->state; +} + diff --git a/lib/ultralib/src/audio/cspgettempo.c b/lib/ultralib/src/audio/cspgettempo.c new file mode 100644 index 0000000..ed3dfe2 --- /dev/null +++ b/lib/ultralib/src/audio/cspgettempo.c @@ -0,0 +1,31 @@ +/*==================================================================== + * cspgettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alCSPGetTempo(ALCSPlayer *seqp) +{ + /* sct 1/8/96 - If no target sequence has been set, just return zero (instead of crashing). */ + if (seqp->target == NULL) + return 0; + + return seqp->uspt/seqp->target->qnpt; +} + diff --git a/lib/ultralib/src/audio/cspgetvol.c b/lib/ultralib/src/audio/cspgetvol.c new file mode 100644 index 0000000..5353228 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspgetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s16 alCSPGetVol(ALCSPlayer *seqp) +{ + return seqp->vol; +} + diff --git a/lib/ultralib/src/audio/csplayer.c b/lib/ultralib/src/audio/csplayer.c new file mode 100644 index 0000000..5cd3df6 --- /dev/null +++ b/lib/ultralib/src/audio/csplayer.c @@ -0,0 +1,882 @@ +/*==================================================================== + * csplayer.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/* + * Notes: + * + * Controller Numbers: + * 1 Modulation + * 7 Volume + * 10 Pan + * 11 Expression + * 64 Sustain + * 121 Reset All Controllers + * 123 All Notes Off + * + * Registered Parameters + * 0 Pitch Bend Sensitivity + * 1 Fine Tuning + * 2 Coarse Tuning + */ + +#include +#include +#include +#include +#include "seqp.h" +#include "cseqp.h" +#include "cseq.h" +// TODO: this comes from a header +#ident "$Revision: 1.17 $" +static ALMicroTime __CSPVoiceHandler(void *node); +static void __CSPHandleNextSeqEvent(ALCSPlayer *seqp); +static void __CSPHandleMIDIMsg(ALCSPlayer *seqp, ALEvent *event); +static void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event); +static void __CSPRepostEvent(ALEventQueue *evtq, ALEventListItem *item); +static void __setUsptFromTempo(ALCSPlayer *seqp, f32 tempo); /* sct 1/8/96 */ + + +/* + * Sequence Player public functions + */ +void alCSPNew(ALCSPlayer *seqp, ALSeqpConfig *c) +{ + s32 i; + ALEventListItem *items; + ALVoiceState *vs; + ALVoiceState *voices; + + ALHeap *hp = c->heap; + + /* + * initialize member variables + */ + seqp->bank = 0; + seqp->target = NULL; + seqp->drvr = &alGlobals->drvr; + seqp->chanMask = 0xff; + seqp->uspt = 488; + seqp->nextDelta = 0; + seqp->state = AL_STOPPED; + seqp->vol = 0x7FFF; /* full volume */ + seqp->frameTime = AL_USEC_PER_FRAME; /* should get this from driver */ + seqp->curTime = 0; + 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 + */ + seqp->maxChannels = c->maxChannels; + seqp->chanState = alHeapAlloc(hp, c->maxChannels, sizeof(ALChanState) ); + __initChanState((ALSeqPlayer*)seqp); /* sct 11/6/95 */ + + /* + * init the voice state array + */ + voices = alHeapAlloc(hp, c->maxVoices, sizeof(ALVoiceState)); + seqp->vFreeList = 0; + for (i = 0; i < c->maxVoices; i++) { + vs = &voices[i]; + vs->next = seqp->vFreeList; + seqp->vFreeList = vs; + } + + seqp->vAllocHead = 0; + seqp->vAllocTail = 0; +#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 + */ + seqp->node.next = NULL; + seqp->node.handler = __CSPVoiceHandler; + seqp->node.clientData = seqp; + alSynAddPlayer(&alGlobals->drvr, &seqp->node); +} + +/************************************************************* + * private routines or driver callback routines + *************************************************************/ +static ALMicroTime __CSPVoiceHandler(void *node) +{ + ALCSPlayer *seqp = (ALCSPlayer *) node; + ALEvent evt; + ALVoice *voice; + ALMicroTime delta; + ALVoiceState *vs; + void *oscState; + f32 oscValue; + u8 chan; + + do { + switch (seqp->nextEvent.type) + { + case (AL_SEQ_REF_EVT): + __CSPHandleNextSeqEvent(seqp); + break; + + case (AL_SEQP_API_EVT): + evt.type = AL_SEQP_API_EVT; + alEvtqPostEvent(&seqp->evtq, (ALEvent *)&evt, seqp->frameTime); + break; + + case (AL_NOTE_END_EVT): + voice = seqp->nextEvent.msg.note.voice; + + alSynStopVoice(seqp->drvr, voice); + alSynFreeVoice(seqp->drvr, voice); + vs = (ALVoiceState *)voice->clientPrivate; + if(vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp,vs); + __unmapVoice((ALSeqPlayer*)seqp, voice); + break; + + case (AL_SEQP_ENV_EVT): + voice = seqp->nextEvent.msg.vol.voice; + vs = (ALVoiceState *)voice->clientPrivate; + + if(vs->envPhase == AL_PHASE_ATTACK) + vs->envPhase = AL_PHASE_DECAY; + + delta = seqp->nextEvent.msg.vol.delta; + vs->envEndTime = seqp->curTime + delta; + vs->envGain = seqp->nextEvent.msg.vol.vol; + alSynSetVol(seqp->drvr, voice, __vsVol(vs, (ALSeqPlayer*)seqp), delta); + break; + + case (AL_TREM_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + delta = (*seqp->updateOsc)(oscState,&oscValue); + vs->tremelo = (u8)oscValue; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs,(ALSeqPlayer*)seqp), + __vsDelta(vs,seqp->curTime)); + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_VIB_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + chan = seqp->nextEvent.msg.osc.chan; + delta = (*seqp->updateOsc)(oscState,&oscValue); + vs->vibrato = oscValue; + alSynSetPitch(seqp->drvr, &vs->voice, vs->pitch * vs->vibrato + * seqp->chanState[chan].pitchBend); + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_SEQP_MIDI_EVT): + case (AL_CSP_NOTEOFF_EVT): /* nextEvent is a note off midi message */ + __CSPHandleMIDIMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_META_EVT): + __CSPHandleMetaMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_VOL_EVT): + seqp->vol = seqp->nextEvent.msg.spvol.vol; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + alSynSetVol(seqp->drvr, &vs->voice, + __vsVol(vs, (ALSeqPlayer*)seqp), + __vsDelta(vs, seqp->curTime)); + } + break; + + case (AL_SEQP_PLAY_EVT): + if (seqp->state != AL_PLAYING) + { + seqp->state = AL_PLAYING; + __CSPPostNextSeqEvent(seqp); /* seqp must be AL_PLAYING before we call this routine. */ + } + break; + + case (AL_SEQP_STOP_EVT): + if ( seqp->state == AL_STOPPING ) + { + for (vs = seqp->vAllocHead; vs != 0; vs = seqp->vAllocHead) + { +#ifdef _DEBUG + __osError(ERR_ALCSPVNOTFREE, 2, vs->channel, vs->key); +#endif + alSynStopVoice(seqp->drvr, &vs->voice); + alSynFreeVoice(seqp->drvr, &vs->voice); + if(vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp,vs); + __unmapVoice((ALSeqPlayer*)seqp, &vs->voice); + } + seqp->state = AL_STOPPED; + + /* alEvtqFlush(&seqp->evtq); - Don't flush event queue + anymore. */ + /* sct 1/3/96 - Don't overwrite nextEvent with + AL_SEQP_API_EVT or set nextDelta to + AL_USEC_PER_FRAME since we're not stopping event + processing. */ + /* sct 1/3/96 - Don't return here since we keep + processing events as usual. */ + } + break; + + case (AL_SEQP_STOPPING_EVT): + if (seqp->state == AL_PLAYING) + { + /* sct 12/29/95 - Remove events associated with the + * stopping sequence. For compact sequence player, + * also remove all queued note off events since they + * are not contained in a compact sequence but are + * generated in response to note ons. Note that + * flushing AL_SEQP_MIDI_EVTs may flush events that + * were posted after the call to alSeqpStop, so the + * application must queue these events either when + * the player is fully stopped, or when it is + * playing. */ + alEvtqFlushType(&seqp->evtq, AL_SEQ_REF_EVT); + alEvtqFlushType(&seqp->evtq, AL_CSP_NOTEOFF_EVT); + alEvtqFlushType(&seqp->evtq, AL_SEQP_MIDI_EVT); + + /* sct 1/3/96 - Check to see which voices need to be + killed and release them. */ + /* Unkilled voices should have note end events + occurring prior to KILL_TIME. */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + if (__voiceNeedsNoteKill ((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME)) + __seqpReleaseVoice((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME); + } + + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + } + break; + + case (AL_SEQP_PRIORITY_EVT): + chan = seqp->nextEvent.msg.sppriority.chan; + seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority; + break; + + case (AL_SEQP_SEQ_EVT): +#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); + if (seqp->bank) + __initFromBank((ALSeqPlayer *)seqp, seqp->bank); + break; + + case (AL_SEQP_BANK_EVT): +#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); + break; + + /* sct 11/6/95 - these events should now be handled by __CSPHandleNextSeqEvent */ + case (AL_SEQ_END_EVT): + case (AL_TEMPO_EVT): + case (AL_SEQ_MIDI_EVT): +#if BUILD_VERSION < VERSION_J +#line 313 +#endif + assert(FALSE); + + break; + } + seqp->nextDelta = alEvtqNextEvent(&seqp->evtq, &seqp->nextEvent); + + } while (seqp->nextDelta == 0); + + /* + * assume that next callback won't be more than half an + * hour away + */ + seqp->curTime += seqp->nextDelta; /* sct 11/7/95 */ + return seqp->nextDelta; +} + +/* + Calculates the delta time in ticks until the next sequence + event and posts a sequence reference event with the time in usecs. + Loops are handled automatically by the compact sequence. + + Does nothing if the sequence player is not playing or if there + is no target sequence. + + sct 11/7/95 +*/ +void __CSPPostNextSeqEvent(ALCSPlayer *seqp) +{ + ALEvent evt; + s32 deltaTicks; + + if (seqp->state != AL_PLAYING || seqp->target == NULL) + return; + + /* Get the next event time in ticks. */ + /* If false is returned, then there is no next delta (ie. end of sequence reached). */ + if (!__alCSeqNextDelta(seqp->target, &deltaTicks)) + return; + + evt.type = AL_SEQ_REF_EVT; + 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 + immediately since it does not check the event's tick time. + + sct 11/7/95 +*/ +static void +__CSPHandleNextSeqEvent(ALCSPlayer *seqp) +{ + ALEvent evt; + + /* sct 1/5/96 - Do nothing if we don't have a target sequence. */ + if (seqp->target == NULL) + return; + + alCSeqNextEvent(seqp->target, &evt); + + switch (evt.type) + { + case AL_SEQ_MIDI_EVT: + __CSPHandleMIDIMsg(seqp, &evt); + __CSPPostNextSeqEvent(seqp); + break; + + case AL_TEMPO_EVT: + __CSPHandleMetaMsg(seqp, &evt); + __CSPPostNextSeqEvent(seqp); + break; + + case AL_SEQ_END_EVT: + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + break; + + case AL_TRACK_END: + case AL_CSP_LOOPSTART: + case AL_CSP_LOOPEND: + __CSPPostNextSeqEvent(seqp); + break; + + default: +#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; + ALVoiceState *vs; + s32 status; + u8 chan; + u8 key; + u8 vel; + u8 byte1; + u8 byte2; + ALMIDIEvent *midi = &event->msg.midi; + s16 vol; + ALEvent evt; + ALMicroTime deltaTime; + ALVoiceState *vstate; + ALPan pan; + ALFxRef fxref; + + + status = midi->status & AL_MIDI_StatusMask; + chan = midi->status & AL_MIDI_ChannelMask; + byte1 = key = midi->byte1; + byte2 = vel = midi->byte2; + + switch (status) + { + case (AL_MIDI_NoteOn): + + if (vel != 0) /* a real note on */ + { + ALVoiceConfig config; + ALSound *sound; + s16 cents; + f32 pitch,oscValue; + u8 fxmix; + void *oscState; + ALInstrument *inst; + + /* If we're not playing, don't process note ons. */ + if (seqp->state != AL_PLAYING) + break; + + sound = __lookupSoundQuick((ALSeqPlayer*)seqp, key, vel, chan); + ALFlagFailIf(!sound, seqp->debugFlags & NO_SOUND_ERR_MASK, + ERR_ALSEQP_NO_SOUND); + + config.priority = seqp->chanState[chan].priority; + config.fxBus = 0; + config.unityPitch = 0; + + vstate = __mapVoice((ALSeqPlayer*)seqp, key, vel, chan); + ALFlagFailIf(!vstate, seqp->debugFlags & NO_VOICE_ERR_MASK, + ERR_ALSEQP_NO_VOICE ); + + voice = &vstate->voice; + + alSynAllocVoice(seqp->drvr, voice, &config); + + /* + * set up the voice state structure + */ + vstate->sound = sound; + vstate->envPhase = AL_PHASE_ATTACK; + if (seqp->chanState[chan].sustain > AL_SUSTAIN) + vstate->phase = AL_PHASE_SUSTAIN; + else + vstate->phase = AL_PHASE_NOTEON; + + cents = (key - sound->keyMap->keyBase) * 100 + + sound->keyMap->detune; + + vstate->pitch = alCents2Ratio(cents); + vstate->envGain = sound->envelope->attackVolume; + vstate->envEndTime = seqp->curTime + + sound->envelope->attackTime; + + /* + * setup tremelo and vibrato if active + */ + vstate->flags = 0; + inst = seqp->chanState[chan].instrument; + + oscValue = (f32)AL_VOL_FULL; /* set this as a default */ + if(inst->tremType) + { + if(seqp->initOsc) + { + deltaTime = (*seqp->initOsc)(&oscState,&oscValue,inst->tremType, + inst->tremRate,inst->tremDepth,inst->tremDelay); + + if(deltaTime) /* a deltaTime of zero means don't run osc */ + { + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x01; /* set tremelo flag bit */ + } + } + } + vstate->tremelo = (u8)oscValue; /* will default if not changed by initOsc */ + + oscValue = 1.0f; /* set this as a default */ + if(inst->vibType) + { + if(seqp->initOsc) + { + deltaTime = (*seqp->initOsc)(&oscState,&oscValue,inst->vibType, + inst->vibRate,inst->vibDepth,inst->vibDelay); + + if(deltaTime) /* a deltaTime of zero means don't run osc. */ + { + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x02; /* set the vibrato flag bit */ + } + } + } + vstate->vibrato = oscValue; /* will default if not changed by initOsc */ + + /* + * calculate the note on parameters + */ + pitch = vstate->pitch * seqp->chanState[chan].pitchBend * + vstate->vibrato; + fxmix = seqp->chanState[chan].fxmix; + pan = __vsPan(vstate, (ALSeqPlayer*)seqp); + vol = __vsVol(vstate, (ALSeqPlayer*)seqp); + deltaTime = sound->envelope->attackTime; + + alSynStartVoiceParams(seqp->drvr, voice, sound->wavetable, + pitch, vol, pan, fxmix, deltaTime); + /* + * set up callbacks for envelope + */ + evt.type = AL_SEQP_ENV_EVT; + evt.msg.vol.voice = voice; + evt.msg.vol.vol = sound->envelope->decayVolume; + evt.msg.vol.delta = sound->envelope->decayTime; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + + if(midi->duration) + { + /* + * set up note off evt. if no duration don't do this + */ + evt.type = AL_CSP_NOTEOFF_EVT; + evt.msg.midi.status = chan | AL_MIDI_NoteOff; + evt.msg.midi.byte1 = key; + evt.msg.midi.byte2 = 0; /* not needed ? */ + deltaTime = seqp->uspt * midi->duration; + + /* max time would be about one hour ten minutes */ + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + } + + break; + } + + /* + * NOTE: intentional fall-through for note on with zero + * velocity (Should never happen with compact midi sequence, + * but could happen with real time midi.) + */ + + case (AL_MIDI_NoteOff): + vstate = __lookupVoice((ALSeqPlayer*)seqp, key, chan); + ALFlagFailIf(!vstate, seqp->debugFlags & NOTE_OFF_ERR_MASK, + ERR_ALSEQP_OFF_VOICE ); + + if (vstate->phase == AL_PHASE_SUSTAIN) + vstate->phase = AL_PHASE_SUSTREL; + else + { + vstate->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice((ALSeqPlayer*)seqp, &vstate->voice, + vstate->sound->envelope->releaseTime); + } + + break; + + case (AL_MIDI_PolyKeyPressure): + /* + * Aftertouch per key (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + vstate = __lookupVoice((ALSeqPlayer*)seqp, key, chan); + ALFailIf(!vstate, ERR_ALSEQP_POLY_VOICE ); + + vstate->velocity = byte2; + alSynSetVol(seqp->drvr, &vstate->voice, + __vsVol(vstate, (ALSeqPlayer*)seqp), + __vsDelta(vstate,seqp->curTime)); + break; + + case (AL_MIDI_ChannelPressure): + /* + * Aftertouch per channel (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + vs->velocity = byte1; + alSynSetVol(seqp->drvr, &vs->voice, + __vsVol(vs, (ALSeqPlayer*)seqp), + __vsDelta(vs,seqp->curTime)); + } + } + break; + + case (AL_MIDI_ControlChange): + switch (byte1) + { + case (AL_MIDI_PAN_CTRL): + seqp->chanState[chan].pan = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + if (vs->channel == chan) + { + pan = __vsPan(vs, (ALSeqPlayer*)seqp); + alSynSetPan(seqp->drvr, &vs->voice, pan); + } + } + break; + case (AL_MIDI_VOLUME_CTRL): + seqp->chanState[chan].vol = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + if ((vs->channel == chan) && (vs->envPhase != AL_PHASE_RELEASE)) + { + vol = __vsVol(vs, (ALSeqPlayer*)seqp); + alSynSetVol(seqp->drvr, &vs->voice, vol, + __vsDelta(vs,seqp->curTime)); + } + } + break; + case (AL_MIDI_PRIORITY_CTRL): + /* leave current voices where they are */ + seqp->chanState[chan].priority = byte2; + break; + case (AL_MIDI_SUSTAIN_CTRL): + seqp->chanState[chan].sustain = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + if ((vs->channel == chan) && (vs->phase != AL_PHASE_RELEASE)) + { + if ( byte2 > AL_SUSTAIN ) + { + /* + * sustain pedal down + */ + if (vs->phase == AL_PHASE_NOTEON) + vs->phase = AL_PHASE_SUSTAIN; + } + else + { + /* + * sustain pedal up + */ + if (vs->phase == AL_PHASE_SUSTAIN) + vs->phase = AL_PHASE_NOTEON; + + else if(vs->phase == AL_PHASE_SUSTREL) + { + vs->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice((ALSeqPlayer*)seqp, + &vs->voice, + vs->sound->envelope->releaseTime); + } + } + } + } + break; + case (AL_MIDI_FX1_CTRL): + seqp->chanState[chan].fxmix = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + if (vs->channel == chan) + alSynSetFXMix(seqp->drvr, &vs->voice, byte2); + } + break; +/* case (AL_MIDI_FX_CTRL_0): + case (AL_MIDI_FX_CTRL_1): + case (AL_MIDI_FX_CTRL_2): + case (AL_MIDI_FX_CTRL_3): + case (AL_MIDI_FX_CTRL_4): + case (AL_MIDI_FX_CTRL_5): + case (AL_MIDI_FX_CTRL_6): + case (AL_MIDI_FX_CTRL_7): + fxref = alSynGetFXRef(seqp->drvr, 0, 0); + if (fxref) + alSynSetFXParam(seqp->drvr, fxref, (s16)byte1, (void *)byte2); + break; + 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. */ +#if BUILD_VERSION < VERSION_J +#line 710 +#endif + assert(seqp->bank != NULL); + + if (key < seqp->bank->instCount) + { + ALInstrument *inst = seqp->bank->instArray[key]; + __setInstChanState((ALSeqPlayer*)seqp, inst, chan); /* sct 11/6/95 */ + } + else + { +#ifdef _DEBUG + __osError(ERR_ALSEQPINVALIDPROG, 2, key, seqp->bank->instCount); +#endif + } + break; + case (AL_MIDI_PitchBendChange): + { + s32 bendVal; + f32 bendRatio; + s32 cents; + + /* get 14-bit unsigned midi value */ + bendVal = ( (byte2 << 7) + byte1) - 8192; + + /* calculate pitch bend in cents */ + cents = (seqp->chanState[chan].bendRange * bendVal)/8192; + + /* calculate the corresponding ratio */ + bendRatio = alCents2Ratio(cents); + seqp->chanState[chan].pitchBend = bendRatio; + + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + if (vs->channel == chan) + alSynSetPitch(seqp->drvr, &vs->voice, + vs->pitch * bendRatio * vs->vibrato); + + } + break; + + default: +#ifdef _DEBUG + __osError(ERR_ALSEQPUNKNOWNMIDI, 1, status); +#endif + break; + } + +} + +static void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event) +{ + ALTempoEvent *tevt = &event->msg.tempo; + ALEvent evt; + s32 tempo; + s32 oldUspt; + u32 ticks; + ALMicroTime tempDelta,curDelta = 0; + ALEventListItem *thisNode,*nextNode,*firstTemp = 0; + + + if (event->msg.tempo.status == AL_MIDI_Meta) + { + if (event->msg.tempo.type == AL_MIDI_META_TEMPO) + { + oldUspt = seqp->uspt; + tempo = (tevt->byte1 << 16) | (tevt->byte2 << 8) | (tevt->byte3 << 0); + __setUsptFromTempo (seqp, (f32)tempo); /* sct 1/8/96 */ + + thisNode = (ALEventListItem*)seqp->evtq.allocList.next; + while(thisNode) + { + curDelta += thisNode->delta; + nextNode = (ALEventListItem*)thisNode->node.next; + if(thisNode->evt.type == AL_CSP_NOTEOFF_EVT) + { + alUnlink((ALLink*)thisNode); + + if(firstTemp) + alLink((ALLink*)thisNode,(ALLink*)firstTemp); + else + { + thisNode->node.next = 0; + thisNode->node.prev = 0; + firstTemp = thisNode; + } + tempDelta = curDelta; /* record the current delta */ + if(nextNode) /* don't do this if no nextNode */ + { + curDelta -= thisNode->delta; /* subtract out this delta */ + nextNode->delta += thisNode->delta; /* add it to next event */ + } + thisNode->delta = tempDelta; /* set this event delta from current */ + } + thisNode = nextNode; + } + + thisNode = firstTemp; + while(thisNode) + { + nextNode = (ALEventListItem*)thisNode->node.next; + ticks = thisNode->delta/oldUspt; + thisNode->delta = ticks * seqp->uspt; + __CSPRepostEvent(&seqp->evtq,thisNode); + thisNode = nextNode; + } + } + } +} + +static void __CSPRepostEvent(ALEventQueue *evtq, ALEventListItem *item) +{ + OSIntMask mask; + ALLink *node; + ALEventListItem *nextItem; + + mask = osSetIntMask(OS_IM_NONE); + + for (node = &evtq->allocList; node != 0; node = node->next) + { + if (!node->next) /* end of the list */ + { + alLink((ALLink *)item, node); + break; + } + else + { + nextItem = (ALEventListItem *)node->next; + if (item->delta < nextItem->delta) + { + nextItem->delta -= item->delta; + alLink((ALLink *)item, node); + break; + } + item->delta -= nextItem->delta; + } + } + osSetIntMask(mask); +} + + +/* + This routine safely calculates the sequence player's + uspt value based on the given tempo. It does this safely + by making sure that the player has a target sequence and + therefore a qnpt value which is needed for the calculation. + + Compact sequence player needs its own version of this routine + since the ALCSeq's qnpt field is at a different offset. +*/ +static void __setUsptFromTempo (ALCSPlayer *seqp, f32 tempo) +{ + if (seqp->target) + seqp->uspt = (s32)((f32)tempo * seqp->target->qnpt); + else + seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */ +} + diff --git a/lib/ultralib/src/audio/cspplay.c b/lib/ultralib/src/audio/cspplay.c new file mode 100644 index 0000000..e34914c --- /dev/null +++ b/lib/ultralib/src/audio/cspplay.c @@ -0,0 +1,34 @@ +/*==================================================================== + * cspplay.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "cseqp.h" + +void alCSPPlay(ALCSPlayer *seqp) +{ + ALEvent evt; + + evt.type = AL_SEQP_PLAY_EVT; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsendmidi.c b/lib/ultralib/src/audio/cspsendmidi.c new file mode 100644 index 0000000..3d03c9b --- /dev/null +++ b/lib/ultralib/src/audio/cspsendmidi.c @@ -0,0 +1,40 @@ +/*==================================================================== + * cspsendmidi.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSendMidi(ALCSPlayer *seqp, s32 ticks, u8 status, u8 byte1, + u8 byte2) +{ + ALEvent evt; + ALMicroTime deltaTime; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = status; + evt.msg.midi.byte1 = byte1; + evt.msg.midi.byte2 = byte2; + evt.msg.midi.duration = 0; + + deltaTime = ticks*seqp->uspt; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); +} + diff --git a/lib/ultralib/src/audio/cspsetbank.c b/lib/ultralib/src/audio/cspsetbank.c new file mode 100644 index 0000000..63292b4 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetbank.c @@ -0,0 +1,32 @@ +/*==================================================================== + * cspsetbank.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetBank(ALCSPlayer *seqp, ALBank *b) +{ + ALEvent evt; + + evt.type = AL_SEQP_BANK_EVT; + evt.msg.spbank.bank = b; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsetchlvol.c b/lib/ultralib/src/audio/cspsetchlvol.c new file mode 100644 index 0000000..28e62bb --- /dev/null +++ b/lib/ultralib/src/audio/cspsetchlvol.c @@ -0,0 +1,35 @@ +/*==================================================================== + * cspsetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlVol(ALCSPlayer *seqp, u8 chan, u8 vol) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_VOLUME_CTRL; + evt.msg.midi.byte2 = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsetfxmix.c b/lib/ultralib/src/audio/cspsetfxmix.c new file mode 100644 index 0000000..f099297 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetfxmix.c @@ -0,0 +1,35 @@ +/*==================================================================== + * cspsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlFXMix(ALCSPlayer *seqp, u8 chan, u8 fxmix) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_FX1_CTRL; + evt.msg.midi.byte2 = fxmix; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsetpan.c b/lib/ultralib/src/audio/cspsetpan.c new file mode 100644 index 0000000..c0dab00 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetpan.c @@ -0,0 +1,35 @@ +/*==================================================================== + * cspsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlPan(ALCSPlayer *seqp, u8 chan, ALPan pan) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_PAN_CTRL; + evt.msg.midi.byte2 = pan; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsetpriority.c b/lib/ultralib/src/audio/cspsetpriority.c new file mode 100644 index 0000000..b449b82 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetpriority.c @@ -0,0 +1,32 @@ +/*==================================================================== + * cspsetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlPriority(ALCSPlayer *seqp, u8 chan, u8 priority) +{ + ALEvent evt; + + evt.type = AL_SEQP_PRIORITY_EVT; + evt.msg.sppriority.chan = chan; + evt.msg.sppriority.priority = priority; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/ultralib/src/audio/cspsetprogram.c b/lib/ultralib/src/audio/cspsetprogram.c new file mode 100644 index 0000000..2b19e63 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetprogram.c @@ -0,0 +1,35 @@ +/*==================================================================== + * cspsetprogram.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlProgram(ALCSPlayer *seqp, u8 chan, u8 prog) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ProgramChange | chan; + evt.msg.midi.byte1 = prog; + evt.msg.midi.byte2 = 0; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsetseq.c b/lib/ultralib/src/audio/cspsetseq.c new file mode 100644 index 0000000..4b6718e --- /dev/null +++ b/lib/ultralib/src/audio/cspsetseq.c @@ -0,0 +1,34 @@ +/*==================================================================== + * cspsetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetSeq(ALCSPlayer *seqp, ALCSeq *seq) +{ + ALEvent evt; + + evt.type = AL_SEQP_SEQ_EVT; + evt.msg.spseq.seq = seq; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsettempo.c b/lib/ultralib/src/audio/cspsettempo.c new file mode 100644 index 0000000..b085b45 --- /dev/null +++ b/lib/ultralib/src/audio/cspsettempo.c @@ -0,0 +1,36 @@ +/*==================================================================== + * cspsettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetTempo(ALCSPlayer *seqp, s32 tempo) +{ + ALEvent evt; + + evt.type = AL_SEQP_META_EVT; + evt.msg.tempo.status = AL_MIDI_Meta; + evt.msg.tempo.type = AL_MIDI_META_TEMPO; + evt.msg.tempo.byte1 = (tempo & 0xff0000)>>16; + evt.msg.tempo.byte2 = (tempo & 0xff00)>>8; + evt.msg.tempo.byte3 = tempo & 0xff; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspsetvol.c b/lib/ultralib/src/audio/cspsetvol.c new file mode 100644 index 0000000..6782f33 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetvol.c @@ -0,0 +1,32 @@ +/*==================================================================== + * cspsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetVol(ALCSPlayer *seqp, s16 vol) +{ + ALEvent evt; + + evt.type = AL_SEQP_VOL_EVT; + evt.msg.spvol.vol = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/cspstop.c b/lib/ultralib/src/audio/cspstop.c new file mode 100644 index 0000000..9929820 --- /dev/null +++ b/lib/ultralib/src/audio/cspstop.c @@ -0,0 +1,32 @@ +/*==================================================================== + * cspstop.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPStop(ALCSPlayer *seqp) +{ + ALEvent evt; + + evt.type = AL_SEQP_STOPPING_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/src/libultra/al/drvrNew.c b/lib/ultralib/src/audio/drvrnew.c similarity index 99% rename from src/libultra/al/drvrNew.c rename to lib/ultralib/src/audio/drvrnew.c index f5e2ba2..7ca2e10 100644 --- a/src/libultra/al/drvrNew.c +++ b/lib/ultralib/src/audio/drvrnew.c @@ -17,15 +17,13 @@ * DOD or NASA FAR Supplement. Unpublished - rights reserved under the * Copyright Laws of the United States. *====================================================================*/ - #include #include "synthInternals.h" #include +#include #include "initfx.h" - // TODO: this comes from a header #ident "$Revision: 1.49 $" - /* * WARNING: THE FOLLOWING CONSTANT MUST BE KEPT IN SYNC * WITH SCALING IN MICROCODE!!! diff --git a/src/libultra/al/env.c b/lib/ultralib/src/audio/env.c similarity index 98% rename from src/libultra/al/env.c rename to lib/ultralib/src/audio/env.c index 3453afa..fda20f4 100644 --- a/src/libultra/al/env.c +++ b/lib/ultralib/src/audio/env.c @@ -17,23 +17,20 @@ * DOD or NASA FAR Supplement. Unpublished - rights reserved under the * Copyright Laws of the United States. *====================================================================*/ - #include #include "synthInternals.h" #include +#include #include #include - // TODO: these come from headers #ident "$Revision: 1.49 $" #ident "$Revision: 1.17 $" - #ifdef AUD_PROFILE extern u32 cnt_index, env_num, env_cnt, env_max, env_min, lastCnt[]; extern u32 rate_num, rate_cnt, rate_max, rate_min; extern u32 vol_num, vol_cnt, vol_max, vol_min; #endif - #define EQPOWER_LENGTH 128 static s16 eqpower[ EQPOWER_LENGTH ] = { 32767, 32764, 32757, 32744, 32727, 32704, @@ -96,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): { @@ -310,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; @@ -352,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; @@ -369,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 new file mode 100644 index 0000000..3112c99 --- /dev/null +++ b/lib/ultralib/src/audio/event.c @@ -0,0 +1,272 @@ +/*==================================================================== + * event.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include + + +void alEvtqNew(ALEventQueue *evtq, ALEventListItem *items, s32 itemCount) +{ + s32 i; + + evtq->eventCount = 0; + evtq->allocList.next = 0; + evtq->allocList.prev = 0; + evtq->freeList.next = 0; + evtq->freeList.prev = 0; + + for (i = 0; i < itemCount; i++) { + alLink((ALLink *)&items[i], &evtq->freeList); + } +} + +ALMicroTime alEvtqNextEvent(ALEventQueue *evtq, ALEvent *evt) +{ + ALEventListItem *item; + ALMicroTime delta; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + item = (ALEventListItem *)evtq->allocList.next; + + if (item) + { + alUnlink((ALLink *)item); + alCopy(&item->evt, evt, sizeof(*evt)); + alLink((ALLink *)item, &evtq->freeList); + delta = item->delta; + } + else + { + /* 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 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; + delta = 0; + } + + osSetIntMask(mask); + + return delta; +} + +void alEvtqPostEvent(ALEventQueue *evtq, ALEvent *evt, ALMicroTime delta) +{ + ALEventListItem *item; + ALEventListItem *nextItem; + ALLink *node; + s32 postAtEnd=0; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + item = (ALEventListItem *)evtq->freeList.next; + if (!item) { + osSetIntMask(mask); +#ifdef _DEBUG + __osError(ERR_ALEVENTNOFREE, 0); +#endif + return; + } + + alUnlink((ALLink *)item); + alCopy(evt, &item->evt, sizeof(*evt)); + + if (delta == AL_EVTQ_END) + postAtEnd = -1; + + for (node = &evtq->allocList; node != 0; node = node->next) { + if (!node->next) { /* end of the list */ + if (postAtEnd) + item->delta = 0; + else + item->delta = delta; + alLink((ALLink *)item, node); + break; + } else { + nextItem = (ALEventListItem *)node->next; + + if (delta < nextItem->delta) { + item->delta = delta; + nextItem->delta -= delta; + + alLink((ALLink *)item, node); + break; + } + + delta -= nextItem->delta; + + } + } + + osSetIntMask(mask); + +} + +void alEvtqFlush(ALEventQueue *evtq) +{ + ALLink *thisNode; + ALLink *nextNode; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while( thisNode != 0 ) { + nextNode = thisNode->next; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + thisNode = nextNode; + } + + osSetIntMask(mask); +} + + +/* + This routine flushes events according their type. +*/ +void alEvtqFlushType(ALEventQueue *evtq, s16 type) +{ + ALLink *thisNode; + ALLink *nextNode; + ALEventListItem *thisItem, *nextItem; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while( thisNode != 0 ) + { + nextNode = thisNode->next; + thisItem = (ALEventListItem *)thisNode; + nextItem = (ALEventListItem *)nextNode; + if (thisItem->evt.type == type) + { + if (nextItem) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + } + thisNode = nextNode; + } + + osSetIntMask(mask); +} + + +#ifdef _DEBUG_INTERNAL +void alEvtqPrintEvtQueue(ALEventQueue *evtq) +{ + s32 count1 = 0; + s32 count2 = 0; + ALLink *node; + ALEventListItem *item; + + /* count free events */ + for (node = evtq->freeList.next; node != 0; node= node->next) { + count1++; + } + + PRINTF("----- Allocated Events -----\n"); + for (node = evtq->allocList.next; node != 0; node= node->next) { + item = (ALEventListItem *)node; + + PRINTF("\tdelta: %d\ttype %d\n", item->delta, item->evt.type); + count2++; + } + PRINTF("\n"); + + PRINTF("free events\t %d\n", count1); + PRINTF("alloc events\t %d\n", count2); + PRINTF("total events\t %d\n", count1 + count2); +} + +char *MidiStatus2Str (char status, char *str); + +void +alEvtqPrintAllocEvts(ALEventQueue *evtq) +{ + ALLink *node; + ALEventListItem *item; + ALMicroTime itemTime = 0; + char str[32]; + + PRINTF("----- Allocated Events -----\n"); + for (node = evtq->allocList.next; node != 0; node= node->next) + { + item = (ALEventListItem *)node; + itemTime += item->delta; + + PRINTF("\tdelta: %d\tabs: %d\t", item->delta, itemTime); + + switch (item->evt.type) + { + case AL_NOTE_END_EVT: + PRINTF("NOTE_END\tvox: %x\n", item->evt.msg.note.voice); + break; + + case AL_SEQP_MIDI_EVT: + PRINTF("SEQP_MIDI\t%s\n", MidiStatus2Str(item->evt.msg.midi.status & AL_MIDI_StatusMask, str)); + break; + + case AL_SEQP_PRIORITY_EVT: + PRINTF("SEQP_PRIORITY\n"); + break; + + default: + PRINTF("type: %d\n", item->evt.type); + break; + } + + } + PRINTF("\n"); + +} + +char * +MidiStatus2Str (char status, char *str) +{ + switch (status) + { + case AL_MIDI_NoteOn: + sprintf(str, "note on"); + break; + + case AL_MIDI_NoteOff: + sprintf(str, "note off"); + break; + + default: + sprintf(str, "status:%d", status); + break; + } + + return str; +} + +#endif /* _DEBUG_INTERNAL */ + + + diff --git a/src/libultra/al/filter.c b/lib/ultralib/src/audio/filter.c similarity index 100% rename from src/libultra/al/filter.c rename to lib/ultralib/src/audio/filter.c diff --git a/src/libultra/al/heapalloc.c b/lib/ultralib/src/audio/heapalloc.c similarity index 100% rename from src/libultra/al/heapalloc.c rename to lib/ultralib/src/audio/heapalloc.c diff --git a/lib/ultralib/src/audio/heapcheck.c b/lib/ultralib/src/audio/heapcheck.c new file mode 100644 index 0000000..baae643 --- /dev/null +++ b/lib/ultralib/src/audio/heapcheck.c @@ -0,0 +1,71 @@ +/*==================================================================== + * heapcheck.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include +#include + +#ifdef AUD_PROFILE +#include +extern u32 cnt_index, heap_num, heap_cnt, heap_max, heap_min, lastCnt[]; +#endif + +s32 alHeapCheck(ALHeap *hp) +{ + s32 rv = 0; + HeapInfo *hi; + HeapInfo *last = 0; + u8 *ptr; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + +#ifdef _DEBUG + for (ptr = hp->base; ptr < hp->cur; ptr += hi->size){ + + hi = (HeapInfo *)ptr; + + if ( hi->magic != AL_HEAP_MAGIC) { + if (last) { + __osError(ERR_ALHEAPCORRUPT, 0); + } else { + __osError(ERR_ALHEAPFIRSTBLOCK, 0); + } + + rv = 1; +#ifdef AUD_PROFILE + PROFILE_AUD(heap_num, heap_cnt, heap_max, heap_min); +#endif + return rv; + } + + last = hi; + + } +#endif +#ifdef AUD_PROFILE + PROFILE_AUD(heap_num, heap_cnt, heap_max, heap_min); +#endif + return rv; +} + + diff --git a/src/libultra/al/heapinit.c b/lib/ultralib/src/audio/heapinit.c similarity index 100% rename from src/libultra/al/heapinit.c rename to lib/ultralib/src/audio/heapinit.c diff --git a/lib/ultralib/src/audio/initfx.h b/lib/ultralib/src/audio/initfx.h new file mode 100644 index 0000000..704e1f4 --- /dev/null +++ b/lib/ultralib/src/audio/initfx.h @@ -0,0 +1,59 @@ +/*==================================================================== + * initfx.h + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#ifndef __initfx__ +#define __initfx__ + +#define MAX_L0 AL_FX_BUFFER_SIZE/4 +#define MAX_L1 AL_FX_BUFFER_SIZE/4 +#define MAX_L2 AL_FX_BUFFER_SIZE/2 + +#define L0_INC MAX_L0/128 +#define L1_INC MAX_L1/128 +#define L2_INC MAX_L2/128 + +#define SMALLROOM_SECT_CNT 3 +#define SMALLROOM_SIZE AL_FX_BUFFER_SIZE +#define SMALLROOM_L0 880 /* 22 ms */ +#define SMALLROOM_C0 9830 +#define SMALLROOM_L1 1400 /* 35 ms */ +#define SMALLROOM_C1 3276 +#define SMALLROOM_L2 2640 /* 66 ms */ +#define SMALLROOM_C2 10000 +#define SMALLROOM_FILT_CNT 1 +#define SMALLROOM_FC0 0x4000 /* .25 */ + +#define BIGROOM_SECT_CNT 3 +#define BIGROOM_SIZE AL_FX_BUFFER_SIZE +#define BIGROOM_L0 1408 /* 32 ms */ +#define BIGROOM_C0 9830 +#define BIGROOM_L1 1984 /* 45 ms */ +#define BIGROOM_C1 9830 +#define BIGROOM_L2 3792 /* 86 ms */ +#define BIGROOM_C2 12000 +#define BIGROOM_FILT_CNT 1 +#define BIGROOM_FC0 0x4000 /* .25 */ + +#define ECHO_SIZE AL_FX_BUFFER_SIZE +#define ECHO_SECT_CNT 1 +#define ECHO_L0 7936 /* 180 ms */ +#define ECHO_C0 0x6000 + +#endif diff --git a/src/libultra/al/load.c b/lib/ultralib/src/audio/load.c similarity index 100% rename from src/libultra/al/load.c rename to lib/ultralib/src/audio/load.c diff --git a/src/libultra/al/mainbus.c b/lib/ultralib/src/audio/mainbus.c similarity index 100% rename from src/libultra/al/mainbus.c rename to lib/ultralib/src/audio/mainbus.c diff --git a/lib/ultralib/src/audio/parse_abi.c b/lib/ultralib/src/audio/parse_abi.c new file mode 100644 index 0000000..f1fd37d --- /dev/null +++ b/lib/ultralib/src/audio/parse_abi.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#ifndef _FINALROM +void alParseAbiCL(Acmd *cmdList, u32 nbytes) +{ + guDLPrintCB cntlBlk; + + cntlBlk.dataSize = nbytes; + cntlBlk.flags = 0; + cntlBlk.dlType = GU_PARSE_ABI_TYPE; + cntlBlk.paddr = osVirtualToPhysical(cmdList); + + osWriteHost(&cntlBlk,sizeof(cntlBlk)); + osWriteHost(cmdList,nbytes); + +} + +#endif + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libultra/al/resample.c b/lib/ultralib/src/audio/resample.c similarity index 99% rename from src/libultra/al/resample.c rename to lib/ultralib/src/audio/resample.c index 776c015..2baf26f 100644 --- a/src/libultra/al/resample.c +++ b/lib/ultralib/src/audio/resample.c @@ -21,6 +21,7 @@ #include #include "synthInternals.h" #include +#include // TODO: this comes from a header #ident "$Revision: 1.49 $" diff --git a/src/libultra/al/reverb.c b/lib/ultralib/src/audio/reverb.c similarity index 98% rename from src/libultra/al/reverb.c rename to lib/ultralib/src/audio/reverb.c index a4bcecf..f5158c3 100644 --- a/src/libultra/al/reverb.c +++ b/lib/ultralib/src/audio/reverb.c @@ -8,7 +8,6 @@ * Inc.; the contents of this file may not be disclosed to third * parties, copied or duplicated in any form, in whole or in part, * without the prior written permission of Silicon Graphics, Inc. - * * RESTRICTED RIGHTS LEGEND: * Use, duplication or disclosure by the Government is subject to * restrictions as set forth in subdivision (c)(1)(ii) of the Rights @@ -17,15 +16,17 @@ * DOD or NASA FAR Supplement. Unpublished - rights reserved under the * Copyright Laws of the United States. *====================================================================*/ - #include #include #include "synthInternals.h" #include #include +#include #include #include "initfx.h" - +// TODO: these come from headers +#ident "$Revision: 1.49 $" +#ident "$Revision: 1.17 $" #define RANGE 2.0 extern ALGlobals *alGlobals; @@ -44,6 +45,7 @@ extern u32 load_num, load_cnt, load_max, load_min, save_num, save_cnt, save_max, in = t; \ } + 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); @@ -68,8 +70,11 @@ Acmd *alFxPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset, #ifdef AUD_PROFILE lastCnt[++cnt_index] = osGetCount(); #endif - +#if BUILD_VERSION < VERSION_J +#line 74 +#endif assert(source); + /* * pull channels going into this effect first */ diff --git a/src/libultra/al/save.c b/lib/ultralib/src/audio/save.c similarity index 98% rename from src/libultra/al/save.c rename to lib/ultralib/src/audio/save.c index bc15294..59bd09b 100644 --- a/src/libultra/al/save.c +++ b/lib/ultralib/src/audio/save.c @@ -3,7 +3,6 @@ * * Copyright 1993, Silicon Graphics, Inc. * All Rights Reserved. - * * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, * Inc.; the contents of this file may not be disclosed to third * parties, copied or duplicated in any form, in whole or in part, @@ -17,26 +16,24 @@ * DOD or NASA FAR Supplement. Unpublished - rights reserved under the * Copyright Laws of the United States. *====================================================================*/ - #include #include "synthInternals.h" #include #include - // TODO: this comes from a header #ident "$Revision: 1.17 $" 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/seq.c b/lib/ultralib/src/audio/seq.c new file mode 100644 index 0000000..5da5b11 --- /dev/null +++ b/lib/ultralib/src/audio/seq.c @@ -0,0 +1,343 @@ +/*==================================================================== + * seq.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include +#include "seq.h" + + +#define IFF_FILE_HDR 0x4d546864 /* 'MThd' */ +#define IFF_TRACK_HDR 0x4d54726b /* 'MTrk' */ + +static s32 readVarLen(ALSeq *s); +static u8 read8(ALSeq *s); +static s16 read16(ALSeq *s); +static s32 read32(ALSeq *s); + + +void alSeqNew(ALSeq *seq, u8 *ptr, s32 len) +{ + /* + * load the seqence pointed to by ptr + */ + seq->base = ptr; + seq->len = len; + seq->lastStatus = 0; + seq->lastTicks = 0; + seq->curPtr = ptr; + + if (read32(seq) != IFF_FILE_HDR) { +#ifdef _DEBUG + __osError(ERR_ALSEQNOTMIDI, 1, ptr); +#endif + return; + } + + read32(seq); /* skip the length field */ + + if (read16(seq) != 0) { +#ifdef _DEBUG + __osError(ERR_ALSEQNOTMIDI0, 1, ptr); +#endif + return; + } + + if (read16(seq) != 1) { +#ifdef _DEBUG + __osError(ERR_ALSEQNUMTRACKS, 1, ptr); +#endif + return; + } + + seq->division = read16(seq); + if (seq->division & 0x8000) { +#ifdef _DEBUG + __osError(ERR_ALSEQTIME, 1, ptr); +#endif + return; + } + + seq->qnpt = 1.0/(f32)seq->division; + + if (read32(seq) != IFF_TRACK_HDR) { +#ifdef _DEBUG + __osError(ERR_ALSEQTRACKHDR, 1, ptr); +#endif + return; + } + + read32(seq); /* skip the length field */ + + seq->trackStart = seq->curPtr; +} + + +void alSeqNextEvent(ALSeq *seq, ALEvent *event) +{ + u8 status; + s16 delta; + s32 len; + s32 deltaTicks; + s32 i; + +#ifdef _DEBUG + /* sct 1/17/96 - Warn if curPtr is beyond the end of sequence. */ + if (seq->curPtr >= seq->base + seq->len) + __osError(ERR_ALSEQOVERRUN, 0); +#endif + + deltaTicks = readVarLen(seq); /* read the delta time */ + seq->lastTicks += deltaTicks; + status = read8(seq); + +#if _DEBUG + /* + * System exclusives are not supported, so just skip them and read + * the next event + */ + if ((status == 0xf0) || (status == 0xf7)) { + __osError(ERR_ALSEQSYSEX, 0); + len = readVarLen(seq); + for (i = 0; i < len; i++) { + read8(seq); + } + alSeqNextEvent(seq,event); + return; + } +#endif + + if (status == AL_MIDI_Meta) { + u8 type = read8(seq); + + if (type == AL_MIDI_META_TEMPO) { + event->type = AL_TEMPO_EVT; + event->msg.tempo.ticks = deltaTicks; + event->msg.tempo.status = status; + event->msg.tempo.type = type; + event->msg.tempo.len = read8(seq); + event->msg.tempo.byte1 = read8(seq); + event->msg.tempo.byte2 = read8(seq); + event->msg.tempo.byte3 = read8(seq); + } else if (type == AL_MIDI_META_EOT) { + event->type = AL_SEQ_END_EVT; + event->msg.end.ticks = deltaTicks; + event->msg.end.status = status; + event->msg.end.type = type; + event->msg.end.len = read8(seq); + } else { +#ifdef _DEBUG + __osError(ERR_ALSEQMETA, 1, type); + len = readVarLen(seq); + for (i = 0; i < len; i++) { + read8(seq); + } + alSeqNextEvent(seq,event); + return; +#endif + } + + seq->lastStatus = 0; + + } else { + event->type = AL_SEQ_MIDI_EVT; + event->msg.midi.ticks = deltaTicks; + if (status & 0x80) { + event->msg.midi.status = status; + event->msg.midi.byte1 = read8(seq); + seq->lastStatus = status; + } else { + /* running status */ + event->msg.midi.status = seq->lastStatus; + event->msg.midi.byte1 = status; + } + + if (((event->msg.midi.status & 0xf0) != AL_MIDI_ProgramChange) && + ((event->msg.midi.status & 0xf0) != AL_MIDI_ChannelPressure)) { + event->msg.midi.byte2 = read8(seq); + } else { + event->msg.midi.byte2 = 0; + } + } +} + + +/* + Returns the delta time in ticks for the next event in the sequence. + Assumes that the sequence data pointer is pointing to the delta time. + + If the curPtr is at or beyond the end of the sequence, then return FALSE + to indicate no next event. + + sct 11/6/95 +*/ +char __alSeqNextDelta (ALSeq *seq, s32 *pDeltaTicks) +{ + u8 * savedPtr; + + /* sct 1/16/96 - Put in safety check here to make sure we don't read past sequence data. */ + if (seq->curPtr >= seq->base + seq->len) + return FALSE; + + savedPtr = seq->curPtr; + *pDeltaTicks = readVarLen(seq); /* read the delta time */ + seq->curPtr = savedPtr; + + return TRUE; +} + + +f32 alSeqTicksToSec(ALSeq *seq, s32 ticks, u32 tempo) +{ + return ((f32) (((f32)(ticks) * (f32)(tempo)) / + ((f32)(seq->division) * 1000000.0))); +} + +u32 alSeqSecToTicks(ALSeq *seq, f32 sec, u32 tempo) +{ + return (u32)(((sec * 1000000.0) * seq->division) / tempo); +} + +void alSeqNewMarker(ALSeq *seq, ALSeqMarker *m, u32 ticks) +{ + ALEvent evt; + u8 *savePtr, *lastPtr; + s32 saveTicks, lastTicks; + s16 saveStatus, lastStatus; + + /* does not check that ticks is within bounds */ + + if (ticks == 0) { /* common case */ + m->curPtr = seq->trackStart; + m->lastStatus = 0; + m->lastTicks = 0; + m->curTicks = 0; + return; + } else { + savePtr = seq->curPtr; + saveStatus = seq->lastStatus; + saveTicks = seq->lastTicks; + + seq->curPtr = seq->trackStart; + seq->lastStatus = 0; + seq->lastTicks = 0; + + do { + lastPtr = seq->curPtr; + lastStatus = seq->lastStatus; + lastTicks = seq->lastTicks; + + alSeqNextEvent(seq, &evt); + + if (evt.type == AL_SEQ_END_EVT) + { + lastPtr = seq->curPtr; + lastStatus = seq->lastStatus; + lastTicks = seq->lastTicks; + break; + } + + } while (seq->lastTicks < ticks); + + m->curPtr = lastPtr; + m->lastStatus = lastStatus; + m->lastTicks = lastTicks; + m->curTicks = seq->lastTicks; /* Used by test loop condition. */ + + seq->curPtr = savePtr; + seq->lastStatus = saveStatus; + seq->lastTicks = saveTicks; + + } +} + +s32 alSeqGetTicks(ALSeq *seq) +{ + return seq->lastTicks; +} + +void alSeqSetLoc(ALSeq *seq, ALSeqMarker *m) +{ + seq->curPtr = m->curPtr; + seq->lastStatus = m->lastStatus; + seq->lastTicks = m->lastTicks; +} + +void alSeqGetLoc(ALSeq *seq, ALSeqMarker *m) +{ + m->curPtr = seq->curPtr; + m->lastStatus = seq->lastStatus; + m->lastTicks = seq->lastTicks; +} + +/* non-aligned byte reading routines */ +static u8 read8(ALSeq *seq) +{ + return *seq->curPtr++; +} + +static s16 read16(ALSeq *seq) +{ + s16 tmp; + + tmp = *seq->curPtr++ << 8; + tmp |= *seq->curPtr++; + + return tmp; +} + +static s32 read32(ALSeq *seq) +{ + s32 tmp; + + tmp = *seq->curPtr++ << 24; + tmp |= *seq->curPtr++ << 16; + tmp |= *seq->curPtr++ << 8; + tmp |= *seq->curPtr++; + + return tmp; +} + +static s32 readVarLen(ALSeq *seq) +{ + s32 value; + s32 c; + + c = *seq->curPtr++; + value = c; + if ( c & 0x80 ) { + value &= 0x7f; + do { + c = *seq->curPtr++; + value = (value << 7) + (c & 0x7f); + } while (c & 0x80); + } + return (value); +} + + + + + + + + + + diff --git a/lib/ultralib/src/audio/seq.h b/lib/ultralib/src/audio/seq.h new file mode 100644 index 0000000..479b339 --- /dev/null +++ b/lib/ultralib/src/audio/seq.h @@ -0,0 +1,9 @@ + + +#ifndef __seq__ +#define __seq__ + +char __alSeqNextDelta (ALSeq *seq, s32 *pDeltaTicks); + + +#endif /* __seq__ */ diff --git a/lib/ultralib/src/audio/seqp.h b/lib/ultralib/src/audio/seqp.h new file mode 100644 index 0000000..c9ab02b --- /dev/null +++ b/lib/ultralib/src/audio/seqp.h @@ -0,0 +1,37 @@ + + +#define KILL_TIME 50000 /* 50 ms */ + +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +ALVoiceState *__mapVoice(ALSeqPlayer *, u8, u8, u8); +void __unmapVoice(ALSeqPlayer *seqp, ALVoice *voice); +char __voiceNeedsNoteKill(ALSeqPlayer *seqp, ALVoice *voice, ALMicroTime killTime); /* sct 1/5/96 */ + +ALVoiceState *__lookupVoice(ALSeqPlayer *, u8, u8); +ALSound *__lookupSound(ALSeqPlayer *, u8, u8, u8); +ALSound *__lookupSoundQuick(ALSeqPlayer *, u8, u8, u8); + +s16 __vsVol(ALVoiceState *voice, ALSeqPlayer *seqp); +ALMicroTime __vsDelta(ALVoiceState *voice, ALMicroTime t); +ALPan __vsPan(ALVoiceState *voice, ALSeqPlayer *seqp); + +void __initFromBank(ALSeqPlayer *seqp, ALBank *b); +void __initChanState(ALSeqPlayer *seqp); +void __resetPerfChanState(ALSeqPlayer *seqp, s32 chan); +void __setInstChanState(ALSeqPlayer *seqp, ALInstrument *inst, s32 chan); + +void __seqpPrintVoices(ALSeqPlayer *); +void __seqpReleaseVoice(ALSeqPlayer *seqp, ALVoice *voice, + ALMicroTime deltaTime); + +void __seqpStopOsc(ALSeqPlayer *seqp, ALVoiceState *vs); + +void __postNextSeqEvent(ALSeqPlayer *seqp); /* sct 11/7/95 */ + diff --git a/lib/ultralib/src/audio/seqpdelete.c b/lib/ultralib/src/audio/seqpdelete.c new file mode 100644 index 0000000..142f190 --- /dev/null +++ b/lib/ultralib/src/audio/seqpdelete.c @@ -0,0 +1,39 @@ +/*==================================================================== + * seqpdelete.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include +#include +// 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. */ +#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/seqpgetchlvol.c b/lib/ultralib/src/audio/seqpgetchlvol.c new file mode 100644 index 0000000..e205651 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetchlvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * seqpgetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alSeqpGetChlVol(ALSeqPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].vol; +} + diff --git a/lib/ultralib/src/audio/seqpgetfxmix.c b/lib/ultralib/src/audio/seqpgetfxmix.c new file mode 100644 index 0000000..5d7ee3f --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetfxmix.c @@ -0,0 +1,27 @@ +/*==================================================================== + * seqpgetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alSeqpGetChlFXMix(ALSeqPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].fxmix; +} + diff --git a/lib/ultralib/src/audio/seqpgetpan.c b/lib/ultralib/src/audio/seqpgetpan.c new file mode 100644 index 0000000..23f1067 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetpan.c @@ -0,0 +1,27 @@ +/*==================================================================== + * seqpgetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALPan alSeqpGetChlPan(ALSeqPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].pan; +} + diff --git a/lib/ultralib/src/audio/seqpgetpriority.c b/lib/ultralib/src/audio/seqpgetpriority.c new file mode 100644 index 0000000..e6f77a4 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetpriority.c @@ -0,0 +1,26 @@ +/*==================================================================== + * seqpgetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alSeqpGetChlPriority(ALSeqPlayer *seqp, u8 chan) +{ + return seqp->chanState[chan].priority; +} diff --git a/lib/ultralib/src/audio/seqpgetprogram.c b/lib/ultralib/src/audio/seqpgetprogram.c new file mode 100644 index 0000000..d421cde --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetprogram.c @@ -0,0 +1,42 @@ +/*==================================================================== + * seqpgetprogram.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alSeqpGetChlProgram(ALSeqPlayer *seqp, u8 chan) + +{ + s32 i; + ALBank *b = seqp->bank; + ALInstrument *inst; + ALChanState s; + + s = seqp->chanState[chan]; + for (i=0; iinstCount; i++){ + inst = b->instArray[i]; + if (inst == s.instrument) + return i; + } + return(-1); + +} + diff --git a/lib/ultralib/src/audio/seqpgetseq.c b/lib/ultralib/src/audio/seqpgetseq.c new file mode 100644 index 0000000..d35ea19 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetseq.c @@ -0,0 +1,29 @@ +/*==================================================================== + * seqpgetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALSeq *alSeqpGetSeq(ALSeqPlayer *seqp) +{ + return seqp->target; +} + diff --git a/lib/ultralib/src/audio/seqpgetstate.c b/lib/ultralib/src/audio/seqpgetstate.c new file mode 100644 index 0000000..8d36b49 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetstate.c @@ -0,0 +1,29 @@ +/*==================================================================== + * seqpgetstate.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alSeqpGetState(ALSeqPlayer *seqp) +{ + return seqp->state; +} + diff --git a/lib/ultralib/src/audio/seqpgettempo.c b/lib/ultralib/src/audio/seqpgettempo.c new file mode 100644 index 0000000..41cd4b4 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgettempo.c @@ -0,0 +1,31 @@ +/*==================================================================== + * seqpgettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alSeqpGetTempo(ALSeqPlayer *seqp) +{ + /* sct 1/8/96 - If no target sequence has been set, just return zero (instead of crashing). */ + if (seqp->target == NULL) + return 0; + + return seqp->uspt/seqp->target->qnpt; +} + diff --git a/lib/ultralib/src/audio/seqpgetvol.c b/lib/ultralib/src/audio/seqpgetvol.c new file mode 100644 index 0000000..43a3bb8 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * seqpgetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s16 alSeqpGetVol(ALSeqPlayer *seqp) +{ + return seqp->vol; +} + diff --git a/lib/ultralib/src/audio/seqplayer.c b/lib/ultralib/src/audio/seqplayer.c new file mode 100644 index 0000000..9d77a6f --- /dev/null +++ b/lib/ultralib/src/audio/seqplayer.c @@ -0,0 +1,1228 @@ +/*==================================================================== + * seqplayer.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +/* + * Notes: + * + * Controller Numbers: + * 1 Modulation + * 7 Volume + * 10 Pan + * 11 Expression + * 64 Sustain + * 121 Reset All Controllers + * 123 All Notes Off + * + * Registered Parameters + * 0 Pitch Bend Sensitivity + * 1 Fine Tuning + * 2 Coarse Tuning + */ + +#include +#include +#include +#include +#include "seqp.h" +#include "seq.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + + +static ALMicroTime __seqpVoiceHandler(void *node); +static void __handleMIDIMsg(ALSeqPlayer *seqp, ALEvent *event); +static void __handleMetaMsg(ALSeqPlayer *seqp, ALEvent *event); +static void __handleNextSeqEvent(ALSeqPlayer *seqp); +static void __setUsptFromTempo(ALSeqPlayer *seqp, f32 tempo); /* sct 1/8/96 */ + +/* + * Sequence Player public functions + */ +void alSeqpNew(ALSeqPlayer *seqp, ALSeqpConfig *c) +{ + s32 i; + ALEventListItem *items; + ALVoiceState *vs; + ALVoiceState *voices; + ALHeap *hp = c->heap; + + /* + * initialize member variables + */ + seqp->bank = 0; + seqp->target = NULL; + seqp->drvr = &alGlobals->drvr; + seqp->chanMask = 0xff; + seqp->uspt = 488; + seqp->nextDelta = 0; + seqp->state = AL_STOPPED; + seqp->vol = 0x7FFF; /* full volume */ + seqp->debugFlags = c->debugFlags; + seqp->frameTime = AL_USEC_PER_FRAME; /* should get this from driver */ + seqp->curTime = 0; + seqp->initOsc = c->initOsc; + seqp->updateOsc = c->updateOsc; + seqp->stopOsc = c->stopOsc; + seqp->loopStart = 0; + seqp->loopEnd = 0; + seqp->loopCount = 0; /* -1 = loop forever, 0 = no loop */ + + seqp->nextEvent.type = AL_SEQP_API_EVT; /* start the voice handler "spinning" */ + + /* + * init the channel state + */ + seqp->maxChannels = c->maxChannels; + seqp->chanState = alHeapAlloc(hp, c->maxChannels, sizeof(ALChanState) ); + __initChanState(seqp); /* sct 11/6/95 */ + + /* + * init the voice state array + */ + voices = alHeapAlloc(hp, c->maxVoices, sizeof(ALVoiceState)); + seqp->vFreeList = 0; + for (i = 0; i < c->maxVoices; i++) { + vs = &voices[i]; + vs->next = seqp->vFreeList; + seqp->vFreeList = vs; + } + + seqp->vAllocHead = 0; + seqp->vAllocTail = 0; + + /* + * init the event queue + */ + items = alHeapAlloc(hp, c->maxEvents, sizeof(ALEventListItem)); + alEvtqNew(&seqp->evtq, items, c->maxEvents); + + /* + * add ourselves to the driver + */ + seqp->node.next = NULL; + seqp->node.handler = __seqpVoiceHandler; + seqp->node.clientData = seqp; + alSynAddPlayer(&alGlobals->drvr, &seqp->node); +} + +/************************************************************* + * private routines or driver callback routines + *************************************************************/ +ALMicroTime __seqpVoiceHandler(void *node) +{ + ALSeqPlayer *seqp = (ALSeqPlayer *) node; + ALEvent evt; + ALVoice *voice; + ALMicroTime delta; + ALVoiceState *vs; + void *oscState; + f32 oscValue; + u8 chan; + + do { + + switch (seqp->nextEvent.type) { + + case (AL_SEQ_REF_EVT): + __handleNextSeqEvent(seqp); + break; + + case (AL_SEQP_API_EVT): + evt.type = AL_SEQP_API_EVT; + alEvtqPostEvent(&seqp->evtq, (ALEvent *)&evt, seqp->frameTime); + break; + + case (AL_NOTE_END_EVT): + voice = seqp->nextEvent.msg.note.voice; + alSynStopVoice(seqp->drvr, voice); + alSynFreeVoice(seqp->drvr, voice); + vs = (ALVoiceState *)voice->clientPrivate; + if(vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp,vs); + __unmapVoice(seqp, voice); + break; + + case (AL_SEQP_ENV_EVT): + voice = seqp->nextEvent.msg.vol.voice; + vs = (ALVoiceState *)voice->clientPrivate; + + if (vs->envPhase == AL_PHASE_ATTACK) + vs->envPhase = AL_PHASE_DECAY; + + delta = seqp->nextEvent.msg.vol.delta; + vs->envGain = seqp->nextEvent.msg.vol.vol; + vs->envEndTime = seqp->curTime + delta; + alSynSetVol(seqp->drvr, voice, __vsVol(vs, seqp), delta); + break; + + case (AL_TREM_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + delta = (*seqp->updateOsc)(oscState,&oscValue); + vs->tremelo = (u8)oscValue; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs,seqp), + __vsDelta(vs,seqp->curTime)); + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_VIB_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + chan = seqp->nextEvent.msg.osc.chan; + delta = (*seqp->updateOsc)(oscState,&oscValue); + vs->vibrato = oscValue; + alSynSetPitch(seqp->drvr, &vs->voice, vs->pitch * vs->vibrato + * seqp->chanState[chan].pitchBend); + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_SEQP_MIDI_EVT): + __handleMIDIMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_META_EVT): + __handleMetaMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_PLAY_EVT): + if (seqp->state != AL_PLAYING) + { + seqp->state = AL_PLAYING; + __postNextSeqEvent(seqp); /* seqp must be AL_PLAYING before we call this routine. */ + } + break; + + case (AL_SEQP_STOP_EVT): + if ( seqp->state == AL_STOPPING ) + { + for (vs = seqp->vAllocHead; vs != 0; vs = seqp->vAllocHead) + { + alSynStopVoice(seqp->drvr, &vs->voice); + alSynFreeVoice(seqp->drvr, &vs->voice); + if(vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp,vs); + __unmapVoice((ALSeqPlayer*)seqp, &vs->voice); + } + + seqp->curTime = 0; + seqp->state = AL_STOPPED; + + /* alEvtqFlush(&seqp->evtq); - Don't flush event + queue anymore. */ + /* sct 1/3/96 - Don't overwrite nextEvent with + AL_SEQP_API_EVT or set nextDelta to + AL_USEC_PER_FRAME since we're not stopping event + processing. */ + /* sct 1/3/96 - Don't return here since we keep + processing events as usual. */ + } + break; + + case (AL_SEQP_STOPPING_EVT): + if (seqp->state == AL_PLAYING) + { + /* + * sct 12/29/95 - Remove events associated with the + * stopping sequence. Note that flushing + * AL_SEQP_MIDI_EVTs may flush events that were + * posted after the call to alSeqpStop, so the + * application must queue these events either when + * the player is fully stopped, or when it is + * playing. + */ + alEvtqFlushType(&seqp->evtq, AL_SEQ_REF_EVT); + alEvtqFlushType(&seqp->evtq, AL_SEQP_MIDI_EVT); + + /* + * sct 1/3/96 - Check to see which voices need to be + * killed and release them. Unkilled voices should + * have note end events occurring prior to + * KILL_TIME. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + { + if (__voiceNeedsNoteKill (seqp, &vs->voice, KILL_TIME)) + __seqpReleaseVoice(seqp, &vs->voice, KILL_TIME); + } + + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + } + break; + + case (AL_SEQP_VOL_EVT): + seqp->vol = seqp->nextEvent.msg.spvol.vol; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, seqp), + __vsDelta(vs, seqp->curTime)); + } + break; + + case (AL_SEQP_LOOP_EVT): + seqp->loopStart = seqp->nextEvent.msg.loop.start; + seqp->loopEnd = seqp->nextEvent.msg.loop.end; + seqp->loopCount = seqp->nextEvent.msg.loop.count; + break; + + case (AL_SEQP_PRIORITY_EVT): + chan = seqp->nextEvent.msg.sppriority.chan; + seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority; + break; + case (AL_SEQP_SEQ_EVT): +#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): +#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; + + /* sct 11/6/95 - these events should now be handled by __handleNextSeqEvent */ + case (AL_SEQ_END_EVT): + case (AL_TEMPO_EVT): + case (AL_SEQ_MIDI_EVT): +#if BUILD_VERSION < VERSION_J +#line 314 +#endif + assert(FALSE); + + + break; + } + + seqp->nextDelta = alEvtqNextEvent (&seqp->evtq, &seqp->nextEvent); + + } while (seqp->nextDelta == 0); + + /* + * assume that next callback won't be more than half an hour away + */ + seqp->curTime += seqp->nextDelta; /* Update the player's current time. */ + return seqp->nextDelta; +} + + +/* + Calculates the delta time in ticks until the next sequence + event taking into account loop points, and posts a + sequence reference event with the time in usecs. + + Does nothing if the sequence player is not playing or there + is no target sequence. + + sct 11/7/95 +*/ +void __postNextSeqEvent(ALSeqPlayer *seqp) +{ + ALEvent evt; + s32 deltaTicks; + ALSeq *seq = seqp->target; + + /* sct 1/5/96 - Do nothing if we're not playing or don't have a target sequence. */ + if ((seqp->state != AL_PLAYING) || (seq == NULL)) + return; + + /* Get the next event time in ticks. */ + /* If false is returned, then there is no next delta (ie. end of sequence reached). */ + if (!__alSeqNextDelta(seq, &deltaTicks)) + return; + + /* Handle loops. */ + if (seqp->loopCount) + { + /* Assume that the loop end falls on a MIDI event. Delta time + will be correct even if we loop */ + if (alSeqGetTicks(seq) + deltaTicks >= seqp->loopEnd->curTicks) + { + alSeqSetLoc(seq, seqp->loopStart); + + if (seqp->loopCount != -1) + seqp->loopCount--; + } + } + + evt.type = AL_SEQ_REF_EVT; + 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 + immediately since it does not check the event's tick time. + + sct 11/7/95 +*/ +static void +__handleNextSeqEvent(ALSeqPlayer *seqp) +{ + ALEvent evt; + + /* sct 1/5/96 - Do nothing if we don't have a target sequence. */ + if (seqp->target == NULL) + return; + + alSeqNextEvent(seqp->target, &evt); + + switch (evt.type) + { + case AL_SEQ_MIDI_EVT: + __handleMIDIMsg(seqp, &evt); + __postNextSeqEvent(seqp); + break; + + case AL_TEMPO_EVT: + __handleMetaMsg(seqp, &evt); + __postNextSeqEvent(seqp); + break; + + case AL_SEQ_END_EVT: + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + break; + + default: +#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; + ALVoiceState *vs; + s32 status; + u8 chan; + u8 key; + u8 vel; + u8 byte1; + u8 byte2; + ALMIDIEvent *midi = &event->msg.midi; + s16 vol; + ALEvent evt; + ALMicroTime deltaTime; + ALVoiceState *vstate; + ALPan pan; + ALFxRef fxref; +#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); + + + status = midi->status & AL_MIDI_StatusMask; + chan = midi->status & AL_MIDI_ChannelMask; + byte1 = key = midi->byte1; + byte2 = vel = midi->byte2; + + switch (status) { + + case (AL_MIDI_NoteOn): + + if (vel != 0) { /* a real note on */ + ALVoiceConfig config; + ALSound *sound; + s16 cents; + f32 pitch,oscValue; + u8 fxmix; + void *oscState; + ALInstrument *inst; + + /* If we're not playing, don't process note ons. */ + if (seqp->state != AL_PLAYING) + break; + + sound = __lookupSoundQuick(seqp, key, vel, chan); + ALFlagFailIf(!sound, seqp->debugFlags & NO_SOUND_ERR_MASK, + ERR_ALSEQP_NO_SOUND); + + config.priority = seqp->chanState[chan].priority; + config.fxBus = 0; + config.unityPitch = 0; + + vstate = __mapVoice(seqp, key, vel, chan); + ALFlagFailIf(!vstate, seqp->debugFlags & NO_VOICE_ERR_MASK, + ERR_ALSEQP_NO_VOICE ); + + voice = &vstate->voice; + + alSynAllocVoice(seqp->drvr, voice, &config); + + /* + * set up the voice state structure + */ + vstate->sound = sound; + vstate->envPhase = AL_PHASE_ATTACK; + if (seqp->chanState[chan].sustain > AL_SUSTAIN) + vstate->phase = AL_PHASE_SUSTAIN; + else + vstate->phase = AL_PHASE_NOTEON; + + cents = (key - sound->keyMap->keyBase) * 100 + + sound->keyMap->detune; + + vstate->pitch = alCents2Ratio(cents); + vstate->envGain = sound->envelope->attackVolume; + vstate->envEndTime = seqp->curTime + + sound->envelope->attackTime; + + /* + * setup tremelo and vibrato if active + */ + vstate->flags = 0; + inst = seqp->chanState[chan].instrument; + + oscValue = (f32)AL_VOL_FULL; /* set this as a default */ + + if(inst->tremType) + { + if(seqp->initOsc) + { + deltaTime = (*seqp->initOsc)(&oscState,&oscValue, + inst->tremType, + inst->tremRate, + inst->tremDepth, + inst->tremDelay); + + if(deltaTime) /* if deltaTime = zero, don't run osc */ + { + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x01; /* set tremelo flag bit */ + } + } + } + /* will default if not changed by initOsc */ + vstate->tremelo = (u8)oscValue; + + oscValue = 1.0f; /* set this as a default */ + if(inst->vibType) + { + if(seqp->initOsc) + { + deltaTime = (*seqp->initOsc)(&oscState,&oscValue, + inst->vibType, + inst->vibRate, + inst->vibDepth, + inst->vibDelay); + + if(deltaTime) /* if deltaTime = zero,don't run osc. */ + { + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x02; /* set the vibrato flag bit */ + } + } + } + /* will default if not changed by initOsc */ + vstate->vibrato = oscValue; + + /* + * calculate the note on parameters + */ + pitch = vstate->pitch * seqp->chanState[chan].pitchBend * + vstate->vibrato; + fxmix = seqp->chanState[chan].fxmix; + pan = __vsPan(vstate, seqp); + vol = __vsVol(vstate, seqp); + deltaTime = sound->envelope->attackTime; + + alSynStartVoiceParams(seqp->drvr, voice, sound->wavetable, + pitch, vol, pan, fxmix, deltaTime); + /* + * set up callbacks for envelope + */ + evt.type = AL_SEQP_ENV_EVT; + evt.msg.vol.voice = voice; + evt.msg.vol.vol = sound->envelope->decayVolume; + evt.msg.vol.delta = sound->envelope->decayTime; + deltaTime = sound->envelope->attackTime; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + + break; + } + + /* + * NOTE: intentional fall-through for note on with zero + * velocity + */ + + case (AL_MIDI_NoteOff): + vstate = __lookupVoice(seqp, key, chan); + ALFlagFailIf(!vstate, (seqp->debugFlags & NOTE_OFF_ERR_MASK), + ERR_ALSEQP_OFF_VOICE ); + + if (vstate->phase == AL_PHASE_SUSTAIN) + vstate->phase = AL_PHASE_SUSTREL; + else { + vstate->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice(seqp, &vstate->voice, + vstate->sound->envelope->releaseTime); + } + + break; + + case (AL_MIDI_PolyKeyPressure): + /* + * Aftertouch per key (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + vstate = __lookupVoice(seqp, key, chan); + ALFailIf(!vstate, ERR_ALSEQP_POLY_VOICE ); + + vstate->velocity = byte2; + alSynSetVol(seqp->drvr, &vstate->voice, __vsVol(vstate, seqp), + __vsDelta(vstate, seqp->curTime)); + break; + + case (AL_MIDI_ChannelPressure): + /* + * Aftertouch per channel (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + vs->velocity = byte1; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, seqp), + __vsDelta(vs, seqp->curTime)); + } + } + break; + + case (AL_MIDI_ControlChange): + + switch (byte1) { + + case (AL_MIDI_PAN_CTRL): + seqp->chanState[chan].pan = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + pan = __vsPan(vs, seqp); + alSynSetPan(seqp->drvr, &vs->voice, pan); + } + } + break; + + case (AL_MIDI_VOLUME_CTRL): + seqp->chanState[chan].vol = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->channel == chan) && + (vs->envPhase != AL_PHASE_RELEASE)) + { + vol = __vsVol(vs, seqp); + alSynSetVol(seqp->drvr, &vs->voice, vol, + __vsDelta(vs, seqp->curTime)); + } + } + break; + case (AL_MIDI_PRIORITY_CTRL): + /* leave current voices where they are */ + seqp->chanState[chan].priority = byte2; + break; + case (AL_MIDI_SUSTAIN_CTRL): + seqp->chanState[chan].sustain = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->channel == chan) && + (vs->phase != AL_PHASE_RELEASE)) { + if ( byte2 > AL_SUSTAIN ) { + /* + * sustain pedal down + */ + if (vs->phase == AL_PHASE_NOTEON) + vs->phase = AL_PHASE_SUSTAIN; + } else { + /* + * sustain pedal up + */ + if (vs->phase == AL_PHASE_SUSTAIN) + vs->phase = AL_PHASE_NOTEON; + else if(vs->phase == AL_PHASE_SUSTREL) { + vs->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice(seqp, &vs->voice, + vs->sound->envelope->releaseTime); + } + } + } + } + break; + + case (AL_MIDI_FX1_CTRL): + seqp->chanState[chan].fxmix = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + alSynSetFXMix(seqp->drvr, &vs->voice, byte2); + } + } + break; + + case (AL_MIDI_FX_CTRL_0): + case (AL_MIDI_FX_CTRL_1): + case (AL_MIDI_FX_CTRL_2): + case (AL_MIDI_FX_CTRL_3): + case (AL_MIDI_FX_CTRL_4): + case (AL_MIDI_FX_CTRL_5): + case (AL_MIDI_FX_CTRL_6): + case (AL_MIDI_FX_CTRL_7): +#if 0 /* fx control not implemented */ + fxref = alSynGetFXRef(seqp->drvr, 0, 0); + if (fxref) + alSynSetFXParam(seqp->drvr, fxref, (s16)byte1, (void *)byte2); + break; +#endif + 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. */ +#if BUILD_VERSION < VERSION_J +#line 713 +#endif + assert(seqp->bank != NULL); + + + if (key < seqp->bank->instCount) { + ALInstrument *inst = seqp->bank->instArray[key]; + __setInstChanState(seqp, inst, chan); /* sct 11/6/95 */ + } +#ifdef _DEBUG + else + __osError(ERR_ALSEQPINVALIDPROG, 2, key, seqp->bank->instCount); +#endif + break; + + case (AL_MIDI_PitchBendChange): + { + s32 bendVal; + f32 bendRatio; + s32 cents; + + /* + * get 14-bit unsigned midi value + */ + bendVal = ( (byte2 << 7) + byte1) - 8192; + + /* + * calculate pitch bend in cents + */ + cents = (seqp->chanState[chan].bendRange * bendVal)/8192; + + /* + * calculate the corresponding ratio + */ + bendRatio = alCents2Ratio(cents); + seqp->chanState[chan].pitchBend = bendRatio; + + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + alSynSetPitch(seqp->drvr, &vs->voice, + vs->pitch * bendRatio * vs->vibrato); + } + } + } + break; + + default: +#ifdef _DEBUG + __osError(ERR_ALSEQPUNKNOWNMIDI, 1, status); +#endif + break; + } +} + +void __handleMetaMsg(ALSeqPlayer *seqp, ALEvent *event) +{ + ALTempoEvent *tevt = &event->msg.tempo; + ALEvent evt; + s32 tempo; + + if (event->msg.tempo.status == AL_MIDI_Meta) + { + if (event->msg.tempo.type == AL_MIDI_META_TEMPO) + { + tempo = + (tevt->byte1 << 16) | + (tevt->byte2 << 8) | + (tevt->byte3 << 0); + __setUsptFromTempo (seqp, (f32)tempo); /* sct 1/8/96 */ + } + } +} + +ALVoiceState *__mapVoice(ALSeqPlayer *seqp, u8 key, u8 vel, u8 channel) +{ + ALVoiceState *vs = seqp->vFreeList; + + if (vs) { + + seqp->vFreeList = vs->next; + + vs->next = 0; + + if (!seqp->vAllocHead) + seqp->vAllocHead = vs; + else + seqp->vAllocTail->next = vs; + + seqp->vAllocTail = vs; + + vs->channel = channel; + vs->key = key; + vs->velocity = vel; + vs->voice.clientPrivate = vs; + } + + return vs; +} + +void __unmapVoice(ALSeqPlayer *seqp, ALVoice *voice) +{ + ALVoiceState *prev = 0; + ALVoiceState *vs; + + /* + * we could use doubly linked lists here and save some code and + * execution time, but time spent here in negligible, so it won't + * make much difference. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (&vs->voice == voice) { + + if (prev) + prev->next = vs->next; + else + seqp->vAllocHead = vs->next; + + if (vs == seqp->vAllocTail) { + seqp->vAllocTail = prev; + } + + vs->next = seqp->vFreeList; + seqp->vFreeList = vs; + return; + + } + prev = vs; + } +#ifdef _DEBUG + __osError(ERR_ALSEQPUNMAP, 1, voice); +#endif +} + +ALVoiceState *__lookupVoice(ALSeqPlayer *seqp, u8 key, u8 channel) +{ + ALVoiceState *vs; + + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->key == key) && (vs->channel == channel) && + (vs->phase != AL_PHASE_RELEASE) && (vs->phase != AL_PHASE_SUSTREL)) + return vs; + } + + return 0; +} +#if 0 +ALSound *__lookupSound(ALSeqPlayer *seqp, u8 key, u8 vel, u8 chan) +{ + s32 i; + ALInstrument *inst = seqp->chanState[chan].instrument; + ALSound *snd = 0; + + for (i = 0; i < inst->soundCount; i++) { + ALSound *sound = inst->soundArray[i]; + ALKeyMap *keymap = sound->keyMap; + + if ((key >= keymap->keyMin) && (key <= keymap->keyMax) && + (vel >= keymap->velocityMin) && (vel <= keymap->velocityMax)) { + snd = sound; + break; + } + } + return snd; +} +#endif + +ALSound *__lookupSoundQuick(ALSeqPlayer *seqp, u8 key, u8 vel, u8 chan) +{ + ALInstrument *inst = seqp->chanState[chan].instrument; + s32 l = 1; + s32 r = inst->soundCount; + s32 i; + ALKeyMap *keymap; +#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; + + keymap = inst->soundArray[i-1]->keyMap; + + if ((key >= keymap->keyMin) && (key <= keymap->keyMax) && + (vel >= keymap->velocityMin) && (vel <= keymap->velocityMax)) { + return inst->soundArray[i-1]; + } else if ((key < keymap->keyMin) || + ((vel < keymap->velocityMin) && (key <= keymap->keyMax))) { + r = i - 1; + } else { + l = i + 1; + } + } + + return 0; +} + + +/* + * __vsVol calculates the target volume for the voice based on the + * note on velocity, envelope, sampleVolume and controller. + */ +s16 __vsVol(ALVoiceState *vs, ALSeqPlayer *seqp) +{ + + u32 t1,t2; + + t1 = (vs->tremelo*vs->velocity*vs->envGain) >> 6; + t2 = (vs->sound->sampleVolume*seqp->vol* + seqp->chanState[vs->channel].vol) >> 14; + + t1 *= t2; + t1 >>= 15; + + return( (s16)t1 ); + +} + +ALMicroTime __vsDelta(ALVoiceState *vs, ALMicroTime t) +{ + /* + * If we are interrupting a previously set envelope segment, we + * need to recalculate the segment end time given the current + * time. Note: this routine assumes that the voice is currently + * playing. + */ + + s32 delta = vs->envEndTime - t; + + if (delta >= 0) { + return delta; + } else { + return AL_GAIN_CHANGE_TIME; + } +} + + +ALPan __vsPan(ALVoiceState *vs, ALSeqPlayer *seqp) +{ + s32 tmp; + + tmp = seqp->chanState[vs->channel].pan - AL_PAN_CENTER + + vs->sound->samplePan; + tmp = MAX(tmp, AL_PAN_LEFT); + tmp = MIN(tmp, AL_PAN_RIGHT); + + return (ALPan) tmp; +} + +#ifdef IMPLEMENTED + +s32 seqpGetVoices(SEQP *seqp); +s32 seqpSetVoices(SEQP *seqp, s32 numvoices); + +u16 seqpGetChannelMask(SEQP *seqp); +s32 seqpSetChannelMask(SEQP *seqp, u16 bitmask); + +#endif + +void __seqpReleaseVoice(ALSeqPlayer *seqp, ALVoice *voice, + ALMicroTime deltaTime) +{ + ALEvent evt; + ALVoiceState *vs = (ALVoiceState *)voice->clientPrivate; + + /* + * if in attack phase, remove all pending volume + * events for this voice from the queue + */ + + if (vs->envPhase == AL_PHASE_ATTACK) { + ALLink *thisNode; + ALLink *nextNode; + ALEventListItem *thisItem, *nextItem; + + thisNode = seqp->evtq.allocList.next; + while( thisNode != 0 ) { + nextNode = thisNode->next; + thisItem = (ALEventListItem *)thisNode; + nextItem = (ALEventListItem *)nextNode; + if (thisItem->evt.type == AL_SEQP_ENV_EVT) { + if(thisItem->evt.msg.vol.voice == voice) { + if( nextItem ) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &seqp->evtq.freeList); + } + } + thisNode = nextNode; + } + } + + vs->velocity = 0; + vs->envPhase = AL_PHASE_RELEASE; + vs->envGain = 0; + vs->envEndTime = seqp->curTime + deltaTime; + + alSynSetPriority(seqp->drvr, voice, 0); /* make candidate for stealing */ + alSynSetVol(seqp->drvr, voice, 0, deltaTime); + evt.type = AL_NOTE_END_EVT; + evt.msg.note.voice = voice; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); +} + + + +/* + This special purpose routine is called only when processing + a stopping event in order to properly kill all active voices. + + The routine searches through the seqp's event queue for an + AL_NOTE_END_EVT for the given voice. If the event's execution + time is greater than kill time, it removes the event from the + event queue and returns true that it needs to kill the voice. + Otherwise, if the event's time is less than the kill time, it + returns false that the voice needs to be killed. + + sct 1/3/96 +*/ + +#define VOICENEEDSNOTEKILL_DEBUG _DEBUG_INTERNAL&&0 /* For debugging voiceNeedsNoteKill routine. */ + +char __voiceNeedsNoteKill (ALSeqPlayer *seqp, ALVoice *voice, ALMicroTime killTime) +{ + ALLink *thisNode; + ALLink *nextNode; + ALEventListItem *thisItem; + ALMicroTime itemTime = 0; + char needsNoteKill = TRUE; + +#if VOICENEEDSNOTEKILL_DEBUG + alEvtqPrintAllocEvts (&seqp->evtq); +#endif + + thisNode = seqp->evtq.allocList.next; + while (thisNode != 0) + { + nextNode = thisNode->next; + thisItem = (ALEventListItem *)thisNode; + itemTime += thisItem->delta; + + if (thisItem->evt.type == AL_NOTE_END_EVT) + { + if (thisItem->evt.msg.note.voice == voice) + { + if (itemTime > killTime) + { + if ((ALEventListItem *)nextNode) + ((ALEventListItem *)nextNode)->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &seqp->evtq.freeList); + } + else + needsNoteKill = FALSE; + break; + } + } + thisNode = nextNode; + } + +#if VOICENEEDSNOTEKILL_DEBUG + if (thisNode) + osSyncPrintf("vox 0x%0x: end time %d kill time %d\n\n", voice, itemTime, killTime); + else + osSyncPrintf("vox 0x%0x: not found\n\n", voice); + + alEvtqPrintAllocEvts (&seqp->evtq); +#endif + + return needsNoteKill; +} + + + + +void __initFromBank(ALSeqPlayer *seqp, ALBank *b) +{ + /* + * init the chanState with the default instrument + */ + s32 i; + ALInstrument *inst = 0; + + /* set to the first available instrument. */ + for(i = 0; !inst ; i++) + inst = b->instArray[i]; + + /* sct 11/6/95 - Setup the channel state for the given instrument. */ + /* There is some wasted effort here since both calls the same state vars */ + /* but it's safer. */ + for (i = 0; i < seqp->maxChannels; i++) { + __resetPerfChanState(seqp, i); + __setInstChanState(seqp, inst, i); + } + + if (b->percussion) { + __resetPerfChanState(seqp, i); + __setInstChanState(seqp, b->percussion, 9); + } +} + + +/* + sct 11/6/95 - Call this whenever a new instrument gets assigned to a channel + such as when changing banks or in response to a MIDI program change event. + Currently also gets called when changing sequences. +*/ +void __setInstChanState(ALSeqPlayer *seqp, ALInstrument *inst, s32 chan) +{ + seqp->chanState[chan].instrument = inst; + seqp->chanState[chan].pan = inst->pan; + seqp->chanState[chan].vol = inst->volume; + seqp->chanState[chan].priority = inst->priority; + seqp->chanState[chan].bendRange = inst->bendRange; +} + + +/* + sct 11/6/95 -- Call this whenever a new sequence is to be played or when + initializing a sequence player. +*/ +void __resetPerfChanState(ALSeqPlayer *seqp, s32 chan) +{ + seqp->chanState[chan].fxId = AL_FX_NONE; + seqp->chanState[chan].fxmix = AL_DEFAULT_FXMIX; + seqp->chanState[chan].pan = AL_PAN_CENTER; + seqp->chanState[chan].vol = AL_VOL_FULL; + seqp->chanState[chan].priority = AL_DEFAULT_PRIORITY; + seqp->chanState[chan].sustain = 0; + seqp->chanState[chan].bendRange = 200; + seqp->chanState[chan].pitchBend = 1.0f; +} + + +/* + sct 11/6/95 - Called only when creating a new sequence player. +*/ +void __initChanState(ALSeqPlayer *seqp) +{ + int i; + + for (i = 0; i < seqp->maxChannels; i++) + { + seqp->chanState[i].instrument = 0; + __resetPerfChanState (seqp, i); + } +} + + +void __seqpStopOsc(ALSeqPlayer *seqp, ALVoiceState *vs) +{ + ALEventListItem *thisNode,*nextNode; + s16 evtType; + + thisNode = (ALEventListItem*)seqp->evtq.allocList.next; + while(thisNode) + { + nextNode = (ALEventListItem*)thisNode->node.next; + evtType = thisNode->evt.type; + if(evtType == AL_TREM_OSC_EVT || evtType == AL_VIB_OSC_EVT) + { + if(thisNode->evt.msg.osc.vs == vs) + { + (*seqp->stopOsc)(thisNode->evt.msg.osc.oscState); + alUnlink((ALLink*)thisNode); + if(nextNode) + nextNode->delta += thisNode->delta; + alLink((ALLink*)thisNode, &seqp->evtq.freeList); + if(evtType == AL_TREM_OSC_EVT) + vs->flags = vs->flags & 0xFE; + else /* must be a AL_VIB_OSC_EVT */ + vs->flags = vs->flags & 0xFD; + if(!vs->flags) + return; /* there should be no more events */ + } + } + + thisNode = nextNode; + } +} + + + +/* + This routine safely calculates the sequence player's + uspt value based on the given tempo. It does this safely + by making sure that the player has a target sequence and + therefore a qnpt value which is needed for the calculation. +*/ +static void __setUsptFromTempo (ALSeqPlayer *seqp, f32 tempo) +{ + if (seqp->target) + seqp->uspt = (s32)((f32)tempo * seqp->target->qnpt); + else + seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */ +} diff --git a/lib/ultralib/src/audio/seqploop.c b/lib/ultralib/src/audio/seqploop.c new file mode 100644 index 0000000..9bbaf5f --- /dev/null +++ b/lib/ultralib/src/audio/seqploop.c @@ -0,0 +1,35 @@ +/*==================================================================== + * seqploop.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpLoop(ALSeqPlayer *seqp, ALSeqMarker *start, ALSeqMarker *end, + s32 count) +{ + ALEvent evt; + + evt.type = AL_SEQP_LOOP_EVT; + evt.msg.loop.start = start; + evt.msg.loop.end = end; + evt.msg.loop.count = count; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpplay.c b/lib/ultralib/src/audio/seqpplay.c new file mode 100644 index 0000000..8e65504 --- /dev/null +++ b/lib/ultralib/src/audio/seqpplay.c @@ -0,0 +1,48 @@ +/*==================================================================== + * seqpplay.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "seqp.h" + +void alSeqpPlay(ALSeqPlayer *seqp) +{ + ALEvent evt; + + evt.type = AL_SEQP_PLAY_EVT; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + + + + + + + + + + + + + + + diff --git a/lib/ultralib/src/audio/seqpsendmidi.c b/lib/ultralib/src/audio/seqpsendmidi.c new file mode 100644 index 0000000..56a9510 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsendmidi.c @@ -0,0 +1,40 @@ +/*==================================================================== + * seqpsendmidi.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSendMidi(ALSeqPlayer *seqp, s32 ticks, u8 status, u8 byte1, + u8 byte2) +{ + ALEvent evt; + ALMicroTime deltaTime; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = status; + evt.msg.midi.byte1 = byte1; + evt.msg.midi.byte2 = byte2; + evt.msg.midi.duration = 0; + + deltaTime = ticks*seqp->uspt; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); +} + diff --git a/lib/ultralib/src/audio/seqpsetbank.c b/lib/ultralib/src/audio/seqpsetbank.c new file mode 100644 index 0000000..1c00e8b --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetbank.c @@ -0,0 +1,32 @@ +/*==================================================================== + * seqpsetbank.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetBank(ALSeqPlayer *seqp, ALBank *b) +{ + ALEvent evt; + + evt.type = AL_SEQP_BANK_EVT; + evt.msg.spbank.bank = b; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsetchlvol.c b/lib/ultralib/src/audio/seqpsetchlvol.c new file mode 100644 index 0000000..9b48803 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetchlvol.c @@ -0,0 +1,35 @@ +/*==================================================================== + * seqpsetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlVol(ALSeqPlayer *seqp, u8 chan, u8 vol) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_VOLUME_CTRL; + evt.msg.midi.byte2 = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsetfxmix.c b/lib/ultralib/src/audio/seqpsetfxmix.c new file mode 100644 index 0000000..9397963 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetfxmix.c @@ -0,0 +1,35 @@ +/*==================================================================== + * seqpsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlFXMix(ALSeqPlayer *seqp, u8 chan, u8 fxmix) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_FX1_CTRL; + evt.msg.midi.byte2 = fxmix; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsetpan.c b/lib/ultralib/src/audio/seqpsetpan.c new file mode 100644 index 0000000..85d07d9 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetpan.c @@ -0,0 +1,35 @@ +/*==================================================================== + * seqpsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlPan(ALSeqPlayer *seqp, u8 chan, ALPan pan) +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_PAN_CTRL; + evt.msg.midi.byte2 = pan; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsetpriority.c b/lib/ultralib/src/audio/seqpsetpriority.c new file mode 100644 index 0000000..0910726 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetpriority.c @@ -0,0 +1,32 @@ +/*==================================================================== + * seqpsetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlPriority(ALSeqPlayer *seqp, u8 chan, u8 priority) +{ + ALEvent evt; + + evt.type = AL_SEQP_PRIORITY_EVT; + evt.msg.sppriority.chan = chan; + evt.msg.sppriority.priority = priority; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/ultralib/src/audio/seqpsetprogram.c b/lib/ultralib/src/audio/seqpsetprogram.c new file mode 100644 index 0000000..dfd6d94 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetprogram.c @@ -0,0 +1,36 @@ +/*==================================================================== + * seqpsetprogram.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlProgram(ALSeqPlayer *seqp, u8 chan, u8 prog) + +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ProgramChange | chan; + evt.msg.midi.byte1 = prog; + evt.msg.midi.byte2 = 0; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsetseq.c b/lib/ultralib/src/audio/seqpsetseq.c new file mode 100644 index 0000000..3fe8175 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetseq.c @@ -0,0 +1,34 @@ +/*==================================================================== + * seqpsetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetSeq(ALSeqPlayer *seqp, ALSeq *seq) +{ + ALEvent evt; + + evt.type = AL_SEQP_SEQ_EVT; + evt.msg.spseq.seq = seq; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsettempo.c b/lib/ultralib/src/audio/seqpsettempo.c new file mode 100644 index 0000000..592320a --- /dev/null +++ b/lib/ultralib/src/audio/seqpsettempo.c @@ -0,0 +1,36 @@ +/*==================================================================== + * seqpsettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetTempo(ALSeqPlayer *seqp, s32 tempo) +{ + ALEvent evt; + + evt.type = AL_SEQP_META_EVT; + evt.msg.tempo.status = AL_MIDI_Meta; + evt.msg.tempo.type = AL_MIDI_META_TEMPO; + evt.msg.tempo.byte1 = (tempo & 0xff0000)>>16; + evt.msg.tempo.byte2 = (tempo & 0xff00)>>8; + evt.msg.tempo.byte3 = tempo & 0xff; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpsetvol.c b/lib/ultralib/src/audio/seqpsetvol.c new file mode 100644 index 0000000..b698a40 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetvol.c @@ -0,0 +1,32 @@ +/*==================================================================== + * seqpsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetVol(ALSeqPlayer *seqp, s16 vol) +{ + ALEvent evt; + + evt.type = AL_SEQP_VOL_EVT; + evt.msg.spvol.vol = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} + diff --git a/lib/ultralib/src/audio/seqpstop.c b/lib/ultralib/src/audio/seqpstop.c new file mode 100644 index 0000000..abec781 --- /dev/null +++ b/lib/ultralib/src/audio/seqpstop.c @@ -0,0 +1,33 @@ +/*==================================================================== + * seqpstop.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpStop(ALSeqPlayer *seqp) +{ + ALEvent evt; + + evt.type = AL_SEQP_STOPPING_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, 0); + +} + diff --git a/lib/ultralib/src/audio/sl.c b/lib/ultralib/src/audio/sl.c new file mode 100644 index 0000000..d184972 --- /dev/null +++ b/lib/ultralib/src/audio/sl.c @@ -0,0 +1,65 @@ +/*==================================================================== + * sl.c + * + * Synopsis: + * Sound library global routines + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALGlobals *alGlobals=0; + +void alInit(ALGlobals *g, ALSynConfig *c) +{ + if (!alGlobals) { /* already initialized? */ + alGlobals = g; + alSynNew(&alGlobals->drvr, c); + } +} + +void alClose(ALGlobals *glob) +{ + if (alGlobals) { + alSynDelete(&glob->drvr); + alGlobals = 0; + } +} + +/* might want to make these macros */ +void alLink(ALLink *ln, ALLink *to) +{ + ln->next = to->next; + ln->prev = to; + if (to->next) + to->next->prev = ln; + to->next = ln; +} + +void alUnlink(ALLink *ln) +{ + if (ln->next) + ln->next->prev = ln->prev; + if (ln->prev) + ln->prev->next = ln->next; +} + + + + + diff --git a/lib/ultralib/src/audio/sndp.h b/lib/ultralib/src/audio/sndp.h new file mode 100644 index 0000000..17d7015 --- /dev/null +++ b/lib/ultralib/src/audio/sndp.h @@ -0,0 +1,102 @@ +/*==================================================================== + * sndp.h + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + + +#ifndef __SNDP__ +#define __SNDP__ + +#include + +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define MIN_RATIO 0.0001 + +typedef enum { + AL_SNDP_PLAY_EVT, + AL_SNDP_STOP_EVT, + AL_SNDP_PAN_EVT, + AL_SNDP_VOL_EVT, + AL_SNDP_PITCH_EVT, + AL_SNDP_API_EVT, + AL_SNDP_DECAY_EVT, + AL_SNDP_END_EVT, + AL_SNDP_FX_EVT +} ALSndpMsgType; + +typedef struct { + ALVoice voice; + ALSound *sound; /* sound referenced here */ + s16 priority; + f32 pitch; /* current playback pitch */ + 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 */ +} ALSoundState; + +typedef union { + + ALEvent msg; + + struct { + s16 type; + ALSoundState *state; + } common; + + struct { + s16 type; + ALSoundState *state; + s16 vol; + } vol; + + struct { + s16 type; + ALSoundState *state; + f32 pitch; + } pitch; + + struct { + s16 type; + ALSoundState *state; + ALPan pan; + } pan; + + struct { + s16 type; + ALSoundState *state; + u8 mix; + } fx; + +} ALSndpEvent; + +static ALMicroTime _sndpVoiceHandler(void *node); +static void _handleEvent(ALSndPlayer *sndp, ALSndpEvent *event); +static void _removeEvents(ALEventQueue *evtq, ALSoundState *state); +static s32 _DivS32ByF32 (s32 i, f32 f); + +#endif diff --git a/lib/ultralib/src/audio/sndpallocate.c b/lib/ultralib/src/audio/sndpallocate.c new file mode 100644 index 0000000..0629ac7 --- /dev/null +++ b/lib/ultralib/src/audio/sndpallocate.c @@ -0,0 +1,43 @@ +/*==================================================================== + * sndpallocate.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +ALSndId alSndpAllocate(ALSndPlayer *sndp, ALSound *sound) +{ + ALSndId i; + ALSoundState *sState = sndp->sndState; + + for (i = 0; i < sndp->maxSounds; i++) { + if (!sState[i].sound) { + sState[i].sound = sound; + sState[i].priority = AL_DEFAULT_PRIORITY; + sState[i].state = AL_STOPPED; + sState[i].pitch = 1.0; + sState[i].pan = AL_PAN_CENTER; + sState[i].fxMix = AL_DEFAULT_FXMIX; + sState[i].vol = 32767*sound->sampleVolume/AL_VOL_FULL; + return i; + } + } + + return -1; +} + diff --git a/lib/ultralib/src/audio/sndpdeallocate.c b/lib/ultralib/src/audio/sndpdeallocate.c new file mode 100644 index 0000000..7c18b56 --- /dev/null +++ b/lib/ultralib/src/audio/sndpdeallocate.c @@ -0,0 +1,35 @@ +/*==================================================================== + * sndpdeallocate.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpDeallocate(ALSndPlayer *sndp, ALSndId id) +{ + ALSoundState *sState = sndp->sndState; + + ALFailIf((sState + id)->state != AL_STOPPED, ERR_ALSNDPDEALLOCATE); + + sState[id].sound = 0; + if (sndp->target == id) /* if we are deleting the target sound */ + sndp->target = -1; +} + diff --git a/lib/ultralib/src/audio/sndpdelete.c b/lib/ultralib/src/audio/sndpdelete.c new file mode 100644 index 0000000..5cfb4f7 --- /dev/null +++ b/lib/ultralib/src/audio/sndpdelete.c @@ -0,0 +1,44 @@ +/*==================================================================== + * sndpdelete.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpDelete(ALSndPlayer *sndp) +{ + /* + * Remove client from synthesizer. Note application is responsible + * for making sure all sounds have been stopped beforehand. + */ +#ifdef _DEBUG + { + int i, notStopped = 0; + ALSoundState *sState = sndp->sndState; + + for (i=0; imaxSounds; i++) + if ((sState + i)->state != AL_STOPPED) + notStopped = 1; + ALFailIf(notStopped, ERR_ALSNDPDELETE); + } +#endif + alSynRemovePlayer(&alGlobals->drvr, &sndp->node); +} + diff --git a/lib/ultralib/src/audio/sndpgetsound.c b/lib/ultralib/src/audio/sndpgetsound.c new file mode 100644 index 0000000..9088982 --- /dev/null +++ b/lib/ultralib/src/audio/sndpgetsound.c @@ -0,0 +1,27 @@ +/*==================================================================== + * sndpgetsound.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +ALSndId alSndpGetSound(ALSndPlayer *sndp) +{ + return (ALSndId) sndp->target; +} + diff --git a/lib/ultralib/src/audio/sndpgetstate.c b/lib/ultralib/src/audio/sndpgetstate.c new file mode 100644 index 0000000..882b4a3 --- /dev/null +++ b/lib/ultralib/src/audio/sndpgetstate.c @@ -0,0 +1,29 @@ +/*==================================================================== + * sndpgetstate.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +s32 alSndpGetState(ALSndPlayer *sndp) +{ + ALSoundState *sState = sndp->sndState; + + return (sState + sndp->target)->state; +} + diff --git a/lib/ultralib/src/audio/sndplayer.c b/lib/ultralib/src/audio/sndplayer.c new file mode 100644 index 0000000..f2d7b56 --- /dev/null +++ b/lib/ultralib/src/audio/sndplayer.c @@ -0,0 +1,297 @@ +/*==================================================================== + * Sndplayer.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include +#include + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void alSndpNew(ALSndPlayer *sndp, ALSndpConfig *c) +{ + u8 *ptr; + ALEvent evt; + ALSoundState *sState; + u32 i; + + /* + * Init member variables + */ + sndp->maxSounds = c->maxSounds; + sndp->target = -1; + sndp->frameTime = AL_USEC_PER_FRAME; /* time between API events */ + sState = (ALSoundState*)alHeapAlloc(c->heap, 1, + c->maxSounds * sizeof(ALSoundState)); + sndp->sndState = sState; + + for(i = 0; i < c->maxSounds; i++) + sState[i].sound = 0; + + /* + * init the event queue + */ + ptr = alHeapAlloc(c->heap, 1, c->maxEvents * sizeof(ALEventListItem)); + alEvtqNew(&sndp->evtq, (ALEventListItem *)ptr, c->maxEvents); + + /* + * add ourselves to the driver + */ + sndp->drvr = &alGlobals->drvr; + sndp->node.next = NULL; + sndp->node.handler = _sndpVoiceHandler; + sndp->node.clientData = sndp; + alSynAddPlayer(sndp->drvr, &sndp->node); + + /* + * Start responding to API events + */ + evt.type = AL_SNDP_API_EVT; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, sndp->frameTime); + sndp->nextDelta = alEvtqNextEvent(&sndp->evtq, &sndp->nextEvent); + +} + +/************************************************************* + * Sound Player private routines + *************************************************************/ +ALMicroTime _sndpVoiceHandler(void *node) +{ + ALSndPlayer *sndp = (ALSndPlayer *) node; + ALSndpEvent evt; + + do { + switch (sndp->nextEvent.type) { + case (AL_SNDP_API_EVT): + evt.common.type = AL_SNDP_API_EVT; +#if BUILD_VERSION >= VERSION_K + evt.common.state = (ALSoundState*)-1; +#endif + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, sndp->frameTime); + break; + + default: + _handleEvent(sndp, (ALSndpEvent *)&sndp->nextEvent); + break; + } + sndp->nextDelta = alEvtqNextEvent(&sndp->evtq, &sndp->nextEvent); + + } while (sndp->nextDelta == 0); + sndp->curTime += sndp->nextDelta; + return sndp->nextDelta; +} + +void _handleEvent(ALSndPlayer *sndp, ALSndpEvent *event) +{ + ALVoiceConfig vc; + ALSound *snd; + ALVoice *voice; + ALPan pan; + f32 pitch; + ALSndpEvent evt; + ALMicroTime delta; + + s16 vol; + s16 tmp; + s32 vtmp; + ALSoundState *state; + + state = event->common.state; + snd = state->sound; + + + switch (event->msg.type) { + case (AL_SNDP_PLAY_EVT): + if (state->state != AL_STOPPED || !snd) + return; + + vc.fxBus = 0; /* effect buss 0 */ + vc.priority = state->priority; + vc.unityPitch = 0; + + voice = &state->voice; + alSynAllocVoice(sndp->drvr, voice, &vc); + + vol = (s16) ((s32) snd->envelope->attackVolume*state->vol/AL_VOL_FULL); + tmp = state->pan - AL_PAN_CENTER + snd->samplePan; + tmp = MAX(tmp, AL_PAN_LEFT); + pan = (ALPan) MIN(tmp, AL_PAN_RIGHT); + pitch = state->pitch; + delta = snd->envelope->attackTime; + + alSynStartVoice(sndp->drvr, voice, snd->wavetable); + state->state = AL_PLAYING; + + alSynSetPan(sndp->drvr, voice, pan); + alSynSetVol(sndp->drvr, voice, vol, delta); + alSynSetPitch(sndp->drvr, voice, pitch); + alSynSetFXMix(sndp->drvr, voice, state->fxMix); + + evt.common.type = AL_SNDP_DECAY_EVT; + evt.common.state = state; + delta = (ALMicroTime) _DivS32ByF32 (snd->envelope->attackTime, state->pitch); + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, delta); + break; + + case (AL_SNDP_STOP_EVT): + if (state->state != AL_PLAYING || !snd) + return; + + delta = (ALMicroTime) _DivS32ByF32 (snd->envelope->releaseTime, state->pitch); + alSynSetVol(sndp->drvr, &state->voice, 0, delta); + + if (delta) { + evt.common.type = AL_SNDP_END_EVT; + evt.common.state = state; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, delta); + state->state = AL_STOPPING; + } else { + /* note: this code is repeated in AL_SNDP_END_EVT */ + alSynStopVoice(sndp->drvr, &state->voice); + alSynFreeVoice(sndp->drvr, &state->voice); + _removeEvents(&sndp->evtq, state); + state->state = AL_STOPPED; + } + break; + + case (AL_SNDP_PAN_EVT): + state->pan = event->pan.pan; + if (state->state == AL_PLAYING && snd){ + tmp = state->pan - AL_PAN_CENTER + snd->samplePan; + tmp = MAX(tmp, AL_PAN_LEFT); + pan = (ALPan) MIN(tmp, AL_PAN_RIGHT); + alSynSetPan(sndp->drvr, &state->voice, pan); + } + break; + + case (AL_SNDP_PITCH_EVT): + /* Limit the pitch to a practical value even though we only need */ + /* to limit it to a non-zero number to avoid divide by zero. */ + if ((state->pitch = event->pitch.pitch) < MIN_RATIO) + state->pitch = MIN_RATIO; + + if (state->state == AL_PLAYING){ + alSynSetPitch(sndp->drvr, &state->voice, state->pitch); + } + break; + + case (AL_SNDP_FX_EVT): + state->fxMix = event->fx.mix; + if (state->state == AL_PLAYING) + alSynSetFXMix(sndp->drvr, &state->voice, state->fxMix); + break; + + case (AL_SNDP_VOL_EVT): + state->vol = event->vol.vol; + if (state->state == AL_PLAYING && snd){ + vtmp = snd->envelope->decayVolume * state->vol/AL_VOL_FULL; + alSynSetVol(sndp->drvr, &state->voice, (s16) vtmp, 1000); + } + break; + + case (AL_SNDP_DECAY_EVT): + /* + * The voice has theoretically reached its attack velocity, + * set up callback for release envelope - except for a looped sound + */ + if (snd->envelope->decayTime != -1){ + vtmp = snd->envelope->decayVolume * state->vol/AL_VOL_FULL; + delta = (ALMicroTime) _DivS32ByF32 (snd->envelope->decayTime, state->pitch); + alSynSetVol(sndp->drvr, &state->voice, (s16) vtmp, delta); + evt.common.type = AL_SNDP_STOP_EVT; + evt.common.state = state; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, delta); + } + break; + + case (AL_SNDP_END_EVT): + /* note: this code is repeated in AL_SNDP_STOP_EVT */ + alSynStopVoice(sndp->drvr, &state->voice); + alSynFreeVoice(sndp->drvr, &state->voice); + _removeEvents(&sndp->evtq, state); + state->state = AL_STOPPED; + break; + + default: + break; + } +} +static void _removeEvents(ALEventQueue *evtq, ALSoundState *state) +{ + ALLink *thisNode; + ALLink *nextNode; + ALEventListItem *thisItem; + ALEventListItem *nextItem; + ALSndpEvent *thisEvent; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while( thisNode != 0 ) { + nextNode = thisNode->next; + thisItem = (ALEventListItem *)thisNode; + nextItem = (ALEventListItem *)nextNode; + thisEvent = (ALSndpEvent *) &thisItem->evt; + if (thisEvent->common.state == state){ + if( nextItem ) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + } + thisNode = nextNode; + } + + osSetIntMask(mask); +} +/* + This routine safely divides a signed 32-bit integer + by a floating point value. It avoids overflow by using + a double to store the result and then before truncating + to an integer it compares the result to the limit and + limits it on overflow. Underflow is handled automatically + by the CPU which limits the value to zero. + + Presently this routine is used to divide a time in usecs + by a pitch ratio. Since the time could be a very large number, + very small pitch ratios can cause the reult to overflow, + causing a floating point exception. +*/ +#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; + + assert(f!=0); /* Caller must make sure we do not divide by zero! */ + + rd = i/f; /* Store result as a double to avoid overflow. */ + + if (rd > INT_MAX) /* Limit the value if necessary. */ + ri = INT_MAX; + else + ri = rd; + + return ri; +} diff --git a/lib/ultralib/src/audio/sndpplay.c b/lib/ultralib/src/audio/sndpplay.c new file mode 100644 index 0000000..ff5d123 --- /dev/null +++ b/lib/ultralib/src/audio/sndpplay.c @@ -0,0 +1,36 @@ +/*==================================================================== + * sndpplay.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpPlay(ALSndPlayer *sndp) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + + ALFailIf((sState + sndp->target)->state != AL_STOPPED, ERR_ALSNDPPLAY); + + evt.common.type = AL_SNDP_PLAY_EVT; + evt.common.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, 0); +} + diff --git a/lib/ultralib/src/audio/sndpplayat.c b/lib/ultralib/src/audio/sndpplayat.c new file mode 100644 index 0000000..b37f796 --- /dev/null +++ b/lib/ultralib/src/audio/sndpplayat.c @@ -0,0 +1,32 @@ +/*==================================================================== + * sndpplayat.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +void alSndpPlayAt(ALSndPlayer *sndp, ALMicroTime delta) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + + evt.common.type = AL_SNDP_PLAY_EVT; + evt.common.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, delta); +} + diff --git a/lib/ultralib/src/audio/sndpsetfxmix.c b/lib/ultralib/src/audio/sndpsetfxmix.c new file mode 100644 index 0000000..147c956 --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetfxmix.c @@ -0,0 +1,42 @@ +/*==================================================================== + * sndpsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetFXMix(ALSndPlayer *sndp, u8 mix) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)){ + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds-1); + return; + } +#endif + + evt.fx.type = AL_SNDP_FX_EVT; + evt.fx.state = &sState[sndp->target]; + evt.fx.mix = mix; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, 0); +} + diff --git a/lib/ultralib/src/audio/sndpsetpan.c b/lib/ultralib/src/audio/sndpsetpan.c new file mode 100644 index 0000000..5f98648 --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetpan.c @@ -0,0 +1,42 @@ +/*==================================================================== + * sndpsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetPan(ALSndPlayer *sndp, ALPan pan) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)){ + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds-1); + return; + } +#endif + + evt.pan.type = AL_SNDP_PAN_EVT; + evt.pan.pan = pan; + evt.pan.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, 0); +} + diff --git a/lib/ultralib/src/audio/sndpsetpitch.c b/lib/ultralib/src/audio/sndpsetpitch.c new file mode 100644 index 0000000..0ee174c --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetpitch.c @@ -0,0 +1,48 @@ +/*==================================================================== + * sndpsetpitch.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetPitch(ALSndPlayer *sndp, f32 pitch) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + + /* + * If this is set during playback there will be + * a the envelope lengths won't be accurate - but you can still + * do it. + */ + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)){ + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds-1); + return; + } +#endif + + evt.pitch.type = AL_SNDP_PITCH_EVT; + evt.pitch.state = &sState[sndp->target]; + evt.pitch.pitch = pitch; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, 0); +} + diff --git a/lib/ultralib/src/audio/sndpsetpriority.c b/lib/ultralib/src/audio/sndpsetpriority.c new file mode 100644 index 0000000..0d0fbc0 --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetpriority.c @@ -0,0 +1,38 @@ +/*==================================================================== + * sndpsetsound.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetPriority(ALSndPlayer *sndp, ALSndId id, u8 priority) +{ + ALSoundState *sState = sndp->sndState; + +#ifdef _DEBUG + if ((id >= sndp->maxSounds) || (id < 0)){ + __osError(ERR_ALSNDPSETPRIORITY, 2, id, sndp->maxSounds-1); + return; + } +#endif + + sState[id].priority = priority; +} + diff --git a/lib/ultralib/src/audio/sndpsetsound.c b/lib/ultralib/src/audio/sndpsetsound.c new file mode 100644 index 0000000..3d341ec --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetsound.c @@ -0,0 +1,36 @@ +/*==================================================================== + * sndpsetsound.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetSound(ALSndPlayer *sndp, ALSndId id) +{ +#ifdef _DEBUG + if ((id >= sndp->maxSounds) || (id < 0)){ + __osError(ERR_ALSNDPSETSOUND, 2, id, sndp->maxSounds-1); + return; + } +#endif + + sndp->target = id; +} + diff --git a/lib/ultralib/src/audio/sndpsetvol.c b/lib/ultralib/src/audio/sndpsetvol.c new file mode 100644 index 0000000..ad79f5f --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetvol.c @@ -0,0 +1,42 @@ +/*==================================================================== + * sndpsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetVol(ALSndPlayer *sndp, s16 vol) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)){ + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds-1); + return; + } +#endif + + evt.vol.type = AL_SNDP_VOL_EVT; + evt.vol.state = &sState[sndp->target]; + evt.vol.vol = vol; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, 0); +} + diff --git a/lib/ultralib/src/audio/sndpstop.c b/lib/ultralib/src/audio/sndpstop.c new file mode 100644 index 0000000..69aead6 --- /dev/null +++ b/lib/ultralib/src/audio/sndpstop.c @@ -0,0 +1,35 @@ +/*==================================================================== + * sndpstop.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +void alSndpStop(ALSndPlayer *sndp) +{ + ALSndpEvent evt; + ALSoundState *sState = sndp->sndState; + + /* + * Go immediately into the release phase + */ + evt.common.type = AL_SNDP_STOP_EVT; + evt.common.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent *)&evt, 0); +} + diff --git a/lib/ultralib/src/audio/synaddplayer.c b/lib/ultralib/src/audio/synaddplayer.c new file mode 100644 index 0000000..77efb29 --- /dev/null +++ b/lib/ultralib/src/audio/synaddplayer.c @@ -0,0 +1,34 @@ +/*==================================================================== + * synaddplayer.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include + +void alSynAddPlayer(ALSynth *drvr, ALPlayer *client) +{ + OSIntMask mask = osSetIntMask(OS_IM_NONE); + + client->samplesLeft = drvr->curSamples; + client->next = drvr->head; + drvr->head = client; + + osSetIntMask(mask); +} + diff --git a/src/libultra/al/synallocfx.c b/lib/ultralib/src/audio/synallocfx.c similarity index 99% rename from src/libultra/al/synallocfx.c rename to lib/ultralib/src/audio/synallocfx.c index 5831062..e0e7f26 100644 --- a/src/libultra/al/synallocfx.c +++ b/lib/ultralib/src/audio/synallocfx.c @@ -29,3 +29,4 @@ ALFxRef *alSynAllocFX(ALSynth *s, s16 bus, ALSynConfig *c, ALHeap *hp) return (ALFxRef)(&s->auxBus[bus].fx[0]); } + diff --git a/lib/ultralib/src/audio/synallocvoice.c b/lib/ultralib/src/audio/synallocvoice.c new file mode 100644 index 0000000..73d608d --- /dev/null +++ b/lib/ultralib/src/audio/synallocvoice.c @@ -0,0 +1,132 @@ +/*==================================================================== + * synallocvoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include "synthInternals.h" + +s32 _allocatePVoice(ALSynth *drvr, PVoice **pvoice, s16 priority); + +s32 alSynAllocVoice(ALSynth *drvr, ALVoice *voice, ALVoiceConfig *vc) +{ + PVoice *pvoice = 0; + ALFilter *f; + ALParam *update; + s32 stolen; + +#ifdef _DEBUG + /* need two updates if voice is stolen */ + if (drvr->paramList == 0) { + __osError(ERR_ALSYN_NO_UPDATE, 0); + return 0; + } else if (drvr->paramList->next == 0) { + __osError(ERR_ALSYN_NO_UPDATE, 0); + return 0; + } +#endif + + voice->priority = vc->priority; + voice->unityPitch = vc->unityPitch; + voice->table = 0; + voice->fxBus = vc->fxBus; + voice->state = AL_STOPPED; + voice->pvoice = 0; + + stolen = _allocatePVoice(drvr, &pvoice, vc->priority); + + if (pvoice) { /* if we were able to allocate a voice */ + + f = pvoice->channelKnob; + + if (stolen) { + + pvoice->offset = 512; + pvoice->vvoice->pvoice = 0; /* zero stolen voice */ + + /* + * ramp down stolen voice + */ + update = __allocParam(); + update->delta = drvr->paramSamples; + update->type = AL_FILTER_SET_VOLUME; + update->data.i = 0; + update->moredata.i = pvoice->offset - 64; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + + /* + * stop stolen voice + */ + update = __allocParam(); + if (update) { + update->delta = drvr->paramSamples + pvoice->offset; + update->type = AL_FILTER_STOP_VOICE; + update->next = 0; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } else { +#ifdef _DEBUG + __osError(ERR_ALSYN_NO_UPDATE, 0); +#endif + } + + } else { + pvoice->offset = 0; + } + + pvoice->vvoice = voice; /* assign new voice */ + voice->pvoice = pvoice; + + } + + return (pvoice != 0); +} + +s32 _allocatePVoice(ALSynth *drvr, PVoice **pvoice, s16 priority) +{ + ALLink *dl; + PVoice *pv; + s32 stolen = 0; + + if ((dl = drvr->pLameList.next) != 0) { /* check the lame list first */ + *pvoice = (PVoice *) dl; + alUnlink(dl); + alLink(dl, &drvr->pAllocList); + } else if ((dl = drvr->pFreeList.next) != 0) { /* from the free list */ + *pvoice = (PVoice *) dl; + alUnlink(dl); + alLink(dl, &drvr->pAllocList); + } else { /* steal one */ + for (dl = drvr->pAllocList.next; dl != 0; dl = dl->next) { + pv = (PVoice *)dl; + + /* + * if it is lower priority and not already stolen, keep it + * as a candidate for stealing + */ + if ((pv->vvoice->priority <= priority) && (pv->offset == 0)) { + *pvoice = pv; + priority = pv->vvoice->priority; + stolen = 1; + } + } + } + + return stolen; +} + diff --git a/src/libultra/al/syndelete.c b/lib/ultralib/src/audio/syndelete.c similarity index 99% rename from src/libultra/al/syndelete.c rename to lib/ultralib/src/audio/syndelete.c index 74abaa4..900fe76 100644 --- a/src/libultra/al/syndelete.c +++ b/lib/ultralib/src/audio/syndelete.c @@ -24,3 +24,4 @@ void alSynDelete(ALSynth *drvr) { drvr->head = 0; } + diff --git a/lib/ultralib/src/audio/synfreefx.c b/lib/ultralib/src/audio/synfreefx.c new file mode 100644 index 0000000..be436ea --- /dev/null +++ b/lib/ultralib/src/audio/synfreefx.c @@ -0,0 +1,26 @@ +/*==================================================================== + * synfreefx.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +void alSynFreeFX(ALSynth *s, ALFxRef *fx) +{ +} + diff --git a/lib/ultralib/src/audio/synfreevoice.c b/lib/ultralib/src/audio/synfreevoice.c new file mode 100644 index 0000000..eaa71ac --- /dev/null +++ b/lib/ultralib/src/audio/synfreevoice.c @@ -0,0 +1,54 @@ +/*==================================================================== + * synfreevoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include "synthInternals.h" + +#include + +void alSynFreeVoice(ALSynth *drvr, ALVoice *voice) +{ + ALFilter *f; + ALFreeParam *update; + + if (voice->pvoice) { + + if (voice->pvoice->offset) { /* if voice was stolen */ + update = (ALFreeParam *)__allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set voice data + */ + update->delta = drvr->paramSamples + voice->pvoice->offset; + update->type = AL_FILTER_FREE_VOICE; + update->pvoice = voice->pvoice; + + f = voice->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } else { + _freePVoice(drvr, voice->pvoice); + } + + voice->pvoice = 0; + + } +} diff --git a/lib/ultralib/src/audio/syngetfxref.c b/lib/ultralib/src/audio/syngetfxref.c new file mode 100644 index 0000000..b0fa577 --- /dev/null +++ b/lib/ultralib/src/audio/syngetfxref.c @@ -0,0 +1,33 @@ +/*==================================================================== + * syngetfxref.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +ALFxRef alSynGetFXRef(ALSynth *s, s16 bus, s16 index) +{ + ALMainBus *m = (ALMainBus *) s->mainBus; + ALFilter **sources = m->sources; + + if (sources[0]->type == AL_FX) + return (ALFxRef)(&s->auxBus[bus].fx[index]); + else + return 0; +} + diff --git a/lib/ultralib/src/audio/syngetpriority.c b/lib/ultralib/src/audio/syngetpriority.c new file mode 100644 index 0000000..68de365 --- /dev/null +++ b/lib/ultralib/src/audio/syngetpriority.c @@ -0,0 +1,27 @@ +/*==================================================================== + * syngetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +s16 alSynGetPriority(ALSynth *s, ALVoice *voice) +{ + return voice->priority; +} + diff --git a/lib/ultralib/src/audio/synremoveplayer.c b/lib/ultralib/src/audio/synremoveplayer.c new file mode 100644 index 0000000..0248a7e --- /dev/null +++ b/lib/ultralib/src/audio/synremoveplayer.c @@ -0,0 +1,49 @@ +/*==================================================================== + * synremoveplayer.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include + +void alSynRemovePlayer(ALSynth *drvr, ALPlayer *client) +{ + ALPlayer *thing; + ALPlayer *prev = 0; + + if (drvr->head != 0) + { + OSIntMask mask = osSetIntMask(OS_IM_NONE); + + for (thing = drvr->head; thing != 0; thing = thing->next) { + if (thing == client) { + if(prev) + prev->next = thing->next; + else + drvr->head = thing->next; + + client->next = 0; + break; + } + prev = thing; + } + + osSetIntMask(mask); + } +} + diff --git a/lib/ultralib/src/audio/synsetfxmix.c b/lib/ultralib/src/audio/synsetfxmix.c new file mode 100644 index 0000000..c787103 --- /dev/null +++ b/lib/ultralib/src/audio/synsetfxmix.c @@ -0,0 +1,60 @@ +/*==================================================================== + * synsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetFXMix(ALSynth *synth, ALVoice *v, u8 fxmix) +{ + ALParam *update; + ALFilter *f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and fxmix data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_FXAMT; +#if BUILD_VERSION >= VERSION_J + if (fxmix > 127) { + fxmix = 127; + } + 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; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} + diff --git a/lib/ultralib/src/audio/synsetfxparam.c b/lib/ultralib/src/audio/synsetfxparam.c new file mode 100644 index 0000000..b3991f6 --- /dev/null +++ b/lib/ultralib/src/audio/synsetfxparam.c @@ -0,0 +1,29 @@ +/*==================================================================== + * synsetfxparam.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +void alSynSetFXParam(ALSynth *synth, ALFxRef fx, s16 paramID, void *param) +{ + ALFx *f = (ALFx *)fx; + + (*f->paramHdl)(f, (s32)paramID, param); +} + diff --git a/lib/ultralib/src/audio/synsetpan.c b/lib/ultralib/src/audio/synsetpan.c new file mode 100644 index 0000000..0d68538 --- /dev/null +++ b/lib/ultralib/src/audio/synsetpan.c @@ -0,0 +1,50 @@ +/*==================================================================== + * synsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetPan(ALSynth *synth, ALVoice *v, u8 pan) +{ + ALParam *update; + ALFilter *f; + + if (v->pvoice) { + + /* + * get new update struct from the free list + */ + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and pan data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_PAN; + update->data.i = pan; + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} + diff --git a/lib/ultralib/src/audio/synsetpitch.c b/lib/ultralib/src/audio/synsetpitch.c new file mode 100644 index 0000000..0bfb7ba --- /dev/null +++ b/lib/ultralib/src/audio/synsetpitch.c @@ -0,0 +1,50 @@ +/*==================================================================== + * synsetpitch.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetPitch(ALSynth *synth, ALVoice *v, f32 pitch) +{ + ALParam *update; + ALFilter *f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and pitch data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_PITCH; + update->data.f = pitch; + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} + diff --git a/lib/ultralib/src/audio/synsetpriority.c b/lib/ultralib/src/audio/synsetpriority.c new file mode 100644 index 0000000..c680bcc --- /dev/null +++ b/lib/ultralib/src/audio/synsetpriority.c @@ -0,0 +1,27 @@ +/*==================================================================== + * synsetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSynSetPriority(ALSynth *s, ALVoice *voice, s16 priority) +{ + voice->priority = priority; +} + diff --git a/lib/ultralib/src/audio/synsetvol.c b/lib/ultralib/src/audio/synsetvol.c new file mode 100644 index 0000000..181c96f --- /dev/null +++ b/lib/ultralib/src/audio/synsetvol.c @@ -0,0 +1,50 @@ +/*==================================================================== + * synsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetVol(ALSynth *synth, ALVoice *v, s16 volume, ALMicroTime t) +{ + ALParam *update; + ALFilter *f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and volume data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_VOLUME; + update->data.i = volume; + update->moredata.i = _timeToSamples(synth, t); + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} + diff --git a/lib/ultralib/src/audio/synstartvoice.c b/lib/ultralib/src/audio/synstartvoice.c new file mode 100644 index 0000000..9ad1d89 --- /dev/null +++ b/lib/ultralib/src/audio/synstartvoice.c @@ -0,0 +1,48 @@ +/*==================================================================== + * synstartvoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynStartVoice(ALSynth *synth, ALVoice *v, ALWaveTable *table) +{ + ALStartParam *update; + ALFilter *f; + + if (v->pvoice) { + + update = (ALStartParam *)__allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * send the start message to the motion control filter + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_START_VOICE; + update->wave = table; + update->next = 0; + update->unity = v->unityPitch; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} + diff --git a/lib/ultralib/src/audio/synstartvoiceparam.c b/lib/ultralib/src/audio/synstartvoiceparam.c new file mode 100644 index 0000000..8d1a54b --- /dev/null +++ b/lib/ultralib/src/audio/synstartvoiceparam.c @@ -0,0 +1,75 @@ +/*==================================================================== + * synquickstartvoice + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include +#include + +#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) +{ + ALStartParamAlt *update; + ALFilter *f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + update = (ALStartParamAlt *)__allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + +#if BUILD_VERSION >= VERSION_J + if (fxmix > 127) { + fxmix = 127; + } +#else + if (fxmix < 0) { // Not possible + fxmix = -fxmix; + } +#endif + + /* + * set offset and fxmix data + */ + update->delta = s->paramSamples + v->pvoice->offset; + update->next = 0; + update->type = AL_FILTER_START_VOICE_ALT; + + update->unity = v->unityPitch; + update->pan = pan; + update->volume = vol; + update->fxMix = fxmix; + update->pitch = pitch; + update->samples = _timeToSamples(s, t); + update->wave = w; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } + +} + + diff --git a/lib/ultralib/src/audio/synstopvoice.c b/lib/ultralib/src/audio/synstopvoice.c new file mode 100644 index 0000000..69c09d8 --- /dev/null +++ b/lib/ultralib/src/audio/synstopvoice.c @@ -0,0 +1,44 @@ +/*==================================================================== + * synstopvoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + + +void alSynStopVoice(ALSynth *synth, ALVoice *v) +{ + ALParam *update; + ALFilter *f; + + if (v->pvoice) { + + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_STOP_VOICE; + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} + diff --git a/lib/ultralib/src/audio/synthInternals.h b/lib/ultralib/src/audio/synthInternals.h new file mode 100644 index 0000000..871d71c --- /dev/null +++ b/lib/ultralib/src/audio/synthInternals.h @@ -0,0 +1,344 @@ +/*==================================================================== + * audioInternals.h + * + * Synopsis: + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#ifndef __audioInternals__ +#define __audioInternals__ + +#include +#include + +/* + * filter message ids + */ +enum { + AL_FILTER_FREE_VOICE, + AL_FILTER_SET_SOURCE, + AL_FILTER_ADD_SOURCE, + AL_FILTER_ADD_UPDATE, + AL_FILTER_RESET, + AL_FILTER_SET_WAVETABLE, +/* AL_FILTER_SET_DMA_PROC,*/ +/* AL_FILTER_SKIP_LOOP,*/ + AL_FILTER_SET_DRAM, + AL_FILTER_SET_PITCH, + AL_FILTER_SET_UNITY_PITCH, + AL_FILTER_START, +/* AL_FILTER_SET_DECAY,*/ +/* AL_FILTER_SET_FC,*/ + AL_FILTER_SET_STATE, + AL_FILTER_SET_VOLUME, + AL_FILTER_SET_PAN, + AL_FILTER_START_VOICE_ALT, + AL_FILTER_START_VOICE, + AL_FILTER_STOP_VOICE, + AL_FILTER_SET_FXAMT +}; + +#define AL_MAX_RSP_SAMPLES 160 + +/* + * buffer locations based on AL_MAX_RSP_SAMPLES + */ +#define AL_DECODER_IN 0 +#define AL_RESAMPLER_OUT 0 +#define AL_TEMP_0 0 +#define AL_DECODER_OUT 320 +#define AL_TEMP_1 320 +#define AL_TEMP_2 640 +#define AL_MAIN_L_OUT 1088 +#define AL_MAIN_R_OUT 1408 +#define AL_AUX_L_OUT 1728 +#define AL_AUX_R_OUT 2048 + +/* + * filter types + */ +enum { + AL_ADPCM, + AL_RESAMPLE, + AL_BUFFER, + AL_SAVE, + AL_ENVMIX, + AL_FX, + AL_AUXBUS, + AL_MAINBUS +}; + +typedef struct ALParam_s { + struct ALParam_s *next; + s32 delta; + s16 type; + union { + f32 f; + s32 i; + } data; + union { + f32 f; + s32 i; + } moredata; + union { + f32 f; + s32 i; + } stillmoredata; + union { + f32 f; + s32 i; + } yetstillmoredata; +} ALParam; + +typedef struct { + struct ALParam_s *next; + s32 delta; + s16 type; + s16 unity; /* disable resampler */ + f32 pitch; + s16 volume; + ALPan pan; + u8 fxMix; + s32 samples; + struct ALWaveTable_s *wave; +} ALStartParamAlt; + +typedef struct { + struct ALParam_s *next; + s32 delta; + s16 type; + s16 unity; /* disable resampler */ + struct ALWaveTable_s *wave; +} ALStartParam; + +typedef struct { + struct ALParam_s *next; + s32 delta; + s16 type; + struct PVoice_s *pvoice; +} ALFreeParam; + +typedef Acmd *(*ALCmdHandler)(void *, s16 *, s32, s32, Acmd *); +typedef s32 (*ALSetParam)(void *, s32, void *); + +typedef struct ALFilter_s { + struct ALFilter_s *source; + ALCmdHandler handler; + ALSetParam setParam; + s16 inp; + s16 outp; + s32 type; +} ALFilter; + +void alFilterNew(ALFilter *f, ALCmdHandler h, ALSetParam s, s32 type); + +#define AL_MAX_ADPCM_STATES 3 /* Depends on number of subframes + * per frame and loop length + */ +typedef struct { + ALFilter filter; + ADPCM_STATE *state; + ADPCM_STATE *lstate; + ALRawLoop loop; + struct ALWaveTable_s *table; + s32 bookSize; + ALDMAproc dma; + void *dmaState; + s32 sample; + s32 lastsam; + s32 first; + s32 memin; +} ALLoadFilter; + +void alLoadNew(ALLoadFilter *f, ALDMANew dma, ALHeap *hp); +Acmd *alAdpcmPull(void *f, s16 *outp, s32 byteCount, s32 sampleOffset, Acmd *p); +Acmd *alRaw16Pull(void *f, s16 *outp, s32 byteCount, s32 sampleOffset, Acmd *p); +s32 alLoadParam(void *filter, s32 paramID, void *param); + +typedef struct ALResampler_s { + ALFilter filter; + RESAMPLE_STATE *state; + f32 ratio; + s32 upitch; + f32 delta; + s32 first; + ALParam *ctrlList; + ALParam *ctrlTail; + s32 motion; +} ALResampler; + +typedef struct { + s16 fc; + s16 fgain; + union { + s16 fccoef[16]; + s64 force_aligned; + } fcvec; + POLEF_STATE *fstate; + s32 first; +} ALLowPass; + +typedef struct { + u32 input; + u32 output; + s16 ffcoef; + s16 fbcoef; + s16 gain; + f32 rsinc; + f32 rsval; + s32 rsdelta; + f32 rsgain; + ALLowPass *lp; + ALResampler *rs; +} ALDelay; + +typedef s32 (*ALSetFXParam)(void *, s32, void *); +typedef struct { + struct ALFilter_s filter; + s16 *base; + s16 *input; + u32 length; + ALDelay *delay; + u8 section_count; + ALSetFXParam paramHdl; +} ALFx; + +void alFxNew(ALFx *r, ALSynConfig *c, ALHeap *hp); +Acmd *alFxPull(void *f, s16 *outp, s32 out, s32 sampleOffset, Acmd *p); +s32 alFxParam(void *filter, s32 paramID, void *param); +s32 alFxParamHdl(void *filter, s32 paramID, void *param); + +#define AL_MAX_MAIN_BUS_SOURCES 1 +typedef struct ALMainBus_s { + ALFilter filter; + s32 sourceCount; + s32 maxSources; + ALFilter **sources; +} ALMainBus; + +void alMainBusNew(ALMainBus *m, void *ptr, s32 len); +Acmd *alMainBusPull(void *f, s16 *outp, s32 outCount, s32 sampleOffset, Acmd *p); +s32 alMainBusParam(void *filter, s32 paramID, void *param); + +#define AL_MAX_AUX_BUS_SOURCES 8 +#define AL_MAX_AUX_BUS_FX 1 +typedef struct ALAuxBus_s { + ALFilter filter; + s32 sourceCount; + s32 maxSources; + ALFilter **sources; + ALFx fx[AL_MAX_AUX_BUS_FX]; +} ALAuxBus; + +void alAuxBusNew(ALAuxBus *m, void *ptr, s32 len); +Acmd *alAuxBusPull(void *f, s16 *outp, s32 outCount, s32 sampleOffset, Acmd *p); +s32 alAuxBusParam(void *filter, s32 paramID, void *param); + +void alResampleNew(ALResampler *r, ALHeap *hp); +Acmd *alResamplePull(void *f, s16 *outp, s32 out, s32 sampleOffset, Acmd *p); +s32 alResampleParam(void *f, s32 paramID, void *param); + +typedef struct ALSave_s { + ALFilter filter; + s32 dramout; + s32 first; +} ALSave; + +void alSaveNew(ALSave *r); +Acmd *alSavePull(void *f, s16 *outp, s32 outCount, s32 sampleOffset, Acmd *p); +s32 alSaveParam(void *f, s32 paramID, void *param); + +typedef struct ALEnvMixer_s { + ALFilter filter; + ENVMIX_STATE *state; + s16 pan; + s16 volume; + s16 cvolL; + s16 cvolR; + s16 dryamt; + s16 wetamt; + u16 lratl; + s16 lratm; + s16 ltgt; + u16 rratl; + s16 rratm; + s16 rtgt; + s32 delta; + s32 segEnd; + s32 first; + ALParam *ctrlList; + ALParam *ctrlTail; + ALFilter **sources; + s32 motion; +} ALEnvMixer; + +void alEnvmixerNew(ALEnvMixer *e, ALHeap *hp); +Acmd *alEnvmixerPull(void *f, s16 *outp, s32 out, s32 sampleOffset, Acmd *p); +s32 alEnvmixerParam(void *filter, s32 paramID, void *param); + + +/* + * heap stuff + */ +typedef struct { + s32 magic; /* check structure integrety */ + s32 size; /* size of this allocated block */ + u8 *file; /* file that this alloc was called from */ + s32 line; /* line that it was called from */ + s32 count; /* heap call number */ + s32 pad0; + s32 pad1; + s32 pad2; /* Make it 32 bytes */ +} HeapInfo; + +#define AL_CACHE_ALIGN 15 + +/* + * synth stuff + */ + +typedef struct PVoice_s { + ALLink node; + struct ALVoice_s *vvoice; + ALFilter *channelKnob; + ALLoadFilter decoder; + ALResampler resampler; + ALEnvMixer envmixer; + s32 offset; +} PVoice; + +/* + * prototypes for private driver functions + */ +ALParam *__allocParam(void); +void __freeParam(ALParam *param); +void _freePVoice(ALSynth *drvr, PVoice *pvoice); +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_I_P +#define _init_lpfilter init_lpfilter +#endif + +void _init_lpfilter(ALLowPass *lp); + +#endif + diff --git a/src/libultra/al/synthesizer.c b/lib/ultralib/src/audio/synthesizer.c similarity index 98% rename from src/libultra/al/synthesizer.c rename to lib/ultralib/src/audio/synthesizer.c index d42a21a..9123874 100644 --- a/src/libultra/al/synthesizer.c +++ b/lib/ultralib/src/audio/synthesizer.c @@ -3,12 +3,10 @@ * * Copyright 1993, Silicon Graphics, Inc. * All Rights Reserved. - * * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, * Inc.; the contents of this file may not be disclosed to third * parties, copied or duplicated in any form, in whole or in part, * without the prior written permission of Silicon Graphics, Inc. - * * RESTRICTED RIGHTS LEGEND: * Use, duplication or disclosure by the Government is subject to * restrictions as set forth in subdivision (c)(1)(ii) of the Rights @@ -17,10 +15,9 @@ * DOD or NASA FAR Supplement. Unpublished - rights reserved under the * Copyright Laws of the United States. *====================================================================*/ - #include "synthInternals.h" #include - +#include // TODO: this comes from a header #ident "$Revision: 1.17 $" @@ -284,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 @@ -306,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 new file mode 100644 index 0000000..ab7e313 --- /dev/null +++ b/lib/ultralib/src/debug/assert.c @@ -0,0 +1,12 @@ +#include "os.h" +#include "../os/osint.h" +#include "osint_debug.h" + +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 new file mode 100644 index 0000000..69de71d --- /dev/null +++ b/lib/ultralib/src/debug/assertbreak.s @@ -0,0 +1,14 @@ +#include "PR/os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder + +LEAF(__assertBreak) + break 0 + j ra +END(__assertBreak) + +#endif diff --git a/lib/ultralib/src/debug/atomic.c b/lib/ultralib/src/debug/atomic.c new file mode 100644 index 0000000..a0bd8fe --- /dev/null +++ b/lib/ultralib/src/debug/atomic.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" + +int __osAtomicDec(unsigned int* p) { + u32 mask; + int result; + + mask = __osDisableInt(); + if (*p) { + (*p)--; + result = 1; + } else { + result = 0; + } + __osRestoreInt(mask); + return result; +} diff --git a/lib/ultralib/src/debug/kdebugserver.c b/lib/ultralib/src/debug/kdebugserver.c new file mode 100644 index 0000000..948a460 --- /dev/null +++ b/lib/ultralib/src/debug/kdebugserver.c @@ -0,0 +1,96 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/rdb.h" + +// not included in final rom, but __osThreadSave is here for some reason +OSThread __osThreadSave; + +extern OSThread *__osRunningThread; +extern u32 __osRdb_IP6_Empty; + +#ifndef _FINALROM + +static u8 buffer[12]; +static u32 numChars = 0; + +static u32 string_to_u32(u8* s) { + u32 k; + + k = ((s[0] & 0xFF) << 0x18); + k |= ((s[1] & 0xFF) << 0x10); + k |= ((s[2] & 0xFF) << 0x8); + k |= (s[3] & 0xFF); + + return k; +} + +static void send_packet(u8* s, u32 n) { + rdbPacket packet; + u32 i; + + packet.type = 0xC; + packet.length = n; + + for (i = 0; i < n; i++) { + packet.buf[i] = s[i]; + } + *(vu32*)RDB_BASE_REG = *(u32*)&packet; +} + +static void clear_IP6(void) { + while (!(__osGetCause() & CAUSE_IP6)) { + ; + } + *(vu32*)RDB_READ_INTR_REG = 0; + + while (__osGetCause() & CAUSE_IP6) { + ; + } +} + +static void send(u8* s, u32 n) { + u32 ct; + u32 i = 0; + u32 getLastIP6; + + if (!__osRdb_IP6_Empty) { + clear_IP6(); + getLastIP6 = FALSE; + } else { + getLastIP6 = TRUE; + } + while (n != 0) { + ct = (n < 3) ? n : 3; + send_packet(s + i, ct); + n -= ct; + i += ct; + if (n != 0) { + clear_IP6(); + } + } + if (getLastIP6) { + clear_IP6(); + } +} + +void kdebugserver(rdbPacket packet) { + u32 i; + u32 length; + u8* addr; + + for (i = 0; i < 3; i++) { + buffer[numChars++] = packet.buf[i]; + } + + if (buffer[0] == 2) { + send((char*)&__osRunningThread->context, sizeof(__OSThreadContext)); + numChars = 0; + } else if (numChars >= 9 && buffer[0] == 1) { + addr = string_to_u32(&buffer[1]); + length = string_to_u32(&buffer[5]); + send(addr, length); + numChars = 0; + } +} + +#endif diff --git a/lib/ultralib/src/debug/osint_debug.h b/lib/ultralib/src/debug/osint_debug.h new file mode 100644 index 0000000..6d644f2 --- /dev/null +++ b/lib/ultralib/src/debug/osint_debug.h @@ -0,0 +1,11 @@ +#include "PR/os_internal.h" + +extern s32 __osThprofFlag; +extern void (*__osThprofFunc)(OSThread*); +extern u32 __osThprofLastTimer; +extern u32 __osThprofCount; +extern __OSThreadprofile_s thprof[]; +extern u64 __osThprofHeap[]; +extern void* __osThprofStack; + +void osThreadProfileCallback(OSThread*); diff --git a/lib/ultralib/src/debug/profile.c b/lib/ultralib/src/debug/profile.c new file mode 100644 index 0000000..47b19d8 --- /dev/null +++ b/lib/ultralib/src/debug/profile.c @@ -0,0 +1,176 @@ +#include "PR/rdb.h" +#include "PR/ultratypes.h" +#include "PR/os.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PR/sptask.h" +#include "../os/osint.h" +#include "macros.h" +#include "osint_debug.h" + +#ifndef _FINALROM + +OSTimer __osProfTimer; +OSMesg __osProfTimerMsg; + +OSMesgQueue __osProfFlushMQ ALIGNED(8); +OSMesg __osProfFlushMesg; + +OSMesgQueue __osProfAckMQ ALIGNED(8); +OSMesg __osProfAckMesg; + +u32 __osProfTimerPeriod; + +u32 __osProfNumSections; + +static u32 __osProfileActive = FALSE; +static u32 __osProfileIOActive = FALSE; + +unsigned char __osProfileIOStack[2400] ALIGNED(16); + +static OSThread __osProfileIOThread; + +void osProfSendWord(u32 word); + +void __osProfileIO(void* arg) { + s32 totalBytes; + u32 bytesThisBlock; + u32 ct; + u8* sendPtr; + OSProf* t; + + while (TRUE) { + osRecvMesg(&__osProfFlushMQ, NULL, OS_MESG_BLOCK); + osProfSendWord(__osProfNumSections); + osProfSendWord(__osProfTimerPeriod); + osProfSendWord(__osProfileOverflowBin); + + for (t = __osProfileList; t < __osProfileListEnd; t++) { + osProfSendWord(t->text_start); + osProfSendWord(t->histo_size); + osRecvMesg(&__osProfAckMQ, NULL, OS_MESG_BLOCK); + + totalBytes = t->histo_size * 2; + sendPtr = t->histo_base; + while (totalBytes > 0) { + bytesThisBlock = (totalBytes < 0x800U) ? totalBytes : 0x800U; + + ct = 0; + while (ct < bytesThisBlock) { + ct += __osRdbSend(sendPtr + ct, bytesThisBlock - ct, RDB_TYPE_GtoH_PROF_DATA); + } + + sendPtr += bytesThisBlock; + totalBytes -= bytesThisBlock; + osRecvMesg(&__osProfAckMQ, NULL, OS_MESG_BLOCK); + } + } + } +} + +void osProfSendWord(u32 word) { + u32 ct = 0; + u8* sendPtr = &word; + + while (ct < sizeof(word)) { + ct += __osRdbSend(sendPtr + ct, sizeof(word) - ct, RDB_TYPE_GtoH_PROF_DATA); + } +} + +void osProfileFlush(void) { + osSendMesg(&__osProfFlushMQ, NULL, OS_MESG_BLOCK); +} + +void osProfileInit(OSProf* profp, u32 profcnt) { + u32 i; + OSProf* t; + +#if !defined(NDEBUG) && BUILD_VERSION >= VERSION_K + if (__osProfileActive) { + __osError(ERR_OSPROFILEINIT_STR, 0); + return; + } + + if (profcnt == 0) { + __osError(ERR_OSPROFILEINIT_CNT, 1, profcnt); + return; + } +#endif + + for (t = profp; t < profp + profcnt; t++) { +#ifndef NDEBUG + if ((u32)t->histo_base & 1) { + __osError(ERR_OSPROFILEINIT_ALN, 1, t->histo_base); + return; + } + + if (t->text_start >= t->text_end) { + __osError(ERR_OSPROFILEINIT_ORD, 2, t->text_start, t->text_end); + return; + } + + if (((u32)(t->text_end - t->text_start) / 4) > t->histo_size) { + __osError(ERR_OSPROFILEINIT_SIZ, 1, t->histo_size); + return; + } +#endif + + for (i = 0; i < t->histo_size; i++) { + t->histo_base[i] = 0; + } + } + + __osProfileActive = FALSE; + __osProfileOverflowBin = 0; + __osProfileList = profp; + __osProfileListEnd = profp + profcnt; + __osProfNumSections = profcnt; + if (!__osProfileIOActive) { + osCreateMesgQueue(&__osProfFlushMQ, &__osProfFlushMesg, 1); + osSetEventMesg(OS_EVENT_RDB_FLUSH_PROF, &__osProfFlushMQ, 0); + osCreateMesgQueue(&__osProfAckMQ, &__osProfAckMesg, 1); + osSetEventMesg(OS_EVENT_RDB_ACK_PROF, &__osProfAckMQ, 0); + osCreateThread(&__osProfileIOThread, 0, __osProfileIO, NULL, &__osProfileIOStack[2400], 0x81); + osStartThread(&__osProfileIOThread); + __osProfileIOActive = TRUE; + } +} + +void osProfileStart(u32 microseconds) { +#ifndef NDEBUG + if (microseconds < 50) { + __osError(ERR_OSPROFILESTART_TIME, 1, microseconds); + return; + } + + if (__osProfileActive) { + __osError(ERR_OSPROFILESTART_FLAG, 0); + return; + } +#endif + + osCreateMesgQueue(&__osProfTimerQ, &__osProfTimerMsg, 1); + osSetTimer(&__osProfTimer, 0, OS_USEC_TO_CYCLES(microseconds), &__osProfTimerQ, NULL); + __osProfTimerPeriod = microseconds; + __osProfileActive = TRUE; +} + +void osProfileStop(void) { +#ifndef NDEBUG + if (!__osProfileActive) { + __osError(ERR_OSPROFILESTOP_FLAG, 0); + return; + } +#endif + + if (osStopTimer(&__osProfTimer) < 0) { +#ifndef NDEBUG + __osError(ERR_OSPROFILESTOP_TIMER, 0); + return; +#endif + } + + __osProfileActive = FALSE; +} + +#endif diff --git a/lib/ultralib/src/debug/threadprofile.c b/lib/ultralib/src/debug/threadprofile.c new file mode 100644 index 0000000..e383773 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofile.c @@ -0,0 +1,22 @@ +#include "osint_debug.h" + +#include "macros.h" + +s32 __osThprofFlag = 0; +void (*__osThprofFunc)(OSThread*) = NULL; + +u32 __osThprofLastTimer; +u32 __osThprofCount; +__OSThreadprofile_s thprof[THPROF_IDMAX] ALIGNED(0x10); +u64 __osThprofHeap[THPROF_STACKSIZE] ALIGNED(0x10); +void* __osThprofStack; + +void osThreadProfileCallback(OSThread* osthread) { + register u32 now_time = osGetCount(); + __OSThreadprofile_s* thprof = osthread->thprof; + + thprof->time += now_time - __osThprofLastTimer; + thprof->count++; + __osThprofCount++; + __osThprofLastTimer = now_time; +} diff --git a/lib/ultralib/src/debug/threadprofileclear.c b/lib/ultralib/src/debug/threadprofileclear.c new file mode 100644 index 0000000..42788f8 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofileclear.c @@ -0,0 +1,11 @@ +#include "osint_debug.h" + +void osThreadProfileClear(OSId id) { + register OSIntMask saveMask = __osDisableInt(); + + thprof[id].flag = 0; + thprof[id].count = 0; + thprof[id].time = 0; + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/debug/threadprofileinit.c b/lib/ultralib/src/debug/threadprofileinit.c new file mode 100644 index 0000000..7fef229 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofileinit.c @@ -0,0 +1,16 @@ +#include "osint_debug.h" + +void osThreadProfileInit(void) { + register u32 saveMask = __osDisableInt(); + OSId i; + + __osThprofFunc = NULL; + __osThprofFlag = 1; + __osThprofCount = 0; + __osThprofStack = &__osThprofHeap[(THPROF_STACKSIZE - 8) / sizeof(*__osThprofHeap)]; + __osRestoreInt(saveMask); + + for (i = 0; i < THPROF_IDMAX; i++) { + osThreadProfileClear(i); + } +} diff --git a/lib/ultralib/src/debug/threadprofilereadcount.c b/lib/ultralib/src/debug/threadprofilereadcount.c new file mode 100644 index 0000000..3237987 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofilereadcount.c @@ -0,0 +1,39 @@ +#include "osint_debug.h" + +u32 osThreadProfileReadCount(OSId id) { +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(139, 0); + return 0; + } +#endif + + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(143, 1, id); +#endif + return 0; + } + return thprof[id].count; +} + +u32 osThreadProfileReadCountTh(OSThread* thread) { + OSId id; + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(141, 0); + return 0; + } +#endif + + id = osGetThreadId(thread); + + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(145, 1, id); +#endif + return 0; + } + return thprof[id].count; +} diff --git a/lib/ultralib/src/debug/threadprofilereadtime.c b/lib/ultralib/src/debug/threadprofilereadtime.c new file mode 100644 index 0000000..9930cac --- /dev/null +++ b/lib/ultralib/src/debug/threadprofilereadtime.c @@ -0,0 +1,51 @@ +#include "osint_debug.h" + +OSTime osThreadProfileReadTime(OSId id) { + OSTime adjust = 0; + u32 now_time = osGetCount(); + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(140, 0); + return 0; + } +#endif + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(144, 1, id); +#endif + return 0; + } + + if (id == osGetThreadId(NULL) && __osThprofFunc != NULL) { + adjust = now_time - __osThprofLastTimer; + } + return thprof[id].time + adjust; +} + +OSTime osThreadProfileReadTimeTh(OSThread* thread) { + OSId id; + OSTime adjust = 0; + u32 now_time = osGetCount(); + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(142, 0); + return 0; + } +#endif + + id = osGetThreadId(thread); + + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(146, 1, id); +#endif + return 0; + } + + if (id == osGetThreadId(NULL) && __osThprofFunc != NULL) { + adjust = now_time - __osThprofLastTimer; + } + return thprof[id].time + adjust; +} diff --git a/lib/ultralib/src/debug/threadprofilestart.c b/lib/ultralib/src/debug/threadprofilestart.c new file mode 100644 index 0000000..3ef8fa7 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofilestart.c @@ -0,0 +1,22 @@ +#include "osint_debug.h" + +void osThreadProfileStart(void) { + register u32 saveMask; + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(136, 0); + return; + } + if (__osThprofFunc != NULL) { + __osError(137, 0); + return; + } +#endif + + saveMask = __osDisableInt(); + + __osThprofLastTimer = osGetCount(); + __osThprofFunc = osThreadProfileCallback; + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/debug/threadprofilestop.c b/lib/ultralib/src/debug/threadprofilestop.c new file mode 100644 index 0000000..4803620 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofilestop.c @@ -0,0 +1,47 @@ +#include "osint_debug.h" + +void osThreadProfileStop(void) { + register u32 saveMask; + int i; + OSId id; + u32 now_time = osGetCount(); + + saveMask = __osDisableInt(); + +#ifndef NDEBUG + if (__osThprofFlag == 0) { +#if BUILD_VERSION >= VERSION_L + __osRestoreInt(saveMask); + __osError(138, 0); +#else + __osError(138, 0); + __osRestoreInt(saveMask); +#endif + return; + } +#endif + + if (__osThprofFunc != NULL) { + id = osGetThreadId(0); + + if (id < THPROF_IDMAX) { + 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; + + for (i = 0; i < THPROF_IDMAX; i++) { + thprof[i].flag = 0; + } + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/error/commonerror.c b/lib/ultralib/src/error/commonerror.c new file mode 100644 index 0000000..5a6f1c9 --- /dev/null +++ b/lib/ultralib/src/error/commonerror.c @@ -0,0 +1,193 @@ +#include "PR/os.h" +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "macros.h" +#include "stdarg.h" + +#ifndef _FINALROM + +void __osSyncVPrintf(const char* fmt, va_list args); + +static u32 errorLogData[19] ALIGNED(8); +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; + +char NULSTR[] = { '\0' }; + +const char* __os_error_message[] = { + NULSTR, + "osCreateThread: stack pointer not aligned to 8 bytes (0x%x)", + "osCreateThread: priority not in range [0-255] (%d)", + "osStartThread: thread has bad state (running/runnable/other)", + "osSetThreadPri: priority not in range [0-255] (%d)", + "osCreateMesgQueue: message count not > 0 (%d)", + "osSendMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osJamMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osRecvMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osSetEventMesg: unknown event type (%d)", + "osMapTLB: index not in range [0-30] (%d)", + "osMapTLB: asid argument not -1 or in range [0-255] (%d)", + "osUnmapTLB: index not in range [0-30] (%d)", + "osSetTLBASID: asid not in range [0-255] (%d)", + "osAiSetFrequency: freq not in range [%d-%d] (%d)", + "osAiSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osAiSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osPiRawReadIo: address not aligned to 4 bytes (0x%x)", + "osPiRawWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiRawStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiRawStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiRawStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiRawStartDma: size not aligned to 2 bytes (%d)", + "osPiRawStartDma: size not in range [0,16777216] (%d)", + "osPiReadIo: address not aligned to 4 bytes (0x%x)", + "osPiWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiStartDma: PI Manager not yet begun by osCreatePiManager", + "osPiStartDma: priority not OS_MESG_PRI_[NORMAL|HIGH] (%d)", + "osPiStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiStartDma: size not aligned to 2 bytes (%d)", + "osPiStartDma: size not in range [0,16777216] (%d)", + "osCreatePiManager: priority not in range [0-255] (%d)", + "osViGetCurrentMode: VI Manager not yet begun", + "osViGetCurrentFramebuffer: VI Manager not yet begun", + "osViGetNextFramebuffer: VI Manager not yet begun", + "osViSetXScale: value not in range [0.25,1.0] (%f)", + "osViSetXScale: VI Manager not yet begun by osCreateViManager", + "osViSetYScale: value not in range [0.05,1.0] (%f)", + "osViSetYScale: VI Manager not yet begun by osCreateViManager", + "osViSetSpecialFeatures: not a known feature value (%d)", + "osViSetSpecialFeatures: VI Manager not yet begun", + "osViSetMode: VI Manager not yet begun by osCreateViManager", + "osViSetEvent: VI Manager not yet begun by osCreateViManager", + "osViSwapBuffer: frame buffer not aligned to 64 bytes (0x%x)", + "osViSwapBuffer: VI Manager not yet begun", + "osCreateViManager: priority not in range [0-255] (%d)", + "osCreateRegion: not a known alignment (%d)", + "osCreateRegion: length (%d) too small for buffer size (%d)", + "osMalloc: invalid or corrupt region (0x%x)", + "osFree: invalid or corrupt region (0x%x)", + "osFree: invalid address (0x%x) or\n corrupt region (0x%x)", + "osGetRegionBufCount: invalid or corrupt region (0x%x)", + "osGetRegionBufSize: invalid or corrupt region (0x%x)", + "osSpTaskLoad: dram_stack not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff_size not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: yield_data_ptr not aligned to 16 bytes (0x%x)", + "osProfileInit: profile counter is running, call osProfileStop before init", + "osProfileInit: profcnt is %d", + "osProfileInit: histo_base pointer must be 32-bit aligned (%x)", + "osProfileInit: text_start (%x) >= text_end (%x)", + "osProfileInit: histo_size is an illegal size (%d)", + "osProfileStart: microseconds is < PROF_MIN_INTERVAL (%d)", + "osProfileStart: profiling has already been started", + "osProfileStop: profiling has already been stopped", + "osProfileStop: no profile timer to stop", + "osReadHost: address not aligned to 8 bytes (0x%x)", + "osReadHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osWriteHost: address not aligned to 8 bytes (0x%x)", + "osWriteHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osGetTime: VI manager not yet begun by osCreateViManager", + "osSetTime: VI manager not yet begun by osCreateViManager", + "osSetTimer: VI manager not yet begun by osCreateViManager", + "osStopTimer: VI manager not yet begun by osCreateViManager", + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + "_handleMIDIMsg: no sound mapped", + "_handleMIDIMsg: no free voices", + "_handleMIDIMsg: couldn't map voice", + "_handleMIDIMsg: note off - couldn't find voice", + "_handleMIDIMsg: poly pressure - couldn't find voice", + "_handleEvent: no free voices", + "Synthesizer: no free updates", + "alSndPDeallocate: attempt to deallocate a sound which is playing", + "alSndpDelete: attempt to delete player with playing sounds", + "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)", + "alBnkfNew: bank file out of date", + "alSeqNew: 0x%x is not a midi file", + "alSeqNew: 0x%x is not a type 0 midi file", + "alSeqNew: 0x%x has more than 1 track", + "alSeqNew: SMPTE delta times not supported", + "alSeqNew: Error parsing file 0x%x (no track header)", + "alSeqNextEvent: Unsupported system exclusive", + "alSeqNextEvent: Unsupported midi meta event 0x%x", + "_handleMIDIMsg: Invalid program change to %d, max instruments %d", + "_handleMIDIMsg: Unknown midi message 0x%x", + "_unmapVoice: Couldn't unmap voice 0x%x", + "alEvtqPostEvent: Out of free events", + "alHeapAlloc: Can't allocate %d bytes", + "alHeapCheck: Heap corrupt", + "alHeapCheck: Heap corrupt - first block is bad", + "alCSeqGetTrackEvent: Running status of zero on track %d", + "alCSeqGetTrackEvent: Note on velocity of zero on track %d", + "alCSPVoiceHandler: Stopping sequence but voice not free chan %d, key %d", + "alSeqNextEvent: Read past end of sequence", + "osAiSetNextBuffer: DMA buffer location may cause audio clicks (0x%x)", + "_loadOutputBuffer: Modulated delay greater than total delay by %d samples", + "osViExtendVStart: VI Manager not yet begun by osCreateViManager", + "osViExtendVStart: value not in range [0-48] %d", + "osThreadProfileStart: thread profiler is not initialized", + "osThreadProfileStart: profiling has already been started", + "osThreadProfileStop: thread profiler is not initialized", + "osThreadProfileReadCount: thread profiler is not initialized", + "osThreadProfileReadCountTh: thread profiler is not initialized", + "osThreadProfileReadTime: thread profiler is not initialized", + "osThreadProfileReadTimeTh: thread profiler is not initialized", + "osThreadProfileReadCount: thread ID is too large(%d)", + "osThreadProfileReadTime: thread ID is too large(%d)", + "osThreadProfileReadCountTh: thread ID is too large(%d)", + "osThreadProfileReadTimeTh: thread ID is too large(%d)", + "osThreadProfileStop: current thread ID is too large(%d)", + NULSTR, +}; + +void __commonErrorHandler(s16 code, s16 numArgs, ...) { + va_list argPtr; + const char* fmt; + + fmt = __os_error_message[code]; + va_start(argPtr, numArgs); + + osSyncPrintf("0x%08X (%04d):", osGetCount(), code); + __osSyncVPrintf(fmt, argPtr); + osSyncPrintf("\n"); + + va_end(argPtr); +} + +#endif 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 new file mode 100644 index 0000000..10f3561 --- /dev/null +++ b/lib/ultralib/src/error/errorasm.s @@ -0,0 +1,33 @@ +#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 +#endif +1: + j ra +END(__osError) + +#endif diff --git a/lib/ultralib/src/flash/flashallerase.c b/lib/ultralib/src/flash/flashallerase.c new file mode 100644 index 0000000..0e982a5 --- /dev/null +++ b/lib/ultralib/src/flash/flashallerase.c @@ -0,0 +1,33 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + + +s32 osFlashAllErase(void) { + u32 status; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + OSMesg dummy; + + // start chip erase operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); + + // wait for completion by polling erase-busy flag + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + do { + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(15000), 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + } while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY); + + // check erase operation status, clear status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + osFlashClearStatus(); + + // check for success + if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) { + return FLASH_STATUS_ERASE_OK; + } else { + return FLASH_STATUS_ERASE_ERROR; + } +} diff --git a/lib/ultralib/src/flash/flashallerasethrough.c b/lib/ultralib/src/flash/flashallerasethrough.c new file mode 100644 index 0000000..1c3c1dd --- /dev/null +++ b/lib/ultralib/src/flash/flashallerasethrough.c @@ -0,0 +1,8 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashAllEraseThrough(void) { + // start chip erase operation, no waiting for completion + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); +} diff --git a/lib/ultralib/src/flash/flashchange.c b/lib/ultralib/src/flash/flashchange.c new file mode 100644 index 0000000..d92ff7b --- /dev/null +++ b/lib/ultralib/src/flash/flashchange.c @@ -0,0 +1,8 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashChange(u32 flash_num) { + __osFlashHandler.baseAddress = PHYS_TO_K1((FLASH_START_ADDR + flash_num * FLASH_SIZE)); + __osFlashHandler.type = DEVICE_TYPE_FLASH + flash_num; + return; +} diff --git a/lib/ultralib/src/flash/flashcheckeraseend.c b/lib/ultralib/src/flash/flashcheckeraseend.c new file mode 100644 index 0000000..c87876b --- /dev/null +++ b/lib/ultralib/src/flash/flashcheckeraseend.c @@ -0,0 +1,23 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashCheckEraseEnd(void) { + u8 status; + + osFlashReadStatus(&status); + + if ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY) { + return FLASH_STATUS_ERASE_BUSY; + } else { + // not busy, read and clear status + osFlashReadStatus(&status); + } + osFlashClearStatus(); + + // check for success + if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) { + return FLASH_STATUS_ERASE_OK; + } else { + return FLASH_STATUS_ERASE_ERROR; + } +} diff --git a/lib/ultralib/src/flash/flashclearstatus.c b/lib/ultralib/src/flash/flashclearstatus.c new file mode 100644 index 0000000..86165d6 --- /dev/null +++ b/lib/ultralib/src/flash/flashclearstatus.c @@ -0,0 +1,10 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashClearStatus(void) { + // select status mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS); + // clear status + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress, 0); + return; +} diff --git a/lib/ultralib/src/flash/flashgetaddr.c b/lib/ultralib/src/flash/flashgetaddr.c new file mode 100644 index 0000000..a530947 --- /dev/null +++ b/lib/ultralib/src/flash/flashgetaddr.c @@ -0,0 +1,15 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +u32 __osFlashGetAddr(u32 page_num) { + u32 devAddr; + + if (__osFlashVersion == OLD_FLASH) { + // 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 * FLASH_BLOCK_SIZE; + } + + return devAddr; +} diff --git a/lib/ultralib/src/flash/flashinit.c b/lib/ultralib/src/flash/flashinit.c new file mode 100644 index 0000000..33c7dc3 --- /dev/null +++ b/lib/ultralib/src/flash/flashinit.c @@ -0,0 +1,44 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" +#include "macros.h" + +u32 __osFlashID[4] ALIGNED(8); +OSIoMesg __osFlashMsg ALIGNED(8); +OSMesgQueue __osFlashMessageQ ALIGNED(8); +OSPiHandle __osFlashHandler ALIGNED(8); +OSMesg __osFlashMsgBuf[1]; +s32 __osFlashVersion; + +OSPiHandle* osFlashInit(void) { + u32 flash_type; + u32 flash_maker; + + osCreateMesgQueue(&__osFlashMessageQ, __osFlashMsgBuf, ARRLEN(__osFlashMsgBuf)); + + if (__osFlashHandler.baseAddress == PHYS_TO_K1(FLASH_START_ADDR)) { + return &__osFlashHandler; + } + + __osFlashHandler.type = DEVICE_TYPE_FLASH; + __osFlashHandler.baseAddress = PHYS_TO_K1(FLASH_START_ADDR); + __osFlashHandler.latency = FLASH_LATENCY; + __osFlashHandler.pulse = FLASH_PULSE; + __osFlashHandler.pageSize = FLASH_PAGE_SIZE; + __osFlashHandler.relDuration = FLASH_REL_DURATION; + __osFlashHandler.domain = PI_DOMAIN2; + __osFlashHandler.speed = 0; + + bzero(&__osFlashHandler.transferInfo, sizeof(__OSTranxInfo)); + + osEPiLinkHandle(&__osFlashHandler); + osFlashReadId(&flash_type, &flash_maker); + + if (flash_maker == FLASH_VERSION_MX_C || flash_maker == FLASH_VERSION_MX_A || + flash_maker == FLASH_VERSION_MX_PROTO_A) { + __osFlashVersion = OLD_FLASH; + } else { + __osFlashVersion = NEW_FLASH; + } + + return &__osFlashHandler; +} diff --git a/lib/ultralib/src/flash/flashreadarray.c b/lib/ultralib/src/flash/flashreadarray.c new file mode 100644 index 0000000..543f236 --- /dev/null +++ b/lib/ultralib/src/flash/flashreadarray.c @@ -0,0 +1,51 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + + +s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 page_num, void* dramAddr, u32 n_pages, OSMesgQueue* mq) { + u32 ret; + u32 tmp; + u32 end_page; + u32 one_dma_pages; + + // select read array mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_READ_ARRAY); + // dummy read? + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &tmp); + + // DMA requested pages + mb->hdr.pri = priority; + mb->hdr.retQueue = mq; + mb->dramAddr = dramAddr; + + end_page = page_num + n_pages - 1; + + if ((end_page & 0xF00) != (page_num & 0xF00)) { + one_dma_pages = 256 - (page_num & 0xFF); + n_pages -= one_dma_pages; + mb->size = one_dma_pages * FLASH_BLOCK_SIZE; + mb->devAddr = __osFlashGetAddr(page_num); + osEPiStartDma(&__osFlashHandler, mb, OS_READ); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + page_num = (page_num + 256) & 0xF00; + mb->dramAddr = (u32)mb->dramAddr + mb->size; + } + + while (n_pages > 256) { + one_dma_pages = 256; + n_pages -= 256; + mb->size = one_dma_pages * FLASH_BLOCK_SIZE; + mb->devAddr = __osFlashGetAddr(page_num); + osEPiStartDma(&__osFlashHandler, mb, OS_READ); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + page_num += 256; + mb->dramAddr = (u32)mb->dramAddr + mb->size; + } + + mb->size = n_pages * FLASH_BLOCK_SIZE; + mb->devAddr = __osFlashGetAddr(page_num); + + ret = osEPiStartDma(&__osFlashHandler, mb, OS_READ); + + return ret; +} diff --git a/lib/ultralib/src/flash/flashreadid.c b/lib/ultralib/src/flash/flashreadid.c new file mode 100644 index 0000000..3112d74 --- /dev/null +++ b/lib/ultralib/src/flash/flashreadid.c @@ -0,0 +1,27 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashReadId(u32* flash_type, u32* flash_maker) { + u8 tmp; + + // why read status ? + osFlashReadStatus(&tmp); + + // select silicon id read mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_ID); + + // read silicon id using DMA + __osFlashMsg.hdr.pri = OS_MESG_PRI_NORMAL; + __osFlashMsg.hdr.retQueue = &__osFlashMessageQ; + __osFlashMsg.dramAddr = __osFlashID; + __osFlashMsg.devAddr = 0; + __osFlashMsg.size = 2 * sizeof(u32); + + osInvalDCache(__osFlashID, sizeof(__osFlashID)); + osEPiStartDma(&__osFlashHandler, &__osFlashMsg, OS_READ); + osRecvMesg(&__osFlashMessageQ, NULL, OS_MESG_BLOCK); + + *flash_type = __osFlashID[0]; + *flash_maker = __osFlashID[1]; + return; +} diff --git a/lib/ultralib/src/flash/flashreadstatus.c b/lib/ultralib/src/flash/flashreadstatus.c new file mode 100644 index 0000000..6ff5560 --- /dev/null +++ b/lib/ultralib/src/flash/flashreadstatus.c @@ -0,0 +1,17 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashReadStatus(u8* flash_status) { + u32 status; + + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS); + // read status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + + // why twice ? + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + + *flash_status = status & 0xFF; + return; +} diff --git a/lib/ultralib/src/flash/flashreinit.c b/lib/ultralib/src/flash/flashreinit.c new file mode 100644 index 0000000..b2ab93d --- /dev/null +++ b/lib/ultralib/src/flash/flashreinit.c @@ -0,0 +1,14 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 page_size, u8 rel_duration, u32 start) { + __osFlashHandler.baseAddress = PHYS_TO_K1(start); + __osFlashHandler.type++; + __osFlashHandler.latency = latency; + __osFlashHandler.pulse = pulse; + __osFlashHandler.pageSize = page_size; + __osFlashHandler.relDuration = rel_duration; + __osFlashHandler.domain = PI_DOMAIN2; + + return &__osFlashHandler; +} diff --git a/lib/ultralib/src/flash/flashsectorerase.c b/lib/ultralib/src/flash/flashsectorerase.c new file mode 100644 index 0000000..14a0583 --- /dev/null +++ b/lib/ultralib/src/flash/flashsectorerase.c @@ -0,0 +1,32 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashSectorErase(u32 page_num) { + u32 status; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + OSMesg dummy; + + // start sector erase operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_SECTOR_ERASE | page_num); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); + + // wait for completion by polling erase-busy flag + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + + do { + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(12500), 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + } while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY); + + // check erase operation status, clear status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + osFlashClearStatus(); + + if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) { + return FLASH_STATUS_ERASE_OK; + } else { + return FLASH_STATUS_ERASE_ERROR; + } +} diff --git a/lib/ultralib/src/flash/flashsectorerasethrough.c b/lib/ultralib/src/flash/flashsectorerasethrough.c new file mode 100644 index 0000000..474ee96 --- /dev/null +++ b/lib/ultralib/src/flash/flashsectorerasethrough.c @@ -0,0 +1,8 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashSectorEraseThrough(u32 page_num) { + // start sector erase operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_SECTOR_ERASE | page_num); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); +} diff --git a/lib/ultralib/src/flash/flashwritearray.c b/lib/ultralib/src/flash/flashwritearray.c new file mode 100644 index 0000000..d5f56a0 --- /dev/null +++ b/lib/ultralib/src/flash/flashwritearray.c @@ -0,0 +1,34 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashWriteArray(u32 page_num) { + u32 status; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + OSMesg dummy; + + if ((u32)__osFlashVersion == NEW_FLASH) { + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PAGE_PROGRAM); + } + + // start program page operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PROGRAM_PAGE | page_num); + + // wait for completion by polling write-busy flag + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + do { + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(200), 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + } while ((status & FLASH_STATUS_WRITE_BUSY) == FLASH_STATUS_WRITE_BUSY); + + // check program operation status, clear status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + osFlashClearStatus(); + + if (((status & 0xFF) == 4) || ((status & 0xFF) == 0x44) || ((status & 4) == 4)) { + return FLASH_STATUS_WRITE_OK; + } else { + return FLASH_STATUS_WRITE_ERROR; + } +} diff --git a/lib/ultralib/src/flash/flashwritebuffer.c b/lib/ultralib/src/flash/flashwritebuffer.c new file mode 100644 index 0000000..ad3f790 --- /dev/null +++ b/lib/ultralib/src/flash/flashwritebuffer.c @@ -0,0 +1,20 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashWriteBuffer(OSIoMesg* mb, s32 priority, void* dramAddr, OSMesgQueue* mq) { + s32 ret; + + // select page program mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PAGE_PROGRAM); + + // DMA 128-byte page + mb->hdr.pri = priority; + mb->hdr.retQueue = mq; + mb->dramAddr = dramAddr; + mb->devAddr = 0; + mb->size = FLASH_BLOCK_SIZE; + + ret = osEPiStartDma(&__osFlashHandler, mb, OS_WRITE); + + return ret; +} diff --git a/lib/ultralib/src/gio/giointerrupt.c b/lib/ultralib/src/gio/giointerrupt.c new file mode 100644 index 0000000..3abc04f --- /dev/null +++ b/lib/ultralib/src/gio/giointerrupt.c @@ -0,0 +1,8 @@ +#include "PR/os_internal.h" +#include "../io/piint.h" + +void __osGIOInterrupt(s32 value) { + __osPiGetAccess(); + __osGIORawInterrupt(value); + __osPiRelAccess(); +} diff --git a/lib/ultralib/src/gio/giorawinterrupt.c b/lib/ultralib/src/gio/giorawinterrupt.c new file mode 100644 index 0000000..2fdc909 --- /dev/null +++ b/lib/ultralib/src/gio/giorawinterrupt.c @@ -0,0 +1,13 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../io/piint.h" + +void __osGIORawInterrupt(s32 value) { + register u32 stat; + + WAIT_ON_IOBUSY(stat); + + IO_WRITE(GIO_GIO_INTR_REG, value); + + WAIT_ON_IOBUSY(stat); +} diff --git a/lib/ultralib/src/gt/Makefile b/lib/ultralib/src/gt/Makefile new file mode 100644 index 0000000..b0868fd --- /dev/null +++ b/lib/ultralib/src/gt/Makefile @@ -0,0 +1,19 @@ +#!smake +# +# Makefile for the gt subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 + +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = dumpturbo.c gt.c + +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/ultralib/src/gt/dumpturbo.c b/lib/ultralib/src/gt/dumpturbo.c new file mode 100644 index 0000000..02c0e63 --- /dev/null +++ b/lib/ultralib/src/gt/dumpturbo.c @@ -0,0 +1,260 @@ + +/************************************************************************** + * * + * 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. * + * * + *************************************************************************/ + +/* + * Interpret & dump a turbo display list for RSPSIM debugging + * + */ + +#include +#include +#include "macros.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 1.4 $" +#endif + +#undef PRINTF +#define PRINTF rmonPrintf + + +#define TX_MAX 100 +static u32 textures[TX_MAX] ALIGNED(8); +static u32 numtextures; + +#define UNSEG_ADDR(sa) ((u32 *) (((globp)? \ + (((int)(sa) & 0x00ffffff) + \ + globp->sp.segBases[(int)(sa)>>24]) \ + : (int)(sa)) | 0x80000000)) +#define PHYS(a) ((int) ((int)(a) & 0x7fffffff)) +#define UNPHYS(a) ((u32 *) ((int)(a) | 0x80000000)) + +#define DOPRINT(a,r) \ +rmonPrintf("UNSEG: %x ->(seg%x = %06x)-> %08x\n",(int)(a),(int)(a)>>24,((globp)?(globp->sp.segBases[(int)(a)>>24]):0), (int)(r)) + + + +#define UCODE_SIZE_MAX (4096*1) +void +gtDumpTurbo(OSTask *tp,u8 flags) +{ + int i; + gtGfx *gtlistp; + gtGlobState *globp=0; + gtState *statep; + u32 dat,*datp,*addr; + + + PRINTF("\nGBI_DUMP_START:\n"); + PRINTF("$ %08x\n",PHYS(tp)); + + for (i=(int)tp; i<(int)tp+sizeof(OSTask); i+=4) { + PRINTF("<%08x\n",(int) *((u32 *) i)); + } + +#if 1 + PRINTF("? %08x\n",PHYS(tp->t.ucode_boot)); + for (i=(int)tp->t.ucode_boot; + i<(int)tp->t.ucode_boot+tp->t.ucode_boot_size; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + PRINTF("? %08x\n",PHYS(tp->t.ucode)); + for (i=(int)tp->t.ucode; i<(int)tp->t.ucode+UCODE_SIZE_MAX; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + PRINTF("? %08x\n",PHYS(tp->t.ucode_data)); + for (i=(int)tp->t.ucode_data; + i<(int)tp->t.ucode_data+tp->t.ucode_data_size; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + +#endif + + + + gtlistp = (gtGfx *) tp->t.data_ptr; + PRINTF("@ %08x\n",PHYS(gtlistp)); + +/* + * Dump turbo display list + */ + while (gtlistp->obj.statep) { + PRINTF(">%08x\n",(int) gtlistp->obj.gstatep); + PRINTF("-%08x\n",(int) gtlistp->obj.statep); + PRINTF("-%08x\n",(int) gtlistp->obj.vtxp); + PRINTF("-%08x\n",(int) gtlistp->obj.trip); + gtlistp++; + } + PRINTF(">%08x\n",(int) gtlistp->obj.gstatep); + PRINTF("-%08x\n",(int) gtlistp->obj.statep); + PRINTF("-%08x\n",(int) gtlistp->obj.vtxp); + PRINTF("-%08x\n",(int) gtlistp->obj.trip); + +/* + * Dump infor pointed to by DL + */ + gtlistp = (gtGfx *) tp->t.data_ptr; + while (gtlistp->obj.statep) { +/*rmonPrintf("=============== DUMP A DL ENTRY (%x)\n",(int)gtlistp);*/ + +/* + * Dump global state + */ + if (gtlistp->obj.gstatep) { + addr = UNSEG_ADDR(gtlistp->obj.gstatep); + globp = (gtGlobState *) addr; +/*rmonPrintf("======= DUMP GlobalState (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = addr; + (u8 *) datp < (u8 *) addr + sizeof(gtGlobState); + datp++) { + PRINTF("+%08x\n",*datp); + } + if (globp->sp.rdpCmds) { + addr = UNSEG_ADDR(globp->sp.rdpCmds); +/*rmonPrintf("GlobalState RDP cmds (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = addr; + *datp || *(datp+1); + datp+=2) { + PRINTF("+%08x\n",*datp); + PRINTF("+%08x\n",*(datp+1)); + } + PRINTF("+%08x\n",*datp); + PRINTF("+%08x\n",*(datp+1)); + } + } + +/* + * Dump state + */ + addr = UNSEG_ADDR(gtlistp->obj.statep); + statep = (gtState *) addr; +/*rmonPrintf("======= DUMP State (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = addr; + (u8 *) datp < (u8 *) addr + sizeof(gtState); + datp++) { + PRINTF("+%08x\n",*datp); + } + if (statep->sp.rdpCmds) { + addr = UNSEG_ADDR(statep->sp.rdpCmds); +/*rmonPrintf("DUMP State RDP cmds (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = addr; + *datp || *(datp+1); + datp+=2) { + PRINTF("+%08x\n",*datp); + PRINTF("+%08x\n",*(datp+1)); + } + PRINTF("+%08x\n",*datp); + PRINTF("+%08x\n",*(datp+1)); + } + +/* + * Dump vertices + */ + if (gtlistp->obj.vtxp) { + addr = UNSEG_ADDR(gtlistp->obj.vtxp); +/*rmonPrintf("======= DUMP VTX (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = (u32 *) addr; + (u8 *) datp < (u8 *) addr + + (statep->sp.vtxCount * sizeof(Vtx)); + datp++) { + PRINTF("+%08x\n",*datp); + } + } + +/* + * Dump triangles + */ + if (gtlistp->obj.trip) { + addr = UNSEG_ADDR(gtlistp->obj.trip); +/*rmonPrintf("======= DUMP TRI (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = (u32 *) addr; + (u8 *) datp < (u8 *) addr + + (statep->sp.triCount * sizeof(gtTriN)); + datp++) { + PRINTF("+%08x\n",*datp); + } + } + + + + gtlistp++; + } + + +/* + * Dump Last global state + */ + if (gtlistp->obj.gstatep) { + addr = UNSEG_ADDR(gtlistp->obj.gstatep); + globp = (gtGlobState *) addr; +/*rmonPrintf("======= DUMP GlobalState (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = addr; + (u8 *) datp < (u8 *) addr + sizeof(gtGlobState); + datp++) { + PRINTF("+%08x\n",*datp); + } + if (globp->sp.rdpCmds) { + addr = UNSEG_ADDR(globp->sp.rdpCmds); +/*rmonPrintf("GlobalState RDP cmds (%x)\n",(int)addr);*/ + PRINTF("& %08x\n",PHYS(addr)); + for (datp = addr; + *datp || *(datp+1); + datp+=2) { + PRINTF("+%08x\n",*datp); + PRINTF("+%08x\n",*(datp+1)); + } + PRINTF("+%08x\n",*datp); + PRINTF("+%08x\n",*(datp+1)); + } + } + + PRINTF("^\nGBI_DUMP_END:\n"); + + + if (flags & GT_DUMPTURBO_HANGAFTER) { + for (i=0; i<1000;i++) + rmonPrintf("=======================================\n"); + while(1); + } + + +/* + * Dumps stuff + * each line is either an address for data to follow or data itself + * 1st char on line indicates what it is: + * + * $ task header address + * @ display list address + * & dma data address + * % texture address + * ? code/code data address + * + * < task header data + * > 1st half of display list command + * - 2nd half of display list command + * + dma data + * * texture data + * | code/code data + * + */ + +} diff --git a/lib/ultralib/src/gt/gt.c b/lib/ultralib/src/gt/gt.c new file mode 100644 index 0000000..bf99e85 --- /dev/null +++ b/lib/ultralib/src/gt/gt.c @@ -0,0 +1,155 @@ + +/* + * 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: gt.c + * Creator: hsa@sgi.com + * Create Date: Fri Oct 13 14:23:48 PDT 1995 + * + */ + + +#include "gtint.h" + + +/* + * Set the cached RDP othermode word in the gt state structure. + */ +void +gtStateSetOthermode(Gfx *om, gtStateOthermode_t mode, int data) +{ + int shift, length; + u32 mask; + + if (mode == GT_CLEAR) { /* special case */ + om->words.w0 = (G_RDPSETOTHERMODE << 24); + om->words.w1 = 0x0; + } + + if (mode <= GT_RENDERMODE) { + /* these are OTHERMODE_L */ + switch (mode) { + + case GT_ALPHACOMPARE: + shift = G_MDSFT_ALPHACOMPARE; + length = 2; + break; + + case GT_ZSRCSEL: + shift = G_MDSFT_ZSRCSEL; + length = 1; + break; + + case GT_RENDERMODE: + shift = G_MDSFT_RENDERMODE; + length = 29; + break; + + default: + break; + } + + mask = (0x01 << length); + mask = mask - 1; + mask = (mask << shift); + mask = mask ^ 0xffffffff; + om->words.w1 &= mask; + om->words.w1 |= data; + + } else { + /* these are OTHERMODE_H */ + switch (mode) { + case GT_ALPHADITHER: + shift = G_MDSFT_ALPHADITHER; + length = 2; + break; + + case GT_RGBDITHER: + shift = G_MDSFT_RGBDITHER; + length = 2; + break; + + case GT_COMBKEY: + shift = G_MDSFT_COMBKEY; + length = 1; + break; + + case GT_TEXTCONV: + shift = G_MDSFT_TEXTCONV; + length = 3; + break; + + case GT_TEXTFILT: + shift = G_MDSFT_TEXTFILT; + length = 2; + break; + + case GT_TEXTLUT: + shift = G_MDSFT_TEXTLUT; + length = 2; + break; + + case GT_TEXTLOD: + shift = G_MDSFT_TEXTLOD; + length = 1; + break; + + case GT_TEXTDETAIL: + shift = G_MDSFT_TEXTDETAIL; + length = 2; + break; + + case GT_TEXTPERSP: + shift = G_MDSFT_TEXTPERSP; + length = 1; + break; + + case GT_CYCLETYPE: + shift = G_MDSFT_CYCLETYPE; + length = 2; + break; + + case GT_PIPELINE: + shift = G_MDSFT_PIPELINE; + length = 1; + break; + + default: + break; + } + + mask = (0x01 << length); + mask = mask - 1; + mask = (mask << shift); + mask = mask ^ 0xffffffff; + om->words.w0 &= mask; + om->words.w0 |= data; + } + + /* force cached othermode word to have proper command id: */ + om->words.w0 &= 0x00ffffff; + om->words.w0 |= (G_RDPSETOTHERMODE << 24); +} + diff --git a/lib/ultralib/src/gt/gtint.h b/lib/ultralib/src/gt/gtint.h new file mode 100644 index 0000000..31ddd7c --- /dev/null +++ b/lib/ultralib/src/gt/gtint.h @@ -0,0 +1,36 @@ + +/* + * 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: gtint.h + * Creator: hsa@sgi.com + * Create Date: Fri Oct 13 14:24:36 PDT 1995 + * + */ + +#include "mbi.h" +#include "gu.h" +#include "gt.h" + diff --git a/lib/ultralib/src/gu/Makefile b/lib/ultralib/src/gu/Makefile new file mode 100644 index 0000000..ad6e2fa --- /dev/null +++ b/lib/ultralib/src/gu/Makefile @@ -0,0 +1,52 @@ +#!smake +# +# Makefile for the gu subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include +LCOPTS = -G 0 -g -O + +CFILES = \ + align.c \ + cosf.c \ + coss.c \ + frustum.c \ + guloadtile_bug.c \ + loadtextureblockmipmap.c\ + lookat.c \ + lookathil.c \ + lookatref.c \ + lookatstereo.c \ + mtxcatf.c \ + mtxcatl.c \ + mtxutil.c \ + normalize.c \ + ortho.c \ + perspective.c \ + position.c \ + poslight.c \ + poslighthil.c \ + random.c \ + rotate.c \ + rotaterpy.c \ + scale.c \ + sinf.c \ + sins.c \ + translate.c \ + us2dex.c \ + us2dex_emu.c \ + us2dex2_emu.c \ + usprite.c + +ASFILES = \ + libm_vals.s \ + sqrtf.s +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/ultralib/src/gu/align.c b/lib/ultralib/src/gu/align.c new file mode 100644 index 0000000..9be7b4a --- /dev/null +++ b/lib/ultralib/src/gu/align.c @@ -0,0 +1,75 @@ +/************************************************************************** + * * + * 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" + +/* + * S = sin (a) + * C = cos (a) + * H = sqrt (X*X + Z*Z) + * + * [ v ] [ C S ] [ 1 ] [ -Z/H X/H ] + * [ -S C ] [ H Y ] [ 1 ] + * [ 1 ] [ -Y H ] [ -X/H -Z/H ] + * [ 1 ] [ 1 ] [ 1 ] + * + */ + +void guAlignF(float mf[4][4], float a, float x, float y, float z) +{ + static float dtor = 3.1415926 / 180.0; + float s, c, h, hinv; + + guNormalize(&x, &y, &z); + + a *= dtor; + s = sinf (a); + c = cosf (a); + h = sqrtf (x*x + z*z); + + guMtxIdentF(mf); + + if (h != 0) { + hinv = 1 / h; + + mf[0][0] = (-z*c - s*y*x) * hinv; + mf[1][0] = (z*s - c*y*x) * hinv; + mf[2][0] = -x; + mf[3][0] = 0; + + mf[0][1] = s*h; + mf[1][1] = c*h; + mf[2][1] = -y; + mf[3][1] = 0; + + mf[0][2] = (c*x - s*y*z) * hinv; + mf[1][2] = (-s*x - c*y*z) * hinv; + mf[2][2] = -z; + mf[3][2] = 0; + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; + } else { + /* XXX: should do this right */ + } +} + +void guAlign(Mtx *m, float a, float x, float y, float z) +{ + Matrix mf; + + guAlignF(mf, a, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/src/libultra/gu/cosf.c b/lib/ultralib/src/gu/cosf.c similarity index 100% rename from src/libultra/gu/cosf.c rename to lib/ultralib/src/gu/cosf.c diff --git a/lib/ultralib/src/gu/coss.c b/lib/ultralib/src/gu/coss.c new file mode 100644 index 0000000..0d95530 --- /dev/null +++ b/lib/ultralib/src/gu/coss.c @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * 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" + +/* ==================================================================== + * ==================================================================== + * + * Module: coss.c + * $Revision: 1.3 $ + * $Date: 1998/10/09 06:11:01 $ + * $Author: has $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/libultra/monegi/gu/coss.c,v $ + * + * ==================================================================== + * ==================================================================== + */ + +/* coefficients for polynomial approximation of sin on +/- pi/2 */ + +/* ==================================================================== + * + * FunctionName coss + * + * Description computes cosine of arg + * + * ==================================================================== + */ + +signed short +coss( unsigned short x ) +{ + /* 0 <= x < 0x10000 ==> 0 <= x < 2PI */ + + return sins ((unsigned short) (x + 0x4000)); +} diff --git a/lib/ultralib/src/gu/dump_gbi.c b/lib/ultralib/src/gu/dump_gbi.c new file mode 100644 index 0000000..a5e5e12 --- /dev/null +++ b/lib/ultralib/src/gu/dump_gbi.c @@ -0,0 +1,274 @@ + +/************************************************************************** + * * + * 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. * + * * + *************************************************************************/ + +/* + * Interpret Task with GBI display list and dump it for debugging. + */ + + +/************************************************** + * + * guDumpGbiDL no longer supported + * applications should use guParseGbiDL with the + * GU_PARSEGBI_DUMPONLY flag set. + * + **************************************************/ + + +#if 0 + + +#include "ultra64.h" +#include "bstring.h" + +#undef PRINTF +#define PRINTF osSyncPrintf + +#define DL_STACKSIZE 11 +static u32 *Gp[DL_STACKSIZE]; + +#define TX_MAX 100 +static u32 textures[TX_MAX]; +static u32 numtextures; + +static u32 segment_base[16]; +static u32 dotextures = TRUE; +static int dl_depth = 0; + + +/* + * dump a DMA-type display list command. + */ +static void +dump_dma(u32 *bufp) +{ + u32 addr, + *data; + u8 seg_id; + u16 len; + char op, + b0; + + op = ((*bufp & 0xff000000) >> 24); + + /* + * DMA op addressing is all the same: + */ + seg_id = (u8) ((bufp[1] & 0x0f000000) >> 24); + addr = segment_base[seg_id] + (bufp[1] & 0x00ffffff); + + + addr = (u32) osPhysicalToVirtual(addr); + + len = (u16) (bufp[0] & 0x0000ffff); + + PRINTF(">%08x\n-%08x\n", bufp[0], bufp[1]); + if (op == (char) G_DL) { + b0 = (char) ((bufp[0] & 0x00ff0000) >> 16); + ++dl_depth; + if (dl_depth > (DL_STACKSIZE - 1)) { + PRINTF("***** Error, max levels of display lists exceeded\n"); + return; + } + Gp[dl_depth] = (u32 *) addr; + PRINTF("@ %08x\n",(int)Gp[dl_depth]&0x7fffffff); + } else { + PRINTF("& %08x\n", (int)addr&0x7fffffff); + data = (u32 *) addr; + while(len>0) { + PRINTF("+%08x\n", *data); + data++; + len -= 4; + } + PRINTF("@ %08x\n",(int)(Gp[dl_depth] + (sizeof(Gfx) >> 2))&0x7fffffff); + } +} + +/* + * dump a IMM-type display list command. + */ +static void +dump_imm(u32 *bufp) +{ + char op, + b0; + + op = ((*bufp & 0xff000000) >> 24); + + PRINTF(">%08x\n-%08x\n", bufp[0], bufp[1]); + if (op == (char) G_ENDDL) { + dl_depth--; + if (dl_depth >= 0) { + PRINTF("@ %08x\n",(int)(Gp[dl_depth] + (sizeof(Gfx) >> 2))&0x7fffffff); + } + } + if (op == (char) G_MOVEWORD) { + if (((bufp[0] ) & 0xff) == G_MW_SEGMENT) { + b0 = (char) ((bufp[0] & 0xff00)>>10); + segment_base[b0] = bufp[1] & 0x00ffffff; + } + } +} + +/* + * dump a RDP-type display list command. + */ +static void +dump_rdp(u32 *bufp) +{ + u8 seg_id; + u32 addr; + int i0, + i1; + char op; + + op = ((*bufp & 0xff000000) >> 24); + + PRINTF(">%08x\n-%08x\n", bufp[0], bufp[1]); + if (op == (char) G_SETTIMG && dotextures) { + if (numtextures>=TX_MAX) { + PRINTF("GBI DUMP ERROR: too many textures (max=%d)\n",TX_MAX); + return; + } + seg_id = (u8) ((bufp[1] & 0x0f000000) >> 24); + addr = segment_base[seg_id] + (bufp[1] & 0x00ffffff); + addr = (u32) osPhysicalToVirtual(addr); + i1=1; + for (i0=0;i0= 0) && (dl_depth < (DL_STACKSIZE - 1))) { + + op = (u8) ((*Gp[dl_depth] & 0xff000000) >> 24); + bcopy((char *) Gp[dl_depth], (char *) &(readBuf[0]), sizeof(Gfx)); + + switch (op & 0xc0) { + + case (u8) 0x00: + dump_dma(readBuf); + break; + + case (u8) 0x80: + dump_imm(readBuf); + break; + + case (u8) 0xc0: + dump_rdp(readBuf); + break; + + default: + PRINTF("ERROR : display list is lost, op = %02x\n", op); + break; + + } + + if (op != (u8) G_DL) { + Gp[dl_depth] += (sizeof(Gfx) >> 2); + } + } + if (dotextures) { + u32 i,j; + for (i=0; it.ucode_boot & 0x7fffffff); + for (i=(int)tp->t.ucode_boot; i<(int)tp->t.ucode_boot+tp->t.ucode_boot_size; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + PRINTF("? %08x\n",(int) tp->t.ucode& 0x7fffffff); + for (i=(int)tp->t.ucode; i<(int)tp->t.ucode+UCODE_SIZE_MAX; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + PRINTF("? %08x\n",(int) tp->t.ucode_data & 0x7fffffff); + for (i=(int)tp->t.ucode_data; i<(int)tp->t.ucode_data+tp->t.ucode_data_size; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + + guDumpGbi((u32 *) tp->t.data_ptr); + + + PRINTF("^\nGBI_DUMP_END:\n"); + + if (flags & GU_PARSEGBI_HANGAFTER) { + int i; + for (i=0; i<1000;i++) + PRINTF("=============================================================\n"); + while(1); + } + + +/* + * Dumps stuff + * each line is either an address for data to follow or data itself + * 1st char on line indicates what it is: + * + * $ task header address + * @ display list address + * & dma data address + * % texture address + * ? code/code data address + * + * < task header data + * > 1st half of display list command + * - 2nd half of display list command + * + dma data + * * texture data + * | code/code data + * + */ + +} + +#endif diff --git a/lib/ultralib/src/gu/frustum.c b/lib/ultralib/src/gu/frustum.c new file mode 100644 index 0000000..4af9c5d --- /dev/null +++ b/lib/ultralib/src/gu/frustum.c @@ -0,0 +1,42 @@ +/************************************************************************** + * * + * 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 guFrustumF(float mf[4][4], float l, float r, float b, float t, float n, float f, float scale) +{ + int i, j; + + guMtxIdentF(mf); + + mf[0][0] = 2*n/(r-l); + mf[1][1] = 2*n/(t-b); + mf[2][0] = (r+l)/(r-l); + mf[2][1] = (t+b)/(t-b); + mf[2][2] = -(f+n)/(f-n); + mf[2][3] = -1; + mf[3][2] = -2*f*n/(f-n); + mf[3][3] = 0; + + for (i=0; i<4; i++) + for (j=0; j<4; j++) + mf[i][j] *= scale; +} + +void guFrustum(Mtx *m, float l, float r, float b, float t, float n, float f, float scale) +{ + Matrix mf; + + guFrustumF(mf, l, r, b, t, n, f, scale); + + guMtxF2L(mf, m); +} diff --git a/src/libultra/gu/guint.h b/lib/ultralib/src/gu/guint.h similarity index 100% rename from src/libultra/gu/guint.h rename to lib/ultralib/src/gu/guint.h diff --git a/lib/ultralib/src/gu/guloadtile_bug.c b/lib/ultralib/src/gu/guloadtile_bug.c new file mode 100644 index 0000000..e16e250 --- /dev/null +++ b/lib/ultralib/src/gu/guloadtile_bug.c @@ -0,0 +1,235 @@ +/************************************************************************** + * * + * 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 "ultra64.h" + +/* + * Inidicates how many words will be added to display list + * by guDPLoadTextureTile function. + */ +int +guGetDPLoadTextureTileSz(int ult, int lrt) +{ + return (((lrt - ult + 1) / 2) * 4 + 3); +} + +/* + * Workaround for load_tile bug on tapeout one hardware. Uses + * load blocks for each line. ~25% more dma traffic + memory for + * extra commands. + */ +void +guDPLoadTextureTile(Gfx * temp, void *timg, + int texl_fmt, int texl_size, + int img_width, int img_height, + int uls, int ult, int lrs, int lrt, + int palette, + int cms, int cmt, + int masks, int maskt, + int shifts, int shiftt) +{ + int line; + int tile_width, + tile_height; /* + + * in texels + */ + int dxt; + int sizeb; + int lineb; + int line_size; /* + + * in 64-bit words + */ + int texel_num_pad; /* + + * in texels, pad to 64-bit word size + */ + int count; + int tmem; + int tile; + int s, + t; + + tile_width = lrs - uls + 1; + tile_height = lrt - ult + 1; + + switch (texl_size) { + case G_IM_SIZ_8b: + sizeb = G_IM_SIZ_8b_BYTES; + lineb = G_IM_SIZ_8b_LINE_BYTES; + break; + case G_IM_SIZ_16b: + sizeb = G_IM_SIZ_16b_BYTES; + lineb = G_IM_SIZ_16b_LINE_BYTES; + break; + case G_IM_SIZ_32b: + sizeb = G_IM_SIZ_32b_BYTES; + lineb = G_IM_SIZ_32b_LINE_BYTES; + break; + } + + dxt = CALC_DXT(tile_width, sizeb); + line_size = ((tile_width * lineb) + 7) >> 3; + /* + * pad line to word boundary + */ + texel_num_pad = ((((tile_width * sizeb) + 7) >> 3) * 8) / sizeb; + + gDPSetTextureImage(temp++, texl_fmt, texl_size, img_width, timg); + + for (line = 0; line < tile_height; line += 2) { + t = (ult + line) & ~1; /* + * load from even line + */ + tmem = line * line_size; + + /* + * set for both loads, avoid sync by alternating tiles + */ + tile = (line % 4) ? 1 : 0; + + gDPSetTile(temp++, texl_fmt, texl_size, 0, tmem, G_TX_LOADTILE - tile, 0, + cmt, maskt, shiftt, + cms, masks, shifts); + + /* + * do odd line first + */ + s = uls + img_width - texel_num_pad; + count = (texel_num_pad * 2) - 1; + + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + + /* + * do even line + */ + s = uls; + count = tile_width - 1; + + gDPLoadSync(temp++); + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + + } + + /* + * set final tile + */ + gDPSetTile(temp++, texl_fmt, texl_size, line_size, 0, G_TX_RENDERTILE, 0, + cmt, maskt, shiftt, + cms, masks, shifts); + + gDPSetTileSize(temp++, G_TX_RENDERTILE, + (uls) << G_TEXTURE_IMAGE_FRAC, + (ult) << G_TEXTURE_IMAGE_FRAC, + (lrs) << G_TEXTURE_IMAGE_FRAC, + (lrt) << G_TEXTURE_IMAGE_FRAC); +} + +/* + * 4-BIT VERSION + */ + +/* + * Inidicates how many words will be added to display list + * by guDPLoadTextureTile function. + */ +int +guGetDPLoadTextureTile_4bSz(int ult, int lrt) +{ + return (((lrt - ult + 1) / 2) * 4 + 3); +} + +/* + * Workaround for load_tile bug on version 1.0 hardware. Uses + * load blocks for each line. ~25% more dma traffic + memory for + * extra commands. + */ +void +guDPLoadTextureTile_4b(Gfx * temp, void *timg, + int texl_fmt, + int img_width, int img_height, + int uls, int ult, int lrs, int lrt, + int palette, + int cms, int cmt, + int masks, int maskt, + int shifts, int shiftt) +{ + int line; + int tile_width, + tile_height; + int dxt; + int sizeb; + int lineb; + int line_size; + int count; + int tmem; + int tile; + int s, + t; + + tile_width = (lrs - uls + 1) >> 1; + tile_height = lrt - ult + 1; + sizeb = G_IM_SIZ_8b_BYTES; + lineb = G_IM_SIZ_8b_LINE_BYTES; + line_size = ((tile_width * lineb) + 7) >> 3; + dxt = CALC_DXT_4b(tile_width); + + gDPSetTextureImage(temp++, texl_fmt, G_IM_SIZ_8b, ((img_width) >> 1), timg); + + for (line = 0; line < tile_height; line += 2) { + t = (ult + line) & ~1; /* + * load from even line + */ + tmem = line * line_size; + + /* + * set for both loads, avoid sync by alternating tiles + */ + tile = (line % 4) ? 1 : 0; + + gDPSetTile(temp++, texl_fmt, G_IM_SIZ_8b, 0, tmem, G_TX_LOADTILE - tile, 0, + cmt, maskt, shiftt, + cms, masks, shifts); + + /* + * do odd line first + */ + s = uls + img_width - line_size * 8; + count = (line_size * 8 * 2) - 1; + + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + + /* + * do even line + */ + s = uls; + count = tile_width - 1; + + gDPLoadSync(temp++); + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + + } + + /* + * set final tile + */ + gDPSetTile(temp++, texl_fmt, G_IM_SIZ_4b, line_size, 0, G_TX_RENDERTILE, 0, + cmt, maskt, shiftt, + cms, masks, shifts); + + gDPSetTileSize(temp++, G_TX_RENDERTILE, + (uls) << G_TEXTURE_IMAGE_FRAC, + (ult) << G_TEXTURE_IMAGE_FRAC, + (lrs) << G_TEXTURE_IMAGE_FRAC, + (lrt) << G_TEXTURE_IMAGE_FRAC); +} diff --git a/lib/ultralib/src/gu/libm_vals.s b/lib/ultralib/src/gu/libm_vals.s new file mode 100644 index 0000000..b88ad98 --- /dev/null +++ b/lib/ultralib/src/gu/libm_vals.s @@ -0,0 +1,5 @@ + .rdata + .align 4 + .globl __libm_qnan_f +__libm_qnan_f: + .word 0x7F810000 diff --git a/lib/ultralib/src/gu/loadtextureblockmipmap.c b/lib/ultralib/src/gu/loadtextureblockmipmap.c new file mode 100644 index 0000000..30ffc65 --- /dev/null +++ b/lib/ultralib/src/gu/loadtextureblockmipmap.c @@ -0,0 +1,717 @@ +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/**************************************************************************** + * NOTE: To view this file correctly, set tabstop=3 +*****************************************************************************/ +#include "guint.h" +#include +#include "ultra64.h" +#include "macros.h" + +// TODO: this comes from a header +#ident "$Revision: 1.49 $" + +#define TRAM_SIZE 4096 /* in bytes */ +#define TRAM_WSIZE 8 /* TRAM word size in bytes */ +#define TRAM_LSIZE 8 /* TRAM load word size in bytes */ +#define MM_MAX_LEVEL 7 /* number of mipmap levels 0 to MM_MAX_LEVEL */ +#define MM_MIN_SIZE 1 /* smallest mipmap tile */ + +struct texelSizeParams +{ + unsigned char gran; + unsigned char shift; + unsigned char tsize; + unsigned char shiftr; +}; + +/* texture ram tile */ +struct Tile +{ + int w; /* width of tile in texels, padded to tram line sz */ + int s, t; /* size of tile in texels */ + int addr; /* address in tram of tile */ +}; + +/* tram mipmaps */ +static struct Tile mipmap[MM_MAX_LEVEL+1] ALIGNED(8); +static struct texelSizeParams sizeParams[4] = + { 16, 3, 1, 0, + 8, 2, 2, 1, + 4, 1, 4, 2, + 2, 0, 8, 3 + }; + + +static int max_mipmap; +static unsigned char *tram; +static int txlsize; +static int errNo = 0; +static int NA = 0; /* Not applicable */ +static unsigned int length; /* total texels in mipmap */ +static int level; /* total levels in mipmap */ + +static void get3x3(struct Tile *tile, int *s, int *t, int *texel, int shift, int size); +static void stuffDisplayList(Gfx **glistp, Image *im, char *tbuf, unsigned char startTile, + unsigned char pal, unsigned char cms, unsigned char cmt, + unsigned char masks, unsigned char maskt, unsigned char shifts, + unsigned char shiftt); +static void kernel(int i, int r1, int g1, int b1, int a1, float *r2, float *g2, + float *b2, float *a2); + +#define unpack_ia16(c,i,a) \ + i = (c & 0xff00) >> 8, a = (c & 0xff) +#define pack_ia16(i,a) \ + (i << 8) | a + +#define unpack_ia8(c,i,a) \ + i = ((c & 0xf0) >> 4), a = (c & 0xf) +#define pack_ia8(i,a) \ + (a & 0xf) | ((i & 0xf) << 4) + +#define unpack_ia4(c,i,a) \ + i = ((c & 0xe) >> 1), a = (c & 0x1) +#define pack_ia4(i,a) \ + ((i & 0x7) << 1) | ((a & 0x1)) + +#define unpack_i4(c,i) \ + i = (c & 0xf) +#define pack_i4(i) \ + (i) + +#define unpack_i8(c,i) \ + i = (c & 0xff) +#define pack_i8(i) \ + (i) + +#define unpack_ci8(c,ci) unpack_i8(c,ci) +#define pack_ci8(ci) pack_i8(ci) + +#define unpack_ci4(c,ci) unpack_i4(c,ci) +#define pack_ci4(ci) pack_i4(ci) + +#define unpack_rgba(c,r,g,b,a) \ + (r = (c & 0xf800) >> 11), g = ((c & 0x07c0) >> 6), b = ((c & 0x003e) >> 1), \ + a = (c & 0x1) + +#define pack_rgba( r, g, b, a) ((r&0x1f) << 11) | (g&0x1f) << 6 | \ + ((b&0x1f) << 1) | (a) + +/************************************************************************* + * Generates all levels of a power-of-two mipmap from an input array. * + * Also stuffs display list with entries for loading and rendering the * + * texture. Filtering Color-Index maps makes sense only if the lookup * + * is a linear ramp. Billboards and trees cutout using alpha will change * + * shape as the level changes due to change in map resolution. Texel * + * formats with only one bit of alpha will not be filtered very well. * + ************************************************************************* + * ErrNo value error description * + *-----------------------------------------------------------------------* + * 1 Mipmap too big to load into tmem. Not Fatal, * + * will load as many levels as there is space for. * + * * + * 2 Texel format not supported, Fatal error * + ************************************************************************/ + +int guLoadTextureBlockMipMap(Gfx **glistp, unsigned char *tbuf, Image *im, + unsigned char startTile, unsigned char pal, unsigned char cms, unsigned char cmt, + unsigned char masks, unsigned char maskt, unsigned char shifts, unsigned char shiftt, + unsigned char cfs, unsigned char cft) +{ + + unsigned char *iaddr, *taddr; + int im_bytes, tr_bytes; + int h, b; + int flip; + char startUnAligned; + char endUnAligned; + + txlsize = sizeParams[im->siz].tsize; /* texel size in nibbles */ + /* to next line size */ + + /* + * Do top level map, swizzle bytes on odd t's * + */ + /* base char address of tile to be loaded */ + iaddr = ((im->t * im->lsize)+((im->s * txlsize) >> 1) + im->base); + + /*check tile line starting and ending alignments along 4bit bndries */ + startUnAligned = ((im->s & 0x1) && (im->siz == G_IM_SIZ_4b)); + endUnAligned = (((im->s + im->w) & 0x1) && (im->siz == G_IM_SIZ_4b)); + + im_bytes = ((im->w * txlsize + 1) >> 1); /* siz of 1 tile line in bytes */ + tr_bytes = im_bytes / TRAM_LSIZE; /* no of tram lines per tile line */ + tr_bytes = tr_bytes * TRAM_LSIZE; /* tile line size in bytes */ + if (im_bytes > tr_bytes) tr_bytes += TRAM_LSIZE; + + taddr = &tbuf[im->addr]; /* why ? make this zero?*/ + + if (startUnAligned) + { + for (h=0; hh; h++) + { + flip = (h & 1) << 2; /*shift does not depend on txlsize*/ + for (b=0; b> 4); + } + /* add last aligned nibble */ + if (!endUnAligned) *(taddr+((b-1)^flip)) &= (0xf0); + /* pickup trailing bytes */ + for (b=im_bytes; blsize; + taddr += tr_bytes; + } + } + else /* if start aligned */ + { + for (h=0; hh; h++) + { + flip = (h & 1) << 2; /*shift does not depend on txlsize*/ + for (b=0; blsize; + taddr += tr_bytes; + } + } + + tram = tbuf; + + /* save tile attributes in top mipmap */ + mipmap[0].s = im->w; /* tile width */ + mipmap[0].t = im->h; /* tile height */ + /* guaranteed no remainder ? */ + mipmap[0].w = ((tr_bytes / txlsize) << 1); /* tile line width in texels*/ + mipmap[0].addr = im->addr; + max_mipmap = MM_MAX_LEVEL; + length = mipmap[0].w*mipmap[0].t; /* total texels in level 0 */ +/** + rmonPrintf("level0 w,t,l = %d %d %d\n",mipmap[0].w, mipmap[0].t,length); +***/ + +/****************************************************************************** + Generate other levels of mipmap using a box filter +******************************************************************************/ + +{/* generate mip map for this tile */ + unsigned char *taddr, *saddr; + int shift = (int) sizeParams[im->siz].shift; + int s, t, si, ti, sii, tii; + int s4[9]; + int t4[9]; + int tex4[9]; + int r0, g0, b0, a0, r1, g1, b1, a1; + float r2 ,g2, b2, a2; + float dummy; + int i0, ci0, ia0, i1, ci1, ia1; + float i2, ci2, ia2; + int texel; + int i,trip; + unsigned int tempaddr; + int ntexels = ((TRAM_LSIZE/txlsize) << 1); /* texels per line */ + + level = 0; /* need to check for memory overflow */ + while ((mipmap[level].s > 1) || (mipmap[level].t > 1)) + { + level++; + /* + * set new mipmap level address in bytes + */ + mipmap[level].addr = mipmap[level-1].addr + + (mipmap[level-1].w * txlsize * mipmap[level-1].t >> 1); + + /* + * grab location in tram pointing to the current level address + */ + taddr = &(tram[ mipmap[level].addr ]); + + /* + * downfilter by 2X, bump odd size + * compute parameters for new mipmap level + */ + mipmap[level].s = (mipmap[0].s) >> level; + mipmap[level].t = (mipmap[0].t) >> level; + + if (mipmap[level].s == 0) mipmap[level].s = 1; + if (mipmap[level].t == 0) mipmap[level].t = 1; + + /* + * width must be a multiple of 8 bytes (padding for tram line size) + */ + mipmap[level].w = + ((mipmap[level].s + (ntexels -1)) >> (shift +1) << (shift +1)); + + /* + * compute total no of texels to be loaded + */ + length += mipmap[level].w*mipmap[level].t; +/** + rmonPrintf("level, w,t,l = %d %d %d %d\n", level, mipmap[level].w, mipmap[level].t,length); +**/ + if ((length*txlsize >> 1) >= TRAM_SIZE) + { + errNo = 1; + length -= mipmap[level].w*mipmap[level].t; + break; + } + + /* + * for each scanline + */ + for (t=0; t= mipmap[level-1].t) ti = t; + if (tii < 0) tii = t; + } else { + if (ti >= mipmap[level-1].t) ti = 0; + if (tii < 0) tii = mipmap[level-1].t - 1; + } + + tempaddr = 0; + + for (s=0; s= mipmap[level-1].s) si = s; + if (sii < 0) sii = s; + } else { + if (si >= mipmap[level-1].s) si = 0; + if (sii < 0) sii = mipmap[level-1].s - 1; + } + +/*** + if (level == 6) + rmonPrintf("sts = %d %d %d %d %d %d\n", + s, si, sii, t, ti, tii); +***/ + + /* + * grab the nine neighbours to apply kernel function + */ + s4[0] = s; t4[0] = tii; + s4[1] = si; t4[1] = tii; + s4[2] = si; t4[2] = t; + s4[3] = si; t4[3] = ti; + s4[4] = s; t4[4] = ti; + s4[5] = sii; t4[5] = ti; + s4[6] = sii; t4[6] = t; + s4[7] = sii; t4[7] = tii; + s4[8] = s; t4[8] = t; + + get3x3( &mipmap[level-1], s4, t4, tex4, shift, im->siz); + + saddr = taddr + ((tempaddr >> 1)^trip); + r1 = g1 = b1 = a1 = ci1 = i1 = 0; + r2 = g2 = b2 = a2 = ci2 = i2 = 0; + + /* + * Extract R,G and B components of the 9 texels and + * apply the filter kernel + */ + switch (im->fmt) + { + case (G_IM_FMT_RGBA): + if (im->siz == G_IM_SIZ_16b) + { + for (i=0; i< 9; i++) + { + unpack_rgba(tex4[i], r0, g0, b0, a0); + kernel(i, r0, g0, b0, a0, &r2, &g2, &b2, &a2); +/*** + if (level == 6) + rmonPrintf("r0, g0, b0, a0 = %d %d %d %d\n", + r0, g0, b0, a0); +**/ + } + r1 = (int)(r2/16.0 + 0.5); + g1 = (int)(g2/16.0 + 0.5); + b1 = (int)(b2/16.0 + 0.5); + a1 = (int)(a2/16.0 + 0.5); + } + else + { + /* + * RGBA32 is not supported + */ + errNo = 2; + return errNo; + } + break; + + case (G_IM_FMT_YUV): + errNo = 2; + return errNo; + break; + + case (G_IM_FMT_CI): + if (im->siz == G_IM_SIZ_4b) + { + for (i=0; i<9; i++) + { + unpack_ci4(tex4[i],ci0); + kernel(i, ci0, 0, 0, 0, &ci2, &dummy, &dummy, + &dummy); + } + ci1 = (int)(ci2/16.0 + 0.5); + } + else + if (im->siz == G_IM_SIZ_8b) + { + for (i=0; i<9; i++) + { + unpack_ci8(tex4[i],ci0); + kernel(i, ci0, 0, 0, 0, &ci2, &dummy, + &dummy, &dummy); + } + ci1 = (int)(ci2/16.0 + 0.5); + } + else + { + errNo=2; + return errNo; + } + break; + + case (G_IM_FMT_IA): + if (im->siz == G_IM_SIZ_4b) + { + for (i=0; i<9; i++) + { + unpack_ia4(tex4[i],i0,a0); + kernel(i, i0, a0, 0, 0, &i2, &a2, &dummy, + &dummy); + } + i1 = (int)(i2/16.0 +0.5); + a1 = (int)(a2/16.0 +0.5); + } + else if (im->siz == G_IM_SIZ_8b) + { + for (i=0; i<9; i++) + { + unpack_ia8(tex4[i],i0,a0); + kernel(i, i0, a0, 0, 0, &i2, &a2, &dummy, + &dummy); + } + i1 = (int)(i2/16.0 +0.5); + a1 = (int)(a2/16.0 +0.5); + } + else + if (im->siz == G_IM_SIZ_16b) + { + for (i=0; i<9; i++) + { + unpack_ia16(tex4[i],i0,a0); + kernel(i, i0, a0, 0, 0, &i2, &a2, &dummy, + &dummy); + } + i1 = (int)(i2/16.0 +0.5); + a1 = (int)(a2/16.0 +0.5); + } + else + { + errNo = 2; + return errNo; + } + break; + + case (G_IM_FMT_I): + if (im->siz == G_IM_SIZ_4b) + { + for (i=0; i<9; i++) + { + unpack_i4(tex4[i],i0); + kernel(i, i0, 0, 0, 0, &i2, &dummy, &dummy, + &dummy); + } + i1 = (int)(i2/16.0 + 0.5); + } + else + if (im->siz == G_IM_SIZ_8b) + { + for (i=0; i<9; i++) + { + unpack_i8(tex4[i],i0); + kernel(i, i0, 0, 0, 0, &i2, &dummy, &dummy, + &dummy); + } + i1 = (int)(i2/16.0 +0.5); + } + else + { + errNo = 2; + return errNo; + } + + default: + break; + } + + /* + * Pack fields into destination texel + */ + switch (im->fmt) + { + + case (G_IM_FMT_RGBA): + texel = pack_rgba(r1,g1,b1,a1); + *(short *)((int)saddr^flip) = texel; + break; + + case (G_IM_FMT_YUV): + break; + + case (G_IM_FMT_CI): + + if (im->siz == G_IM_SIZ_4b) + { + texel = pack_ci4(ci1); + *(char *)((int)saddr^flip) |= (s & 0x2)? + (texel): (texel << 4); + } + else + if (im->siz == G_IM_SIZ_8b) + { + texel = pack_ci8(ci1); + *(char *)((int)saddr^flip) = texel; + } + break; + + case (G_IM_FMT_IA): + if (im->siz == G_IM_SIZ_4b) + { + texel = pack_ia4(i1,a1); + *(char *)((int)saddr^flip) |= (s & 0x2)? + (texel): (texel << 4); + } + else + if (im->siz == G_IM_SIZ_8b) + { + texel = pack_ia8(i1,a1); + *(char *)((int)saddr^flip) = texel; + } + else + if (im->siz == G_IM_SIZ_16b) + { + texel = pack_ia16(i1,a1); + *(short *)((int)saddr^flip) = texel; + } + break; + + case (G_IM_FMT_I): + if (im->siz == G_IM_SIZ_4b) + { + texel = pack_i4(i1); + *(char *)((int)saddr^flip) |= (s & 0x2)? + (texel): (texel << 4); + } + else + if (im->siz == G_IM_SIZ_8b) + { + texel = pack_i8(i1); + *(char *)((int)saddr^flip) = texel; + } + break; + } + + tempaddr += txlsize; + + } /* end s */ + + taddr += ((mipmap[level].w * txlsize) >> 1); + + } /* end t */ + + if (mipmap[level].s <= MM_MIN_SIZE && + mipmap[level].t <= MM_MIN_SIZE) + { + max_mipmap = level; + break; + } + } /* end level */ + +}/* end generate mipmap */ +/* + * Add entries for texture loading and rendering in DL + */ +stuffDisplayList(glistp, im, tbuf, startTile, pal, cms, cmt, masks, maskt, shifts, shiftt); + +return errNo; +} /* end guLoadTextureBlockMipMap */ + +/****************************************************************************** + * + * Apply Kernel : + * 1 2 1 + * 2 4 1 + * 1 2 1 + ******************************************************************************/ +static void kernel(int i, int r0, int g0, int b0, int a0, float *r2, float *g2, float *b2, float *a2) +{ + if (i == 8) + { + *r2 += r0*4; *g2 += g0*4; *b2 += b0*4; *a2 += a0*4; + } else + if (i%2 == 0) + { + *r2 += r0*2; + *g2 += g0*2; + *b2 += b0*2; + *a2 += a0*2; + } else + { + *r2 += r0; + *g2 += g0; + *b2 += b0; + *a2 += a0; + } +} + +/******************************************************************** + Add entries for loading and rendering textures into the display list +*********************************************************************/ +static void stuffDisplayList(Gfx **glistp, Image *im, char *tbuf, unsigned char startTile, + unsigned char pal, unsigned char cms, unsigned char cmt, + unsigned char masks, unsigned char maskt, unsigned char shifts, + unsigned char shiftt) +{ + int tile; + int Smask, Tmask; + int Sshift, Tshift; + + /* + * set LOADTILE for loading texture + * 4-bit textures are loaded in 8-bit chunks + */ + if (im->siz == G_IM_SIZ_4b) { + gDPSetTextureImage((*glistp)++, im->fmt, G_IM_SIZ_8b, 1, + osVirtualToPhysical((unsigned short *)tbuf)); + gDPSetTile((*glistp)++, im->fmt, G_IM_SIZ_8b, NA, 0, G_TX_LOADTILE, NA, + NA, NA, NA, NA, NA, NA); + /* Wait until all primitives are done */ + gDPLoadSync((*glistp)++); + gDPLoadBlock((*glistp)++, G_TX_LOADTILE, 0, 0, length/2, 0x0); + } else { + gDPSetTextureImage((*glistp)++, im->fmt, im->siz, 1, + osVirtualToPhysical((unsigned short *)tbuf)); + gDPSetTile((*glistp)++, im->fmt, im->siz, NA, 0, G_TX_LOADTILE, NA, + NA, NA, NA, NA, NA, NA); + /* Wait until all primitives are done */ + gDPLoadSync((*glistp)++); + gDPLoadBlock((*glistp)++, G_TX_LOADTILE, 0, 0, length, 0x0); + } + + for (tile = 0; tile <= level; tile ++) + { + Tmask = maskt-tile; + if (Tmask < 0){ + Tmask = 0; + } else { + Tshift = tile; + } + + Smask = masks-tile; + if (Smask < 0){ + Smask = 0; + } else { + Sshift = tile; + } + +/*** + rmonPrintf("tile, Tmask, Tshift, Smask, Sshift %d %d %d %d %d\n", + tile, Tmask, Tshift, Smask, Sshift); + rmonPrintf("%d\n",startTile); +***/ + + + gDPSetTile((*glistp)++,im->fmt, im->siz, (mipmap[tile].w*txlsize >> 4), + (mipmap[tile].addr >> 3), tile+startTile, pal, cmt, Tmask, Tshift, cms, + Smask, Sshift); + + gDPSetTileSize((*glistp)++,tile+startTile, (0 <> (shift-1)) ^ ((tt & 0x1) << 1)) << 1; + row = (((tt * tile->w + ss) * txlsize) >> 1) / TRAM_LSIZE; + addr = tile->addr + row * TRAM_WSIZE + bank; + + overlap = (i == 0) ? bank : overlap ^ bank; + + switch (size) + { + case G_IM_SIZ_4b: + texel[i] = (tram[addr + ((ss & 0x2) >> 1)] + & (0xf0 >> ((ss & 0x1) << 2))); + if (!(ss & 0x1)) texel[i] = texel[i] >> 4; + break; + + case G_IM_SIZ_8b: + texel[i] = tram[addr + (ss & 0x1)]; + break; + + case G_IM_SIZ_16b: + texel[i] = (tram[addr] << 8) | tram[addr+1]; + break; + + case G_IM_SIZ_32b: + errNo = 2; /* Format not supported */ + break; + + default: + break; + } + + } +} diff --git a/lib/ultralib/src/gu/lookat.c b/lib/ultralib/src/gu/lookat.c new file mode 100644 index 0000000..1fadc17 --- /dev/null +++ b/lib/ultralib/src/gu/lookat.c @@ -0,0 +1,83 @@ +/************************************************************************** + * * + * 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 guLookAtF(float mf[4][4], float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp) +{ + float len, xLook, yLook, zLook, xRight, yRight, zRight; + + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf (xLook*xLook + yLook*yLook + zLook*zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf (xRight*xRight + yRight*yRight + zRight*zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0 / sqrtf (xUp*xUp + yUp*yUp + zUp*zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} + +void guLookAt (Mtx *m, float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp) +{ + Matrix mf; + + guLookAtF(mf, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp); + + guMtxF2L(mf, m); +} diff --git a/lib/ultralib/src/gu/lookathil.c b/lib/ultralib/src/gu/lookathil.c new file mode 100644 index 0000000..a848688 --- /dev/null +++ b/lib/ultralib/src/gu/lookathil.c @@ -0,0 +1,185 @@ +/************************************************************************** + * * + * 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 guLookAtHiliteF(float mf[4][4], LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float xl1, float yl1, float zl1, /* light 1 direction */ + float xl2, float yl2, float zl2, /* light 2 direction */ + int twidth, int theight) /* highlight txtr size*/ +{ + float len, xLook, yLook, zLook, xRight, yRight, zRight; + float xHilite, yHilite, zHilite; + + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf (xLook*xLook + yLook*yLook + zLook*zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf (xRight*xRight + yRight*yRight + zRight*zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0 / sqrtf (xUp*xUp + yUp*yUp + zUp*zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + /* hilite vectors */ + + len = 1.0 / sqrtf (xl1*xl1 + yl1*yl1 + zl1*zl1); + xl1 *= len; + yl1 *= len; + zl1 *= len; + +#define THRESH2 0.1 + xHilite = xl1 + xLook; + yHilite = yl1 + yLook; + zHilite = zl1 + zLook; + + len = sqrtf (xHilite*xHilite + yHilite*yHilite + zHilite*zHilite); + + if (len>THRESH2) + { + len = 1.0 / len; + xHilite *= len; + yHilite *= len; + zHilite *= len; + + h->h.x1 = + twidth*4 + (xHilite*xRight + + yHilite*yRight + + zHilite*zRight)*twidth*2; + + h->h.y1 = + theight*4 + (xHilite*xUp + + yHilite*yUp + + zHilite*zUp)*theight*2; + } + else + { + h->h.x1 = twidth*2; + h->h.y1 = theight*2; + } + + len = 1.0 / sqrtf (xl2*xl2 + yl2*yl2 + zl2*zl2); + xl2 *= len; + yl2 *= len; + zl2 *= len; + + xHilite = xl2 + xLook; + yHilite = yl2 + yLook; + zHilite = zl2 + zLook; + len = sqrtf (xHilite*xHilite + yHilite*yHilite + zHilite*zHilite); + if (len>THRESH2) + { + len = 1.0 / len; + xHilite *= len; + yHilite *= len; + zHilite *= len; + + h->h.x2 = twidth*4 + + (xHilite*xRight + yHilite*yRight + zHilite*zRight)*twidth*2; + + h->h.y2 = theight*4 + + (xHilite*xUp + yHilite*yUp + zHilite*zUp)*theight*2; + } + else + { + h->h.x2 = twidth*2; + h->h.y2 = theight*2; + } + + /* reflectance vectors = Up and Right */ + + l->l[0].l.dir[0] = FTOFRAC8(xRight); + l->l[0].l.dir[1] = FTOFRAC8(yRight); + l->l[0].l.dir[2] = FTOFRAC8(zRight); + l->l[1].l.dir[0] = FTOFRAC8(xUp); + l->l[1].l.dir[1] = FTOFRAC8(yUp); + l->l[1].l.dir[2] = FTOFRAC8(zUp); + l->l[0].l.col[0] = 0x00; + l->l[0].l.col[1] = 0x00; + l->l[0].l.col[2] = 0x00; + l->l[0].l.pad1 = 0x00; + l->l[0].l.colc[0] = 0x00; + l->l[0].l.colc[1] = 0x00; + l->l[0].l.colc[2] = 0x00; + l->l[0].l.pad2 = 0x00; + l->l[1].l.col[0] = 0x00; + l->l[1].l.col[1] = 0x80; + l->l[1].l.col[2] = 0x00; + l->l[1].l.pad1 = 0x00; + l->l[1].l.colc[0] = 0x00; + l->l[1].l.colc[1] = 0x80; + l->l[1].l.colc[2] = 0x00; + l->l[1].l.pad2 = 0x00; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} + +void guLookAtHilite (Mtx *m, LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float xl1, float yl1, float zl1, /* light 1 direction */ + float xl2, float yl2, float zl2, /* light 2 direction */ + int twidth, int theight) /* highlight txtr size*/ +{ + Matrix mf; + + guLookAtHiliteF(mf, l, h, xEye, yEye, zEye, xAt, yAt, zAt, + xUp, yUp, zUp, xl1, yl1, zl1, xl2, yl2, zl2, + twidth, theight); + + guMtxF2L(mf, m); +} diff --git a/src/libultra/gu/lookatref.c b/lib/ultralib/src/gu/lookatref.c similarity index 78% rename from src/libultra/gu/lookatref.c rename to lib/ultralib/src/gu/lookatref.c index bce2013..3cd3b65 100644 --- a/src/libultra/gu/lookatref.c +++ b/lib/ultralib/src/gu/lookatref.c @@ -1,4 +1,17 @@ -#include +/************************************************************************** + * * + * 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 guLookAtReflectF(float mf[4][4], LookAt *l, float xEye, float yEye, float zEye, diff --git a/lib/ultralib/src/gu/lookatstereo.c b/lib/ultralib/src/gu/lookatstereo.c new file mode 100644 index 0000000..b60ca08 --- /dev/null +++ b/lib/ultralib/src/gu/lookatstereo.c @@ -0,0 +1,111 @@ +/************************************************************************** + * * + * 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 guLookAtStereoF(float mf[4][4], float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, float eyedist) +{ + float len, xLook, yLook, zLook, xRight, yRight, zRight; + + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf (xLook*xLook + yLook*yLook + zLook*zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf (xRight*xRight + yRight*yRight + zRight*zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Move eye for stereo */ + xEye += eyedist*xRight; + yEye += eyedist*yRight; + zEye += eyedist*zRight; + + /* recalculate using new eye */ + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf (xLook*xLook + yLook*yLook + zLook*zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf (xRight*xRight + yRight*yRight + zRight*zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0 / sqrtf (xUp*xUp + yUp*yUp + zUp*zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} + +void guLookAtStereo (Mtx *m, float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, float eyedist) +{ + Matrix mf; + + guLookAtStereoF(mf, xEye, yEye, zEye, xAt, yAt, zAt, + xUp, yUp, zUp, eyedist); + + guMtxF2L(mf, m); +} diff --git a/src/libultra/gu/mtxcatf.c b/lib/ultralib/src/gu/mtxcatf.c similarity index 77% rename from src/libultra/gu/mtxcatf.c rename to lib/ultralib/src/gu/mtxcatf.c index af2ae96..6572e0f 100644 --- a/src/libultra/gu/mtxcatf.c +++ b/lib/ultralib/src/gu/mtxcatf.c @@ -1,63 +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]; -} - + +/* + * 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/src/libultra/gu/mtxcatl.c b/lib/ultralib/src/gu/mtxcatl.c similarity index 96% rename from src/libultra/gu/mtxcatl.c rename to lib/ultralib/src/gu/mtxcatl.c index 36e3312..3f165bb 100644 --- a/src/libultra/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) { @@ -44,6 +45,7 @@ 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]; @@ -52,3 +54,4 @@ void guMtxXFML(Mtx *m, float x, float y, float z, float *ox, float *oy, float *o guMtxXFMF(mf, x, y, z, ox, oy, oz); } +#endif diff --git a/src/libultra/gu/mtxutil.c b/lib/ultralib/src/gu/mtxutil.c similarity index 100% rename from src/libultra/gu/mtxutil.c rename to lib/ultralib/src/gu/mtxutil.c diff --git a/src/libultra/gu/normalize.c b/lib/ultralib/src/gu/normalize.c similarity index 84% rename from src/libultra/gu/normalize.c rename to lib/ultralib/src/gu/normalize.c index b07848b..6884b29 100644 --- a/src/libultra/gu/normalize.c +++ b/lib/ultralib/src/gu/normalize.c @@ -1,23 +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; -} +/************************************************************************** + * * + * 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/src/libultra/gu/ortho.c b/lib/ultralib/src/gu/ortho.c similarity index 100% rename from src/libultra/gu/ortho.c rename to lib/ultralib/src/gu/ortho.c diff --git a/lib/ultralib/src/gu/parse_gbi.c b/lib/ultralib/src/gu/parse_gbi.c new file mode 100644 index 0000000..d736d4a --- /dev/null +++ b/lib/ultralib/src/gu/parse_gbi.c @@ -0,0 +1,139 @@ + +/************************************************************************** + * * + * 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 +#include +#include + +#ifndef _FINALROM + +/* + * guParseGbiDL works in conjunction with the dlprint tool. dlprint must be + * running on the host Indy. guParseGbiDL, sends a bunch of blocks of data, + * with a minimum of one display list, but typically, the principle display + * list with a bunch of branched or nested display lists, as well as all the + * vertex and matrix data that will be used. After all the blocks of data + * are sent, a GU_PARSE_READY command is sent, and dlprint parses out the + * data printing it to stdout. + * + * In order to know what data to send, guParseGbiDL must step through the + * display list, find all the gSPDisplayList and gSPBranchList calls, go + * to those lists, and also find and send info for all the matrix and vertex + * calls. + */ +void guParseGbiDL(u64 *gbi_dl, u32 nbytes, u8 flags) +{ + guDLPrintCB cntlBlk; + Gfx* dlStk[11]; + s32 dlcount = 0; + Gfx *curGfx,*dlPtr,*vaddr; + s8 op; + u32 *word0; + u32 *word1; + u32 segments[16]; + u32 param, seg; + u32 paddr,len; + + + cntlBlk.dataSize = nbytes; + cntlBlk.flags = flags; + cntlBlk.dlType = GU_PARSE_GBI_TYPE; + cntlBlk.paddr = osVirtualToPhysical(gbi_dl); + + osWriteHost(&cntlBlk,sizeof(cntlBlk)); + osWriteHost(gbi_dl,nbytes); + + dlStk[0] = (Gfx*)gbi_dl; + while((dlcount >= 0) && (dlcount <= 10)) + { + curGfx = dlStk[dlcount]; /* get the current graphics display list */ + op = *((s8*)curGfx); /* get the first byte */ + dlStk[dlcount]++; /* increment to next gfx command */ + switch(op) + { + case G_MOVEWORD: + word0 = (u32*)curGfx; /* get ptr to first word */ + if(((*word0) & 0x000000ff) == G_MW_SEGMENT) + { + u32 seg; + seg = (((*word0) & 0x00ffff00) >> 8) >> 2; + word1 = word0 + 1; + segments[seg] = *word1; + } + break; + case G_ENDDL: + dlcount--; + break; + case G_DL: + 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; + dlPtr = vaddr; + while((*(s8*)dlPtr) != G_ENDDL) + { + len++; + dlPtr++; + } + len *= sizeof(Gfx); + + cntlBlk.dataSize = len; + cntlBlk.dlType = GU_PARSE_GBI_TYPE; + cntlBlk.paddr = paddr; + + osWriteHost(&cntlBlk,sizeof(cntlBlk)); + osWriteHost((u8*)vaddr,len); + if(param == G_DL_PUSH) + { + if(dlcount < 10) + dlcount++; + else + osSyncPrintf("Display lists nested too deep!!!\n"); + } + dlStk[dlcount] = (Gfx*)vaddr; + break; + case G_VTX: + case G_MOVEMEM: + 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; + cntlBlk.dataSize = len; /* always send 32 bytes, the most used */ + cntlBlk.dlType = GU_PARSE_MEM_BLOCK; + cntlBlk.paddr = paddr; + osWriteHost(&cntlBlk,sizeof(cntlBlk)); + osWriteHost((u8*)vaddr,len); + break; + + } + } + + cntlBlk.dlType = GU_PARSE_READY; + osWriteHost(&cntlBlk,sizeof(cntlBlk)); +} + +#endif + diff --git a/lib/ultralib/src/gu/parse_rdp.c b/lib/ultralib/src/gu/parse_rdp.c new file mode 100644 index 0000000..c17c978 --- /dev/null +++ b/lib/ultralib/src/gu/parse_rdp.c @@ -0,0 +1,36 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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 +#include +#include + +/* guParseRdpDL works in conjunction with dlprint which must be running on + * the host Indy. guParseRdpDL simple uses the hostio routines to send the + * display list to the Indy, and dlprint does all the parsing. + */ + +#ifndef _FINALROM +void guParseRdpDL(u64 *rdp_dl, u64 nbytes, u8 flags) +{ + guDLPrintCB cntlBlk; + + cntlBlk.dataSize = nbytes; + cntlBlk.flags = flags; + cntlBlk.dlType = GU_PARSE_RDP_TYPE; + cntlBlk.paddr = osVirtualToPhysical(rdp_dl); + + osWriteHost(&cntlBlk,sizeof(cntlBlk)); + osWriteHost(rdp_dl,nbytes); + +} + +#endif diff --git a/lib/ultralib/src/gu/parse_string.c b/lib/ultralib/src/gu/parse_string.c new file mode 100644 index 0000000..71a58a8 --- /dev/null +++ b/lib/ultralib/src/gu/parse_string.c @@ -0,0 +1,35 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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 +#include +#include + +/* guParseString works in conjunction with dlprint which must be running on + * the host Indy. guParseString simply uses the hostio routines to send the + * string to the Indy, and dlprint does all the parsing. + */ + +#ifndef _FINALROM +void guParseString(char *StringPointer, u64 nbytes) +{ + guDLPrintCB cntlBlk; + + cntlBlk.dataSize = nbytes /* /8 + ((nbytes%8) != 0) */; + cntlBlk.dlType = GU_PARSE_STRING_TYPE; + cntlBlk.paddr = osVirtualToPhysical((u64 *) StringPointer); + + osWriteHost(&cntlBlk,sizeof(cntlBlk)); + osWriteHost((u64 *) StringPointer,nbytes); + +} + +#endif diff --git a/lib/ultralib/src/gu/perspective.c b/lib/ultralib/src/gu/perspective.c new file mode 100644 index 0000000..be571d4 --- /dev/null +++ b/lib/ultralib/src/gu/perspective.c @@ -0,0 +1,58 @@ + +/************************************************************************** + * * + * 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" +#include + +void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, float near, float far, float scale) +{ + float cot; + int i, j; + + guMtxIdentF(mf); + + fovy *= 3.1415926 / 180.0; + cot = cosf (fovy/2) / sinf (fovy/2); + + mf[0][0] = cot / aspect; + mf[1][1] = cot; + mf[2][2] = (near + far) / (near - far); + mf[2][3] = -1; + mf[3][2] = (2 * near * far) / (near - far); + mf[3][3] = 0; + + for (i=0; i<4; i++) + for (j=0; j<4; j++) + mf[i][j] *= scale; + + if (perspNorm != (u16 *) NULL) { + if (near+far<=2.0) { + *perspNorm = (u16) 0xFFFF; + } else { + *perspNorm = (u16) ((2.0*65536.0)/(near+far)); + if (*perspNorm<=0) + *perspNorm = (u16) 0x0001; + } + } +} + +void guPerspective(Mtx *m, u16 *perspNorm, float fovy, float aspect, float near, float far, float scale) +{ + Matrix mf; + + guPerspectiveF(mf, perspNorm, fovy, aspect, near, far, scale); + + guMtxF2L(mf, m); +} + + diff --git a/lib/ultralib/src/gu/position.c b/lib/ultralib/src/gu/position.c new file mode 100644 index 0000000..52cdd96 --- /dev/null +++ b/lib/ultralib/src/gu/position.c @@ -0,0 +1,73 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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" + +/* + * Return position matrix given roll, pitch, and yaw in degrees + * plus scale and position. + * + * r = roll (degrees) + * p = pitch (degrees) + * h = yaw (degrees) + * s = scale + * x,y,z = position (world coordinates) + * + */ + +void guPositionF(float mf[4][4], float r, float p, float h, float s, + float x, float y, float z) +{ + static float dtor = 3.1415926 / 180.0; + float sinr, sinp, sinh; + float cosr, cosp, cosh; + + r *= dtor; + p *= dtor; + h *= dtor; + sinr = sinf(r); + cosr = cosf(r); + sinp = sinf(p); + cosp = cosf(p); + sinh = sinf(h); + cosh = cosf(h); + + mf[0][0] = (cosp*cosh) * s; + mf[0][1] = (cosp*sinh) * s; + mf[0][2] = (-sinp) * s; + mf[0][3] = 0.0; + + mf[1][0] = (sinr*sinp*cosh - cosr*sinh) * s; + mf[1][1] = (sinr*sinp*sinh + cosr*cosh) * s; + mf[1][2] = (sinr*cosp) * s; + mf[1][3] = 0.0; + + mf[2][0] = (cosr*sinp*cosh + sinr*sinh) * s; + mf[2][1] = (cosr*sinp*sinh - sinr*cosh) * s; + mf[2][2] = (cosr*cosp) * s; + mf[2][3] = 0.0; + + mf[3][0] = x; + mf[3][1] = y; + mf[3][2] = z; + mf[3][3] = 1.0; +} + +void guPosition(Mtx *m, float r, float p, float h, float s, + float x, float y, float z) +{ + float mf[4][4]; + + guPositionF(mf, r, p, h, s, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/ultralib/src/gu/poslight.c b/lib/ultralib/src/gu/poslight.c new file mode 100644 index 0000000..389a04d --- /dev/null +++ b/lib/ultralib/src/gu/poslight.c @@ -0,0 +1,69 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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" + + +/* + * define a positional light. + * this function must be called anytime the light or object moves. + * + * pl = (input) positional light description. + * l = (output) directiona light description for gSPLight or gSPSetLightsN. + * *Ob = position of (center of) object to be lit. + * + */ +#define THRESH1 0.01 +#define THRESH2 0.1 +void guPosLight(PositionalLight *pl, Light *l, + float xOb, float yOb, float zOb) +{ + float x,y,z,d,a; + + + x = pl->pos[0]-xOb; + y = pl->pos[1]-yOb; + z = pl->pos[2]-zOb; + d = sqrtf(x*x + y*y + z*z); + + a = d*pl->a1 + pl->a2; + if (al.dir[0] = 0; + l->l.dir[1] = 0; + l->l.dir[2] = -120; + + l->l.col[0] = 0; + l->l.col[1] = 0; + l->l.col[2] = 0; + l->l.colc[0] = 0; + l->l.colc[1] = 0; + l->l.colc[2] = 0; + } else { + d = 1/d; + l->l.dir[0] = 120.0*x*d; + l->l.dir[1] = 120.0*y*d; + l->l.dir[2] = 120.0*z*d; + + l->l.col[0] = pl->col[0]*a; + l->l.col[1] = pl->col[1]*a; + l->l.col[2] = pl->col[2]*a; + l->l.colc[0] = pl->col[0]*a; + l->l.colc[1] = pl->col[1]*a; + l->l.colc[2] = pl->col[2]*a; + } + +} diff --git a/lib/ultralib/src/gu/poslighthil.c b/lib/ultralib/src/gu/poslighthil.c new file mode 100644 index 0000000..259fe8c --- /dev/null +++ b/lib/ultralib/src/gu/poslighthil.c @@ -0,0 +1,168 @@ +/************************************************************************** + * * + * Copyright (C) 1995, 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" + + +/* + * define 2 positional lights with highlights. + * this function must be called anytime the viewpoint, light or object moves. + * + * pl1 = (input) positional light#1 description. + * pl2 = (input) positional light#2 description. + * l1 = (output) directional light desc. #1 for gSPLight or gSPSetLightsN. + * l2 = (output) directional light desc. #2 for gSPLight or gSPSetLightsN. + * *Eye = position of eye (viewpoint). (usually same as in LookAt command.) + * *Ob = position of (center of) object to be lit. + * *Ob = up vector (usually same as in LookAt command). + * twidth = width of texture map used for highlight. + * theight = height of texture map used for highlight. + * + */ +#define THRESH2 0.01 +#define THRESH3 0.1 +void guPosLightHilite(PositionalLight *pl1, PositionalLight *pl2, + Light *l1, Light *l2, + LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xOb, float yOb, float zOb, + float xUp, float yUp, float zUp, + int twidth, int theight) /* hilite txtr size*/ +{ + float x,y,z,d,a; + Mtx m; + + +/* + * light 1, diffuse + */ + x = pl1->pos[0]-xOb; + y = pl1->pos[1]-yOb; + z = pl1->pos[2]-zOb; + d = sqrtf(x*x + y*y + z*z); + + a=d*pl1->a1 + pl1->a2; + if (al.dir[0] = 0; + l1->l.dir[1] = 0; + l1->l.dir[2] = -120; + + l1->l.col[0] = 0; + l1->l.col[1] = 0; + l1->l.col[2] = 0; + l1->l.colc[0] = 0; + l1->l.colc[1] = 0; + l1->l.colc[2] = 0; + } else { + d = 1/d; + l1->l.dir[0] = 120.0*x*d; + l1->l.dir[1] = 120.0*y*d; + l1->l.dir[2] = 120.0*z*d; + + l1->l.col[0] = pl1->col[0]*a; + l1->l.col[1] = pl1->col[1]*a; + l1->l.col[2] = pl1->col[2]*a; + l1->l.colc[0] = pl1->col[0]*a; + l1->l.colc[1] = pl1->col[1]*a; + l1->l.colc[2] = pl1->col[2]*a; + } + + +/* + * light 2, diffuse + */ + x = pl2->pos[0]-xOb; + y = pl2->pos[1]-yOb; + z = pl2->pos[2]-zOb; + d = sqrtf(x*x + y*y + z*z); + + a = d*pl2->a1 + pl2->a2; + if (al.dir[0] = 0; + l2->l.dir[1] = 0; + l2->l.dir[2] = -120; + + l2->l.col[0] = 0; + l2->l.col[1] = 0; + l2->l.col[2] = 0; + l2->l.colc[0] = 0; + l2->l.colc[1] = 0; + l2->l.colc[2] = 0; + } else { + d = 1/d; + l2->l.dir[0] = 120.0*x*d; + l2->l.dir[1] = 120.0*y*d; + l2->l.dir[2] = 120.0*z*d; + + l2->l.col[0] = pl2->col[0]*a; + l2->l.col[1] = pl2->col[1]*a; + l2->l.col[2] = pl2->col[2]*a; + l2->l.colc[0] = pl2->col[0]*a; + l2->l.colc[1] = pl2->col[1]*a; + l2->l.colc[2] = pl2->col[2]*a; + } + + +/* + * Hilight factors + */ + x = xOb-xEye; + y = yOb-yEye; + z = zOb-zEye; + if (sqrtf(x*x + y*y + z*z)h.x1 = twidth*2; + h->h.y1 = twidth*2; + h->h.x2 = twidth*2; + h->h.y2 = twidth*2; + l->l[0].l.dir[0] = 0; + l->l[0].l.dir[1] = 0; + l->l[0].l.dir[2] = 0; + l->l[1].l.dir[0] = 0; + l->l[1].l.dir[1] = 0; + l->l[1].l.dir[2] = 0; + l->l[0].l.col[0] = 0x00; + l->l[0].l.col[1] = 0x00; + l->l[0].l.col[2] = 0x00; + l->l[0].l.pad1 = 0x00; + l->l[0].l.colc[0] = 0x00; + l->l[0].l.colc[1] = 0x00; + l->l[0].l.colc[2] = 0x00; + l->l[0].l.pad2 = 0x00; + l->l[1].l.col[0] = 0x00; + l->l[1].l.col[1] = 0x80; + l->l[1].l.col[2] = 0x00; + l->l[1].l.pad1 = 0x00; + l->l[1].l.colc[0] = 0x00; + l->l[1].l.colc[1] = 0x80; + l->l[1].l.colc[2] = 0x00; + l->l[1].l.pad2 = 0x00; + } else { + guLookAtHilite(&m, l, h, + xEye, yEye, zEye, + xOb, yOb, zOb, + xUp, yUp, zUp, + l1->l.dir[0], l1->l.dir[1], l1->l.dir[2], + l2->l.dir[0], l2->l.dir[1], l2->l.dir[2], + twidth, theight); + } +} + diff --git a/src/libultra/gu/random.c b/lib/ultralib/src/gu/random.c similarity index 100% rename from src/libultra/gu/random.c rename to lib/ultralib/src/gu/random.c diff --git a/lib/ultralib/src/gu/readme.txt b/lib/ultralib/src/gu/readme.txt new file mode 100644 index 0000000..114174e --- /dev/null +++ b/lib/ultralib/src/gu/readme.txt @@ -0,0 +1,17 @@ +Among the gu Functions, the following were replaced with the newly +created high speed versions. With the current version OS they are +not being used. + +guMtxIdent +guMtxIdentF +guScale +guScaleF +guNormalize +guTranslate +guTranslateF +guMtxF2L +guRotateF +guMtxL2F +guMtxCatF + +The newly created functions are installed in the mgu directory. diff --git a/src/libultra/gu/rotate.c b/lib/ultralib/src/gu/rotate.c similarity index 54% rename from src/libultra/gu/rotate.c rename to lib/ultralib/src/gu/rotate.c index 7612729..c843d9f 100644 --- a/src/libultra/gu/rotate.c +++ b/lib/ultralib/src/gu/rotate.c @@ -11,50 +11,62 @@ **************************************************************************/ #include "guint.h" - -extern f32 __cosf(f32); +#include "os_version.h" void guRotateF(float mf[4][4], float a, float x, float y, float z) { - static float dtor = 3.1415926f / 180.0f; - float sine; - float cosine; - float ab, bc, ca, t; + static float dtor = 3.1415926 / 180.0; + 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; - + a *= dtor; sine = sinf(a); - cosine = __cosf(a); - t = 1 - cosine; - ab = x * y * t; - bc = y * z * t; - ca = z * x * t; + cosine = cosf(a); + t = (1-cosine); + ab = x*y*t; + bc = y*z*t; + ca = z*x*t; guMtxIdentF(mf); - t = x * x; - mf[0][0] = t + cosine * (1 - t); - mf[2][1] = bc - x * sine; - mf[1][2] = bc + x * sine; +#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 = y * y; - mf[1][1] = t + cosine * (1 - t); - mf[2][0] = ca + y * sine; - mf[0][2] = ca - y * sine; + t = x*x; + mf[0][0] = t+cosine*(1-t); + mf[2][1] = bc-xxsine; + mf[1][2] = bc+xxsine; - t = z * z; - mf[2][2] = t + cosine * (1 - t); - mf[1][0] = ab - z * sine; - mf[0][1] = ab + z * sine; + t = y*y; + mf[1][1] = t+cosine*(1-t); + mf[2][0] = ca+yxsine; + mf[0][2] = ca-yxsine; + + t = z*z; + mf[2][2] = t+cosine*(1-t); + mf[1][0] = ab-zxsine; + mf[0][1] = ab+zxsine; } void guRotate(Mtx *m, float a, float x, float y, float z) { - f32 mf[4][4]; + Matrix mf; guRotateF(mf, a, x, y, z); guMtxF2L(mf, m); -} \ No newline at end of file +} diff --git a/src/libultra/gu/rotateRPY.c b/lib/ultralib/src/gu/rotaterpy.c similarity index 82% rename from src/libultra/gu/rotateRPY.c rename to lib/ultralib/src/gu/rotaterpy.c index 7c8e2db..c239d21 100644 --- a/src/libultra/gu/rotateRPY.c +++ b/lib/ultralib/src/gu/rotaterpy.c @@ -12,13 +12,6 @@ #include "guint.h" -// conflict with gu.h -#define M_DTOR_2 (3.1415926f / 180.0f) - -extern float D_80103870; - -extern float __cosf(float angle); - /* * Return rotation matrix given roll, pitch, and yaw in degrees * @@ -26,22 +19,19 @@ extern float __cosf(float angle); void guRotateRPYF(float mf[4][4], float r, float p, float h) { - // float dtor = ; + static float dtor = 3.1415926 / 180.0; float sinr, sinp, sinh; float cosr, cosp, cosh; - r *= M_DTOR_2; - p *= M_DTOR_2; - h *= M_DTOR_2; - - D_80103870 = M_DTOR_2; - + r *= dtor; + p *= dtor; + h *= dtor; sinr = sinf(r); - cosr = __cosf(r); + cosr = cosf(r); sinp = sinf(p); - cosp = __cosf(p); + cosp = cosf(p); sinh = sinf(h); - cosh = __cosf(h); + cosh = cosf(h); guMtxIdentF(mf); 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/sinf.c b/lib/ultralib/src/gu/sinf.c new file mode 100644 index 0000000..f4bb1ad --- /dev/null +++ b/lib/ultralib/src/gu/sinf.c @@ -0,0 +1,157 @@ +/************************************************************************** + * * + * 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" + +/* ==================================================================== + * ==================================================================== + * + * Module: fsin.c + * $Revision: 1.3 $ + * $Date: 1998/10/09 06:14:51 $ + * $Author: has $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/libultra/monegi/gu/sinf.c,v $ + * + * Revision history: + * 09-Jun-93 - Original Version + * + * Description: source code for fsin function + * + * ==================================================================== + * ==================================================================== + */ + +#pragma weak fsin = __sinf +#pragma weak sinf = __sinf +#define fsin __sinf + +/* coefficients for polynomial approximation of sin on +/- pi/2 */ + +static const du P[] = +{ +{0x3ff00000, 0x00000000}, +{0xbfc55554, 0xbc83656d}, +{0x3f8110ed, 0x3804c2a0}, +{0xbf29f6ff, 0xeea56814}, +{0x3ec5dbdf, 0x0e314bfe}, +}; + +static const du rpi = +{0x3fd45f30, 0x6dc9c883}; + +static const du pihi = +{0x400921fb, 0x50000000}; + +static const du pilo = +{0x3e6110b4, 0x611a6263}; + +static const fu zero = {0x00000000}; + + +/* ==================================================================== + * + * FunctionName fsin + * + * Description computes sine of arg + * + * ==================================================================== + */ + +float +fsin( float x ) +{ +double dx, xsq, poly; +double dn; +int n; +double result; +int ix, xpt; + + + ix = *(int *)&x; + xpt = (ix >> 22); + xpt &= 0x1ff; + + /* xpt is exponent(x) + 1 bit of mantissa */ + + if ( xpt < 0xff ) + { + /* |x| < 1.5 */ + + dx = x; + + if ( xpt >= 0xe6 ) + { + /* |x| >= 2^(-12) */ + + /* compute sin(x) with a standard polynomial approximation */ + + xsq = dx*dx; + + poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + + result = dx + (dx*xsq)*poly; + + return ( (float)result ); + } + + return ( x ); + } + + if ( xpt < 0x136 ) + { + /* |x| < 2^28 */ + + dx = x; + + /* reduce argument to +/- pi/2 */ + + dn = dx*rpi.d; + + n = ROUND(dn); + dn = n; + + dx = dx - dn*pihi.d; + dx = dx - dn*pilo.d; /* dx = x - n*pi */ + + /* compute sin(dx) as before, negating result if n is odd + */ + + xsq = dx*dx; + + poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + + result = dx + (dx*xsq)*poly; + + + if ( (n & 1) == 0 ) + return ( (float)result ); + + return ( -(float)result ); + } + + if ( x != x ) + { + /* x is a NaN; return a quiet NaN */ + +#ifdef _IP_NAN_SETS_ERRNO + + *__errnoaddr = EDOM; +#endif + + return ( __libm_qnan_f ); + } + + /* just give up and return 0.0 */ + + return ( zero.f ); +} + diff --git a/lib/ultralib/src/gu/sins.c b/lib/ultralib/src/gu/sins.c new file mode 100644 index 0000000..b24851f --- /dev/null +++ b/lib/ultralib/src/gu/sins.c @@ -0,0 +1,61 @@ +/************************************************************************** + * * + * 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" + +/* ==================================================================== + * ==================================================================== + * + * Module: sins.c + * $Revision: 1.3 $ + * $Date: 1998/10/09 06:15:00 $ + * $Author: has $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/libultra/monegi/gu/sins.c,v $ + * + * ==================================================================== + * ==================================================================== + */ + +/* coefficients for polynomial approximation of sin on +/- pi/2 */ + +/* ==================================================================== + * + * FunctionName sins + * + * Description computes sine of arg + * + * ==================================================================== + */ + +#include "sintable.h" + +signed short +sins( unsigned short x ) +{ + /* 0 <= x < 0x10000 ==> 0 <= x < 2PI */ + + signed short val; + + x >>= 4; /* Now range 0 <= x < 0x1000 */ + + if (x & 0x400) { + val = sintable[0x3ff - (x & 0x3ff)]; + } else { + val = sintable[x & 0x3ff]; + } + + if (x & 0x800) { + return -val; + } else { + return val; + } +} diff --git a/lib/ultralib/src/gu/sintable.h b/lib/ultralib/src/gu/sintable.h new file mode 100644 index 0000000..b5e1a45 --- /dev/null +++ b/lib/ultralib/src/gu/sintable.h @@ -0,0 +1,1031 @@ + +/* + * Do not edit this file -- it was generated by "maketable". + */ + +static signed short sintable[0x400] = { + 0x0000, + 0x0032, + 0x0064, + 0x0096, + 0x00c9, + 0x00fb, + 0x012d, + 0x0160, + 0x0192, + 0x01c4, + 0x01f7, + 0x0229, + 0x025b, + 0x028e, + 0x02c0, + 0x02f2, + 0x0324, + 0x0357, + 0x0389, + 0x03bb, + 0x03ee, + 0x0420, + 0x0452, + 0x0484, + 0x04b7, + 0x04e9, + 0x051b, + 0x054e, + 0x0580, + 0x05b2, + 0x05e4, + 0x0617, + 0x0649, + 0x067b, + 0x06ad, + 0x06e0, + 0x0712, + 0x0744, + 0x0776, + 0x07a9, + 0x07db, + 0x080d, + 0x083f, + 0x0871, + 0x08a4, + 0x08d6, + 0x0908, + 0x093a, + 0x096c, + 0x099f, + 0x09d1, + 0x0a03, + 0x0a35, + 0x0a67, + 0x0a99, + 0x0acb, + 0x0afe, + 0x0b30, + 0x0b62, + 0x0b94, + 0x0bc6, + 0x0bf8, + 0x0c2a, + 0x0c5c, + 0x0c8e, + 0x0cc0, + 0x0cf2, + 0x0d25, + 0x0d57, + 0x0d89, + 0x0dbb, + 0x0ded, + 0x0e1f, + 0x0e51, + 0x0e83, + 0x0eb5, + 0x0ee7, + 0x0f19, + 0x0f4b, + 0x0f7c, + 0x0fae, + 0x0fe0, + 0x1012, + 0x1044, + 0x1076, + 0x10a8, + 0x10da, + 0x110c, + 0x113e, + 0x116f, + 0x11a1, + 0x11d3, + 0x1205, + 0x1237, + 0x1269, + 0x129a, + 0x12cc, + 0x12fe, + 0x1330, + 0x1361, + 0x1393, + 0x13c5, + 0x13f6, + 0x1428, + 0x145a, + 0x148c, + 0x14bd, + 0x14ef, + 0x1520, + 0x1552, + 0x1584, + 0x15b5, + 0x15e7, + 0x1618, + 0x164a, + 0x167b, + 0x16ad, + 0x16df, + 0x1710, + 0x1741, + 0x1773, + 0x17a4, + 0x17d6, + 0x1807, + 0x1839, + 0x186a, + 0x189b, + 0x18cd, + 0x18fe, + 0x1930, + 0x1961, + 0x1992, + 0x19c3, + 0x19f5, + 0x1a26, + 0x1a57, + 0x1a88, + 0x1aba, + 0x1aeb, + 0x1b1c, + 0x1b4d, + 0x1b7e, + 0x1baf, + 0x1be1, + 0x1c12, + 0x1c43, + 0x1c74, + 0x1ca5, + 0x1cd6, + 0x1d07, + 0x1d38, + 0x1d69, + 0x1d9a, + 0x1dcb, + 0x1dfc, + 0x1e2d, + 0x1e5d, + 0x1e8e, + 0x1ebf, + 0x1ef0, + 0x1f21, + 0x1f52, + 0x1f82, + 0x1fb3, + 0x1fe4, + 0x2015, + 0x2045, + 0x2076, + 0x20a7, + 0x20d7, + 0x2108, + 0x2139, + 0x2169, + 0x219a, + 0x21ca, + 0x21fb, + 0x222b, + 0x225c, + 0x228c, + 0x22bd, + 0x22ed, + 0x231d, + 0x234e, + 0x237e, + 0x23ae, + 0x23df, + 0x240f, + 0x243f, + 0x2470, + 0x24a0, + 0x24d0, + 0x2500, + 0x2530, + 0x2560, + 0x2591, + 0x25c1, + 0x25f1, + 0x2621, + 0x2651, + 0x2681, + 0x26b1, + 0x26e1, + 0x2711, + 0x2740, + 0x2770, + 0x27a0, + 0x27d0, + 0x2800, + 0x2830, + 0x285f, + 0x288f, + 0x28bf, + 0x28ee, + 0x291e, + 0x294e, + 0x297d, + 0x29ad, + 0x29dd, + 0x2a0c, + 0x2a3c, + 0x2a6b, + 0x2a9b, + 0x2aca, + 0x2af9, + 0x2b29, + 0x2b58, + 0x2b87, + 0x2bb7, + 0x2be6, + 0x2c15, + 0x2c44, + 0x2c74, + 0x2ca3, + 0x2cd2, + 0x2d01, + 0x2d30, + 0x2d5f, + 0x2d8e, + 0x2dbd, + 0x2dec, + 0x2e1b, + 0x2e4a, + 0x2e79, + 0x2ea8, + 0x2ed7, + 0x2f06, + 0x2f34, + 0x2f63, + 0x2f92, + 0x2fc0, + 0x2fef, + 0x301e, + 0x304c, + 0x307b, + 0x30a9, + 0x30d8, + 0x3107, + 0x3135, + 0x3163, + 0x3192, + 0x31c0, + 0x31ef, + 0x321d, + 0x324b, + 0x3279, + 0x32a8, + 0x32d6, + 0x3304, + 0x3332, + 0x3360, + 0x338e, + 0x33bc, + 0x33ea, + 0x3418, + 0x3446, + 0x3474, + 0x34a2, + 0x34d0, + 0x34fe, + 0x352b, + 0x3559, + 0x3587, + 0x35b5, + 0x35e2, + 0x3610, + 0x363d, + 0x366b, + 0x3698, + 0x36c6, + 0x36f3, + 0x3721, + 0x374e, + 0x377c, + 0x37a9, + 0x37d6, + 0x3803, + 0x3831, + 0x385e, + 0x388b, + 0x38b8, + 0x38e5, + 0x3912, + 0x393f, + 0x396c, + 0x3999, + 0x39c6, + 0x39f3, + 0x3a20, + 0x3a4d, + 0x3a79, + 0x3aa6, + 0x3ad3, + 0x3b00, + 0x3b2c, + 0x3b59, + 0x3b85, + 0x3bb2, + 0x3bde, + 0x3c0b, + 0x3c37, + 0x3c64, + 0x3c90, + 0x3cbc, + 0x3ce9, + 0x3d15, + 0x3d41, + 0x3d6d, + 0x3d99, + 0x3dc5, + 0x3df1, + 0x3e1d, + 0x3e49, + 0x3e75, + 0x3ea1, + 0x3ecd, + 0x3ef9, + 0x3f25, + 0x3f50, + 0x3f7c, + 0x3fa8, + 0x3fd3, + 0x3fff, + 0x402b, + 0x4056, + 0x4082, + 0x40ad, + 0x40d8, + 0x4104, + 0x412f, + 0x415a, + 0x4186, + 0x41b1, + 0x41dc, + 0x4207, + 0x4232, + 0x425d, + 0x4288, + 0x42b3, + 0x42de, + 0x4309, + 0x4334, + 0x435f, + 0x4389, + 0x43b4, + 0x43df, + 0x4409, + 0x4434, + 0x445f, + 0x4489, + 0x44b4, + 0x44de, + 0x4508, + 0x4533, + 0x455d, + 0x4587, + 0x45b1, + 0x45dc, + 0x4606, + 0x4630, + 0x465a, + 0x4684, + 0x46ae, + 0x46d8, + 0x4702, + 0x472c, + 0x4755, + 0x477f, + 0x47a9, + 0x47d2, + 0x47fc, + 0x4826, + 0x484f, + 0x4879, + 0x48a2, + 0x48cc, + 0x48f5, + 0x491e, + 0x4948, + 0x4971, + 0x499a, + 0x49c3, + 0x49ec, + 0x4a15, + 0x4a3e, + 0x4a67, + 0x4a90, + 0x4ab9, + 0x4ae2, + 0x4b0b, + 0x4b33, + 0x4b5c, + 0x4b85, + 0x4bad, + 0x4bd6, + 0x4bfe, + 0x4c27, + 0x4c4f, + 0x4c78, + 0x4ca0, + 0x4cc8, + 0x4cf0, + 0x4d19, + 0x4d41, + 0x4d69, + 0x4d91, + 0x4db9, + 0x4de1, + 0x4e09, + 0x4e31, + 0x4e58, + 0x4e80, + 0x4ea8, + 0x4ed0, + 0x4ef7, + 0x4f1f, + 0x4f46, + 0x4f6e, + 0x4f95, + 0x4fbd, + 0x4fe4, + 0x500b, + 0x5032, + 0x505a, + 0x5081, + 0x50a8, + 0x50cf, + 0x50f6, + 0x511d, + 0x5144, + 0x516b, + 0x5191, + 0x51b8, + 0x51df, + 0x5205, + 0x522c, + 0x5253, + 0x5279, + 0x52a0, + 0x52c6, + 0x52ec, + 0x5313, + 0x5339, + 0x535f, + 0x5385, + 0x53ab, + 0x53d1, + 0x53f7, + 0x541d, + 0x5443, + 0x5469, + 0x548f, + 0x54b5, + 0x54da, + 0x5500, + 0x5525, + 0x554b, + 0x5571, + 0x5596, + 0x55bb, + 0x55e1, + 0x5606, + 0x562b, + 0x5650, + 0x5675, + 0x569b, + 0x56c0, + 0x56e5, + 0x5709, + 0x572e, + 0x5753, + 0x5778, + 0x579d, + 0x57c1, + 0x57e6, + 0x580a, + 0x582f, + 0x5853, + 0x5878, + 0x589c, + 0x58c0, + 0x58e5, + 0x5909, + 0x592d, + 0x5951, + 0x5975, + 0x5999, + 0x59bd, + 0x59e1, + 0x5a04, + 0x5a28, + 0x5a4c, + 0x5a6f, + 0x5a93, + 0x5ab7, + 0x5ada, + 0x5afd, + 0x5b21, + 0x5b44, + 0x5b67, + 0x5b8b, + 0x5bae, + 0x5bd1, + 0x5bf4, + 0x5c17, + 0x5c3a, + 0x5c5d, + 0x5c7f, + 0x5ca2, + 0x5cc5, + 0x5ce7, + 0x5d0a, + 0x5d2d, + 0x5d4f, + 0x5d71, + 0x5d94, + 0x5db6, + 0x5dd8, + 0x5dfa, + 0x5e1d, + 0x5e3f, + 0x5e61, + 0x5e83, + 0x5ea5, + 0x5ec6, + 0x5ee8, + 0x5f0a, + 0x5f2c, + 0x5f4d, + 0x5f6f, + 0x5f90, + 0x5fb2, + 0x5fd3, + 0x5ff4, + 0x6016, + 0x6037, + 0x6058, + 0x6079, + 0x609a, + 0x60bb, + 0x60dc, + 0x60fd, + 0x611e, + 0x613e, + 0x615f, + 0x6180, + 0x61a0, + 0x61c1, + 0x61e1, + 0x6202, + 0x6222, + 0x6242, + 0x6263, + 0x6283, + 0x62a3, + 0x62c3, + 0x62e3, + 0x6303, + 0x6323, + 0x6342, + 0x6362, + 0x6382, + 0x63a1, + 0x63c1, + 0x63e0, + 0x6400, + 0x641f, + 0x643f, + 0x645e, + 0x647d, + 0x649c, + 0x64bb, + 0x64da, + 0x64f9, + 0x6518, + 0x6537, + 0x6556, + 0x6574, + 0x6593, + 0x65b2, + 0x65d0, + 0x65ef, + 0x660d, + 0x662b, + 0x664a, + 0x6668, + 0x6686, + 0x66a4, + 0x66c2, + 0x66e0, + 0x66fe, + 0x671c, + 0x673a, + 0x6757, + 0x6775, + 0x6792, + 0x67b0, + 0x67cd, + 0x67eb, + 0x6808, + 0x6825, + 0x6843, + 0x6860, + 0x687d, + 0x689a, + 0x68b7, + 0x68d4, + 0x68f1, + 0x690d, + 0x692a, + 0x6947, + 0x6963, + 0x6980, + 0x699c, + 0x69b9, + 0x69d5, + 0x69f1, + 0x6a0e, + 0x6a2a, + 0x6a46, + 0x6a62, + 0x6a7e, + 0x6a9a, + 0x6ab5, + 0x6ad1, + 0x6aed, + 0x6b08, + 0x6b24, + 0x6b40, + 0x6b5b, + 0x6b76, + 0x6b92, + 0x6bad, + 0x6bc8, + 0x6be3, + 0x6bfe, + 0x6c19, + 0x6c34, + 0x6c4f, + 0x6c6a, + 0x6c84, + 0x6c9f, + 0x6cba, + 0x6cd4, + 0x6cef, + 0x6d09, + 0x6d23, + 0x6d3e, + 0x6d58, + 0x6d72, + 0x6d8c, + 0x6da6, + 0x6dc0, + 0x6dda, + 0x6df3, + 0x6e0d, + 0x6e27, + 0x6e40, + 0x6e5a, + 0x6e73, + 0x6e8d, + 0x6ea6, + 0x6ebf, + 0x6ed9, + 0x6ef2, + 0x6f0b, + 0x6f24, + 0x6f3d, + 0x6f55, + 0x6f6e, + 0x6f87, + 0x6fa0, + 0x6fb8, + 0x6fd1, + 0x6fe9, + 0x7002, + 0x701a, + 0x7032, + 0x704a, + 0x7062, + 0x707a, + 0x7092, + 0x70aa, + 0x70c2, + 0x70da, + 0x70f2, + 0x7109, + 0x7121, + 0x7138, + 0x7150, + 0x7167, + 0x717e, + 0x7196, + 0x71ad, + 0x71c4, + 0x71db, + 0x71f2, + 0x7209, + 0x7220, + 0x7236, + 0x724d, + 0x7264, + 0x727a, + 0x7291, + 0x72a7, + 0x72bd, + 0x72d4, + 0x72ea, + 0x7300, + 0x7316, + 0x732c, + 0x7342, + 0x7358, + 0x736e, + 0x7383, + 0x7399, + 0x73ae, + 0x73c4, + 0x73d9, + 0x73ef, + 0x7404, + 0x7419, + 0x742e, + 0x7443, + 0x7458, + 0x746d, + 0x7482, + 0x7497, + 0x74ac, + 0x74c0, + 0x74d5, + 0x74ea, + 0x74fe, + 0x7512, + 0x7527, + 0x753b, + 0x754f, + 0x7563, + 0x7577, + 0x758b, + 0x759f, + 0x75b3, + 0x75c7, + 0x75da, + 0x75ee, + 0x7601, + 0x7615, + 0x7628, + 0x763b, + 0x764f, + 0x7662, + 0x7675, + 0x7688, + 0x769b, + 0x76ae, + 0x76c1, + 0x76d3, + 0x76e6, + 0x76f9, + 0x770b, + 0x771e, + 0x7730, + 0x7742, + 0x7754, + 0x7767, + 0x7779, + 0x778b, + 0x779d, + 0x77af, + 0x77c0, + 0x77d2, + 0x77e4, + 0x77f5, + 0x7807, + 0x7818, + 0x782a, + 0x783b, + 0x784c, + 0x785d, + 0x786e, + 0x787f, + 0x7890, + 0x78a1, + 0x78b2, + 0x78c3, + 0x78d3, + 0x78e4, + 0x78f4, + 0x7905, + 0x7915, + 0x7925, + 0x7936, + 0x7946, + 0x7956, + 0x7966, + 0x7976, + 0x7985, + 0x7995, + 0x79a5, + 0x79b5, + 0x79c4, + 0x79d4, + 0x79e3, + 0x79f2, + 0x7a02, + 0x7a11, + 0x7a20, + 0x7a2f, + 0x7a3e, + 0x7a4d, + 0x7a5b, + 0x7a6a, + 0x7a79, + 0x7a87, + 0x7a96, + 0x7aa4, + 0x7ab3, + 0x7ac1, + 0x7acf, + 0x7add, + 0x7aeb, + 0x7af9, + 0x7b07, + 0x7b15, + 0x7b23, + 0x7b31, + 0x7b3e, + 0x7b4c, + 0x7b59, + 0x7b67, + 0x7b74, + 0x7b81, + 0x7b8e, + 0x7b9b, + 0x7ba8, + 0x7bb5, + 0x7bc2, + 0x7bcf, + 0x7bdc, + 0x7be8, + 0x7bf5, + 0x7c02, + 0x7c0e, + 0x7c1a, + 0x7c27, + 0x7c33, + 0x7c3f, + 0x7c4b, + 0x7c57, + 0x7c63, + 0x7c6f, + 0x7c7a, + 0x7c86, + 0x7c92, + 0x7c9d, + 0x7ca9, + 0x7cb4, + 0x7cbf, + 0x7ccb, + 0x7cd6, + 0x7ce1, + 0x7cec, + 0x7cf7, + 0x7d02, + 0x7d0c, + 0x7d17, + 0x7d22, + 0x7d2c, + 0x7d37, + 0x7d41, + 0x7d4b, + 0x7d56, + 0x7d60, + 0x7d6a, + 0x7d74, + 0x7d7e, + 0x7d88, + 0x7d91, + 0x7d9b, + 0x7da5, + 0x7dae, + 0x7db8, + 0x7dc1, + 0x7dcb, + 0x7dd4, + 0x7ddd, + 0x7de6, + 0x7def, + 0x7df8, + 0x7e01, + 0x7e0a, + 0x7e13, + 0x7e1b, + 0x7e24, + 0x7e2c, + 0x7e35, + 0x7e3d, + 0x7e45, + 0x7e4d, + 0x7e56, + 0x7e5e, + 0x7e66, + 0x7e6d, + 0x7e75, + 0x7e7d, + 0x7e85, + 0x7e8c, + 0x7e94, + 0x7e9b, + 0x7ea3, + 0x7eaa, + 0x7eb1, + 0x7eb8, + 0x7ebf, + 0x7ec6, + 0x7ecd, + 0x7ed4, + 0x7edb, + 0x7ee1, + 0x7ee8, + 0x7eee, + 0x7ef5, + 0x7efb, + 0x7f01, + 0x7f08, + 0x7f0e, + 0x7f14, + 0x7f1a, + 0x7f20, + 0x7f25, + 0x7f2b, + 0x7f31, + 0x7f36, + 0x7f3c, + 0x7f41, + 0x7f47, + 0x7f4c, + 0x7f51, + 0x7f56, + 0x7f5b, + 0x7f60, + 0x7f65, + 0x7f6a, + 0x7f6f, + 0x7f74, + 0x7f78, + 0x7f7d, + 0x7f81, + 0x7f85, + 0x7f8a, + 0x7f8e, + 0x7f92, + 0x7f96, + 0x7f9a, + 0x7f9e, + 0x7fa2, + 0x7fa6, + 0x7fa9, + 0x7fad, + 0x7fb0, + 0x7fb4, + 0x7fb7, + 0x7fba, + 0x7fbe, + 0x7fc1, + 0x7fc4, + 0x7fc7, + 0x7fca, + 0x7fcc, + 0x7fcf, + 0x7fd2, + 0x7fd4, + 0x7fd7, + 0x7fd9, + 0x7fdc, + 0x7fde, + 0x7fe0, + 0x7fe2, + 0x7fe4, + 0x7fe6, + 0x7fe8, + 0x7fea, + 0x7fec, + 0x7fed, + 0x7fef, + 0x7ff1, + 0x7ff2, + 0x7ff3, + 0x7ff5, + 0x7ff6, + 0x7ff7, + 0x7ff8, + 0x7ff9, + 0x7ffa, + 0x7ffb, + 0x7ffb, + 0x7ffc, + 0x7ffd, + 0x7ffd, + 0x7ffe, + 0x7ffe, + 0x7ffe, + 0x7ffe, + 0x7ffe, + 0x7fff, +}; diff --git a/lib/ultralib/src/gu/sqrtf.s b/lib/ultralib/src/gu/sqrtf.s new file mode 100644 index 0000000..475a827 --- /dev/null +++ b/lib/ultralib/src/gu/sqrtf.s @@ -0,0 +1,25 @@ +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/* + * Due to compiler bug, it won't insert a sqrt.s opcode in the stream so we + * make a function and call it for now. When compiler fixed, also remove the + * seperate Makefile rules + */ + +#include "sys/asm.h" +#include "sys/regdef.h" + +LEAF(sqrtf) + sqrt.s fv0, fa0 + j ra +END(sqrtf) diff --git a/src/libultra/gu/translate.c b/lib/ultralib/src/gu/translate.c similarity index 81% rename from src/libultra/gu/translate.c rename to lib/ultralib/src/gu/translate.c index 8e46be0..f086f39 100644 --- a/src/libultra/gu/translate.c +++ b/lib/ultralib/src/gu/translate.c @@ -1,31 +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); -} +/************************************************************************** + * * + * 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 new file mode 100644 index 0000000..92f42bb --- /dev/null +++ b/lib/ultralib/src/gu/us2dex.c @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------- + $Id: us2dex.c,v 1.4 1998/10/09 06:15:30 has Exp $ + + File : us2dex.c + + Coded by Yoshitaka Yasumoto. Mar 19, 1997. + Copyright by Nintendo, Co., Ltd. 1997. + ---------------------------------------------------------------------*/ +#include +#include + +/* + * Routines that support processing of S2DEX microcode + */ + +/* + * guS2DInitBG + * Set BG screen draw parameters + * + * If called at time of initialization, then it only needs to be + * called again when changes made to imageFmt, imageSiz, imageLoad, * imageW, frameW. However, if imageLoad == G_BGLT_LOADBLOCK and * only frameW is changed, another call is unnecessary. + */ +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. + */ + tmemUse = (bg->b.imageFmt == G_IM_FMT_CI) ? 256 : 512; + + /* + * Get shift volume for conversion to TMEM word. + */ + shift = 6 - bg->b.imageSiz; + + /* + * Set other parameters for Load Mode. + */ + if (bg->b.imageLoad == G_BGLT_LOADBLOCK){ + bg->b.tmemW = bg->b.imageW >> shift; + bg->b.tmemH = (tmemUse / bg->b.tmemW) << 2; + bg->b.tmemSizeW = bg->b.tmemW << 1; + bg->b.tmemSize = bg->b.tmemH * bg->b.tmemSizeW; + 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; + tsize = bg->b.tmemH * bg->b.tmemSizeW; + 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; +} + +/*======== End of us2dex.c ========*/ diff --git a/lib/ultralib/src/gu/us2dex2_emu.c b/lib/ultralib/src/gu/us2dex2_emu.c new file mode 100644 index 0000000..cc32179 --- /dev/null +++ b/lib/ultralib/src/gu/us2dex2_emu.c @@ -0,0 +1,12 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998, Nintendo. + + File us2dex2_emu.c + Coded by Yoshitaka Yasumoto. Apr 10, 1998. + + $Id: us2dex2_emu.c,v 1.3 1998/10/09 06:15:40 has Exp $ + *---------------------------------------------------------------------*/ +#define F3DEX_GBI_2 +#include "us2dex_emu.c" + +/*======== End of us2dex2_emu.c ========*/ diff --git a/lib/ultralib/src/gu/us2dex_emu.c b/lib/ultralib/src/gu/us2dex_emu.c new file mode 100644 index 0000000..c0a9e30 --- /dev/null +++ b/lib/ultralib/src/gu/us2dex_emu.c @@ -0,0 +1,521 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998, Nintendo. + + File us2dex_emu.c + Coded by Yoshitaka Yasumoto. Apr 9, 1998. + + $Id: us2dex_emu.c,v 1.9 1999/07/08 05:02:04 yurugi Exp $ + *---------------------------------------------------------------------*/ +#define F3DEX_GBI +#include +#include + +#define RSP_DEBUG + +static u16 scissorX0 = 0; /* (s13.2) */ +static u16 scissorY0 = 0; /* (s13.2) */ +static u16 scissorX1 = 320<<2; /* (s13.2) */ +static u16 scissorY1 = 240<<2; /* (s13.2) */ +static u8 flagBilerp = 0; + +static u32 rdpSetTimg_w0, rdpSetTile_w0; +static u16 tmemSliceWmax; +static u16 imageSrcWsize; +static s16 flagSplit; +static u16 imagePtrX0; +static u32 imageTop; +static s16 tmemSrcLines; + +/* Addition 99/05/31(Y) */ +#if BUILD_VERSION >= VERSION_K +static s8 bgflg; +#endif + +/*----------------------------------------------------------------------------* + * Set scissoring parameters + * *---------------------------------------------------------------------------*/ +void guS2DEmuSetScissor(u32 ulx, u32 uly, u32 lrx, u32 lry, u8 flag) +{ + scissorX0 = (u16)ulx << 2; + scissorY0 = (u16)uly << 2; + scissorX1 = (u16)lrx << 2; + scissorY1 = (u16)lry << 2; + flagBilerp = (flag) ? 1 : 0; +} + +/*---------------------------------------------------------------------------* + * Create texture load RDP commands + *---------------------------------------------------------------------------*/ +static void tmemLoad_B(Gfx **pkt, u32 imagePtr, s16 loadLines, s16 tmemSH) +{ + /* + * Load 16-bit texture of tmemSH word width starting from imagePtr + * into the loadLines amount of lines of tmem. + */ + + /* [SetTImg] CMD=0x3d FMT=RGBA(0) SIZ=16b(2) */ + (*pkt)->words.w0 = rdpSetTimg_w0; + (*pkt)->words.w1 = imagePtr; + (*pkt) ++; + + /* [LoadSync] Wait for completion of preceding primitive draw */ + (*pkt)->words.w0 = (G_RDPLOADSYNC<<24); + (*pkt) ++; + + /* [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) ++; +} + +static void tmemLoad_A(Gfx **pkt, u32 imagePtr, + s16 loadLines, s16 tmemAdrs, s16 tmemSH) +{ + /* + * Load 16-bit texture of tmemSH word width starting from imagePtr into + * the loadLines amount of lines of the tmemAdrs of tmem. + */ + + /* [TileSync] Wait for completion of Tile access of preceding command */ + (*pkt)->words.w0 = 0xe8000000; + (*pkt) ++; + + /* [SetTile] */ + (*pkt)->words.w0 = rdpSetTile_w0|tmemAdrs; + (*pkt)->words.w1 = 0x07000000; + (*pkt) ++; + + tmemLoad_B(pkt, imagePtr, loadLines, tmemSH); +} + +static void tmemLoad(Gfx **pkt, u32 *imagePtr, + s16 *imageRemain, s16 drawLines, s16 flagBilerp) +{ + s16 loadLines = drawLines + flagBilerp; + s16 iLoadable = (*imageRemain) - flagSplit; + + if (iLoadable >= loadLines){ /* If load can be done all at once */ + tmemLoad_B(pkt, *imagePtr, loadLines, tmemSliceWmax); + (*imagePtr) += imageSrcWsize * drawLines; + (*imageRemain) -= drawLines; + + } else { /* If load is to be partitioned */ + s16 SubSliceL2, SubSliceD2, SubSliceY2; + u32 imageTopSeg = imageTop & 0xff000000; + + SubSliceY2 = *imageRemain; + SubSliceL2 = loadLines - SubSliceY2; + SubSliceD2 = drawLines - SubSliceY2; + + if (SubSliceL2 > 0){ + u32 imagePtr2; + + imagePtr2 = imageTop + imagePtrX0; + if (SubSliceY2 & 1){ + imagePtr2 -= imageSrcWsize; + imagePtr2 = imageTopSeg | (imagePtr2 & 0x00ffffff); /*Segment counterm */ + SubSliceY2 --; + SubSliceL2 ++; + } + tmemLoad_A(pkt, imagePtr2, + SubSliceL2, SubSliceY2 * tmemSliceWmax, tmemSliceWmax); + } + if (flagSplit){ + u32 imagePtr1A, imagePtr1B; + s16 SubSliceY1, SubSliceL1; + s16 tmemSH_A, tmemSH_B; + + imagePtr1A = (*imagePtr) + iLoadable * imageSrcWsize; + imagePtr1B = imageTop; + SubSliceY1 = iLoadable; + if (SubSliceL1 = iLoadable & 1){ + imagePtr1A -= imageSrcWsize; + imagePtr1B -= imageSrcWsize; + imagePtr1B = imageTopSeg | (imagePtr1B & 0x00ffffff); /*Segment countermeasure */ + SubSliceY1 --; + } + SubSliceL1 ++; + tmemSH_A = (imageSrcWsize - imagePtrX0) >> 3; + tmemSH_B = tmemSliceWmax - tmemSH_A; + tmemLoad_A(pkt, imagePtr1B, + SubSliceL1, SubSliceY1 * tmemSliceWmax + tmemSH_A, tmemSH_B); + tmemLoad_A(pkt, imagePtr1A, + SubSliceL1, SubSliceY1 * tmemSliceWmax, tmemSH_A); + } + if (iLoadable > 0){ + + tmemLoad_A(pkt, *imagePtr, iLoadable, 0, tmemSliceWmax); + + } else { + + /* [SetTile] */ + (*pkt)->words.w0 = rdpSetTile_w0; + (*pkt)->words.w1 = 0x07000000; + (*pkt) ++; + } + + (*imageRemain) -= drawLines; + if ((*imageRemain) > 0){ + (*imagePtr) += imageSrcWsize * drawLines; + } else { + (*imageRemain) = tmemSrcLines - SubSliceD2; + (*imagePtr) = imageTop + SubSliceD2 * imageSrcWsize + imagePtrX0; + } + + } +} + +/*---------------------------------------------------------------------------* + * Scalable BG serface draw process + *---------------------------------------------------------------------------*/ +void guS2DEmuBgRect1Cyc(Gfx **pkt, uObjBg *bg) +{ + s16 frameX0, frameX1, framePtrY0, frameRemain; + s16 imageX0, imageY0, imageSliceW, imageW; + s32 imageYorig; + s16 scaleW, scaleH; + + s16 imageSrcW, imageSrcH; + s16 tmemSliceLines, imageSliceLines; + s32 frameSliceLines, frameSliceCount; + u16 imageS, imageT; + u32 imagePtr; + + s16 imageISliceL0, imageIY0; + s32 frameLSliceL0; + + scaleW = bg->s.scaleW; + 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 + + +{ + /*-------------------------------------------------* + Scissoring process + *-------------------------------------------------*/ + /* + / frameX0, frameX1, framePtrY0, frameRemain + / imageX0, imageY0, tmemSliceW + / imageSrcW, imageSrcH + */ + s16 pixX0, pixY0, pixX1, pixY1; /* (s13.2) */ + s16 frameY0, frameW, frameH; + s32 frameWmax, frameHmax; + + /* Determine maximum frame size from image and enlargement ratio */ + frameWmax = ((((s32)bg->s.imageW << 10) / scaleW)-1) & ~3; + frameHmax = ((((s32)bg->s.imageH << 10) / scaleH)-1) & ~3; + + /* Clamp the frame size */ + frameW = bg->s.frameW; + frameH = bg->s.frameH; + frameX0 = bg->s.frameX; + frameY0 = bg->s.frameY; + if ((frameWmax = bg->s.frameW - frameWmax) < 0) frameWmax = 0; + if ((frameHmax = bg->s.frameH - frameHmax) < 0) frameHmax = 0; + frameW -= frameWmax; + frameH -= frameHmax; + if (bg->s.imageFlip & G_BG_FLAG_FLIPS){ + frameX0 += frameWmax; + } + + /* Caluculate amount of projection from screen */ + pixX0 = scissorX0 - frameX0; /* (s13.2) */ + pixY0 = scissorY0 - frameY0; /* (s13.2) */ + pixX1 = frameW - scissorX1 + frameX0; /* (s13.2) */ + pixY1 = frameH - scissorY1 + frameY0; /* (s13.2) */ + + /* Clamp if no projection */ + if (pixX0 < 0) pixX0 = 0; + if (pixY0 < 0) pixY0 = 0; + if (pixX1 < 0) pixX1 = 0; + if (pixY1 < 0) pixY1 = 0; + + /* Cut the part that is projecting */ + frameW = frameW - (pixX0 + pixX1); /* (s13.2) */ + frameH = frameH - (pixY0 + pixY1); /* (s13.2) */ + frameX0 = frameX0 + pixX0; /* (s13.2) */ + frameY0 = frameY0 + pixY0; /* (s13.2) */ + + /* Terminate if no draw range remains */ + if (frameW <= 0 || frameH <= 0) return; + + /* Caluculate frame */ + frameX1 = frameX0 + frameW; /* (s13.2) */ + framePtrY0 = frameY0 >> 2; /* (s15.0) */ + frameRemain = frameH >> 2; /* (s15.0) */ + + /* Join image columns */ + imageSrcW = bg->s.imageW << 3; /* (u11.5) */ + imageSrcH = bg->s.imageH << 3; /* (u11.5) */ + + /* Get image range (u14.2)*(u6.10)=(u20.12)->(u11.5) */ + imageSliceW = (imageW = frameW * scaleW >> 7) + flagBilerp * 32; + if (bg->s.imageFlip & G_BG_FLAG_FLIPS){ + imageX0 = bg->s.imageX + (pixX1 * scaleW >> 7); /* (s10.5) */ + } else { + imageX0 = bg->s.imageX + (pixX0 * scaleW >> 7); /* (s10.5) */ + } + imageY0 = bg->s.imageY + (pixY0 * scaleH >> 7); /* (s10.5) */ + imageYorig = bg->s.imageYorig; + + /* Loop one step down when left end of image area is greater than right end of image source */ + while (imageX0 >= imageSrcW){ + imageX0 -= imageSrcW; + imageY0 += 32; + imageYorig += 32; /* Add 1 to carrier */ + } + + /* Loop when top end of image area is greater than bottom end of image source */ + while (imageY0 >= imageSrcH){ + imageY0 -= imageSrcH; + imageYorig -= imageSrcH; + } +} + +{ + /*-------------------------------------------------* + Check process connecting top and bottom of image + *-------------------------------------------------*/ + /* + // flagSplit + // tmemSrcLines + // imageSrcLines + */ + /* Top/bottom connection process necessary when image range straddles right +end */ + flagSplit = (imageX0 + imageSliceW >= imageSrcW); + + /* Number of image lines that can be loaded at once */ + tmemSrcLines = imageSrcH >> 5; +} + +{ + /*-------------------------------------------------* + Get load data for TMEM + *-------------------------------------------------*/ + /* + //Calculate number of lines that can be loaded into TMEM. + // If the slice width changes due to scissoring and the linked + // load line number is changed, then the frame division line will + // change and the result will be the generation of unnatural wrinkles. + // To prevent this, the division region is set such that scissoring + // does not occur. + // + */ + s16 tmemSize, tmemMask, tmemShift; + s32 imageNumSlice; + s32 imageSliceWmax; + s32 imageLYoffset, frameLYoffset; + s32 imageLHidden, frameLHidden; + s32 frameLYslice; + + static s16 TMEMSIZE[] = { 512, 512, 256, 512, 512 }; + static s16 TMEMMASK[] = { 0x1ff, 0xff, 0x7f, 0x3f }; + static s16 TMEMSHIFT[] = { 0x200, 0x100, 0x80, 0x40 }; + tmemSize = TMEMSIZE[bg->s.imageFmt]; /* (s15.0) */ + tmemMask = TMEMMASK[bg->s.imageSiz]; /* (s10.5) */ + tmemShift = TMEMSHIFT[bg->s.imageSiz]; /* (s10.5)->(s15.0) */ + + /* Calculate tmem width to accommodate the slice image width */ + /* o Extra is needed at Bilerp time. + // o Clamp slice image width based on image source width. + // 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 */ + tmemSliceLines = tmemSize / tmemSliceWmax; /* (s15.0) */ + imageSliceLines = tmemSliceLines - flagBilerp; /* (s15.0) */ + frameSliceLines = (imageSliceLines << 20) / scaleH; /* (s21.10) */ + + /* Line up image Y coordinate offset value with frame image */ + imageLYoffset = ((s32)imageY0 - imageYorig) << 5; + if (imageLYoffset < 0) imageLYoffset -= (scaleH - 1); + frameLYoffset = imageLYoffset / scaleH; + frameLYoffset <<= 10; + + /* Get slice number corresponding to image Y */ + if (frameLYoffset >= 0){ + imageNumSlice = frameLYoffset / frameSliceLines; + } else { + imageNumSlice = (frameLYoffset - frameSliceLines + 1) / frameSliceLines; + } + + /* Calculate extent to which first draw slice is hidden at top of frame */ + frameLYslice = (frameLSliceL0 = frameSliceLines * imageNumSlice) & ~1023; + frameLHidden = frameLYoffset - frameLYslice; + imageLHidden = (frameLHidden >> 10) * scaleH; + + /* Calculate fram size of first draw slice */ + frameLSliceL0 = (frameLSliceL0 & 1023) + frameSliceLines - frameLHidden; + + /* Calculate image parameters for draw in midst of slice */ + imageT = (imageLHidden >> 5) & 31; + imageLHidden >>= 10; + imageISliceL0 = imageSliceLines - imageLHidden; + imageIY0 = + imageSliceLines * imageNumSlice + (imageYorig & ~31) / 32 + imageLHidden; + if (imageIY0 < 0) imageIY0 += (bg->s.imageH >> 2); + if (imageIY0 >= (bg->s.imageH >> 2)) imageIY0 -= (bg->s.imageH >> 2); + imageTop = (u32)bg->s.imagePtr; /* (u32.0) */ + imageSrcWsize = (imageSrcW / tmemShift) << 3; /* (u16.0) */ + imagePtrX0 = (imageX0 / tmemShift) << 3; /* (u16.0) */ + imagePtr = imageTop + imageSrcWsize * imageIY0 + imagePtrX0; + + /* S invert process */ + imageS = imageX0 & tmemMask; /* (u10.5) */ + if (bg->s.imageFlip & G_BG_FLAG_FLIPS){ + imageS = - (imageS + imageW); + } +} + +{ + /*-------------------------------------------------* + Creating RDP command constant values + *-------------------------------------------------*/ + /* 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); + } + else{ + 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; + (*pkt)++; + /* [SetTile:0] */ + (*pkt)->words.w0 = rdpSetTile_w0; + ((u8 *)&((*pkt)->words.w0))[1] = (bg->s.imageFmt<<5)|(bg->s.imageSiz<<3); + (*pkt)->words.w1 = 0x0007c1f0 | (bg->s.imagePal<<20); + (*pkt)++; + /* [SetTileSize:7] */ + (*pkt)->words.w0 = (G_SETTILESIZE<<24)|0x000000; + (*pkt)->words.w1 = 0x00000000; + (*pkt)++; +} + +{ + s16 imageRemain; + s16 imageSliceH, frameSliceH; + + imageRemain = tmemSrcLines - imageIY0; + imageSliceH = imageISliceL0; + frameSliceCount = frameLSliceL0; + + while(1){ + + /* Calculate draw line number and determine whether to perform a draw */ + frameSliceH = frameSliceCount >> 10; + if (frameSliceH <= 0){ + /* If no draw to be performed */ + imageRemain -= imageSliceH; + if (imageRemain > 0){ + imagePtr += imageSrcWsize * imageSliceH; + } else { + imagePtr = imageTop - (imageRemain * imageSrcWsize) + imagePtrX0; + imageRemain += tmemSrcLines; + } + + } else { + /* If draw to be performed */ + s16 framePtrY1; + + frameSliceCount &= 1023; + if ((frameRemain -= frameSliceH) < 0){ + /* Determine final slice */ + frameSliceH += frameRemain; + imageSliceH += ((frameRemain * scaleH) >> 10) + 1; + if (imageSliceH > imageSliceLines) imageSliceH = imageSliceLines; + } + tmemLoad(pkt, &imagePtr, &imageRemain, imageSliceH, flagBilerp); + + /* Get draw frame range */ + framePtrY1 = framePtrY0 + frameSliceH; /* (s15.0) */ + + /* [PipeSync] Wait for end of preceding LOADTILE command */ + (*pkt)->words.w0 = (G_RDPPIPESYNC<<24); + (*pkt) ++; + + /* Rectangle draw */ + /* Here an RSP command is created. With ucode an RDP command is created */ +#if 1 + { + /* [TextureRectangle] */ + (*pkt)->words.w0 = (G_TEXRECT<<24)|(frameX1<<12)|(framePtrY1<<2); + (*pkt)->words.w1 = (frameX0<<12)|(framePtrY0<<2); + (*pkt) ++; +#else + /* Code for checking slice division line */ + if (frameSliceH > 1){ + (*pkt)->words.w0 = (G_TEXRECT<<24)|(frameX1<<12)|(framePtrY1<<2)-4; + (*pkt)->words.w1 = (frameX0<<12)|(framePtrY0<<2); + (*pkt) ++; +#endif + +#if 0 /* At RDP command creation time */ + (*pkt)->words.w0 = (imageS<<16) | imageT; + (*pkt)->words.w1 = (scaleW<<16) | scaleH; +#else /* At RSP command creation time */ + (*pkt)->words.w0 = (G_RDPHALF_1<<24); + (*pkt)->words.w1 = (imageS<<16) | imageT; + (*pkt) ++; + (*pkt)->words.w0 = (G_RDPHALF_2<<24); + (*pkt)->words.w1 = (scaleW<<16) | scaleH; +#endif + (*pkt) ++; + } + + /* Update region */ + framePtrY0 = framePtrY1; + + /* End if no more undrawn line numbers for frame */ + if (frameRemain <= 0){ + return; + } + } + frameSliceCount += frameSliceLines; + imageSliceH = imageSliceLines; + imageT = 0; + } +} +} + +/*======== End of us2dex_emu.c ========*/ diff --git a/lib/ultralib/src/gu/usprite.c b/lib/ultralib/src/gu/usprite.c new file mode 100644 index 0000000..a10ed34 --- /dev/null +++ b/lib/ultralib/src/gu/usprite.c @@ -0,0 +1,39 @@ + +/************************************************************************** + * * + * Copyright (C) 1996, 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 "gbi.h" + +void guSprite2DInit(uSprite *SpritePointer, + void *SourceImagePointer, + void *TlutPointer, + short Stride, + short SubImageWidth, + short SubImageHeight, + char SourceImageType, + char SourceImageBitSize, + short SourceImageOffsetS, + short SourceImageOffsetT) +{ + SpritePointer->s.SourceImagePointer = SourceImagePointer; + SpritePointer->s.TlutPointer = TlutPointer; + SpritePointer->s.Stride = Stride; + SpritePointer->s.SubImageWidth = SubImageWidth; + SpritePointer->s.SubImageHeight = SubImageHeight; + SpritePointer->s.SourceImageType = SourceImageType; + SpritePointer->s.SourceImageBitSize = SourceImageBitSize; + SpritePointer->s.SourceImageOffsetS = SourceImageOffsetS; + SpritePointer->s.SourceImageOffsetT = SourceImageOffsetT; +} + + + diff --git a/lib/ultralib/src/host/host_ptn64.c b/lib/ultralib/src/host/host_ptn64.c new file mode 100644 index 0000000..54e5e9e --- /dev/null +++ b/lib/ultralib/src/host/host_ptn64.c @@ -0,0 +1,209 @@ +#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; +static volatile unsigned int* n64piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG); + +static OSMesgQueue waitPtQueue ALIGNED(8); +static OSMesg waitPtQueueBuf; +static u32 isWaitPtQueueCreated = FALSE; + +void __osPiRelAccess(void); +void __osPiGetAccess(void); + +static void createWaitPtQueue(void) { + osCreateMesgQueue(&waitPtQueue, &waitPtQueueBuf, 1); + isWaitPtQueueCreated = TRUE; +} + +static u32 getPT_wait(void) { + OSTimer waitTimer; + u32 status UNUSED; + + for (;;) { + while (*n64piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + ; + } + + if (*ptstat & 2) { + return *ptport; + } + __osPiRelAccess(); + + osRecvMesg(&waitPtQueue, NULL, OS_MESG_NOBLOCK); + osSetTimer(&waitTimer, OS_USEC_TO_CYCLES(1000), 0, &waitPtQueue, NULL); + osRecvMesg(&waitPtQueue, NULL, OS_MESG_BLOCK); + + __osPiGetAccess(); + } +} + +static void putPT(u32 c) { + while (*n64piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + ; + } + while (!(*ptstat & 4)) { + ; + } + *ptport = c; +} + +static u32 getPT(void) { + while (*n64piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + ; + } + while (!(*ptstat & 2)) { + ; + } + return *ptport; +} + +void osReadHost_pt(void* dramAddr, u32 nbytes) { + u8* tPtr; + u32 buf[256]; + u32* bp; + u32 data; + u32 ct; + u32 ct1; + u32 ct1_bak; + u32 shift; + u32 cmd; + u32 size; + + if (nbytes == 0) { + return; + } + + if (!isWaitPtQueueCreated) { + createWaitPtQueue(); + } + + __osPiGetAccess(); + + putPT(0x82U); + + cmd = getPT_wait(); + + size = getPT(); + + if (cmd != 2) { + nbytes = -1U; + } + + putPT(nbytes); + + if (size != nbytes) { + goto osReadHost_ret; + } + + tPtr = dramAddr; + ct = nbytes / 4; + + while (ct != 0) { + if (ct > 0x100) { + ct1_bak = ct1 = 0x100; + ct -= 0x100; + } else { + ct1_bak = ct1 = ct; + ct = 0; + } + bp = (u32*)&buf; + + while (ct1 != 0) { + *(bp++) = getPT(); + ct1--; + } + + memcpy(tPtr, &buf, ct1_bak * 4); + tPtr += ct1_bak * 4; + } + + nbytes &= 3; + + if (nbytes != 0) { + data = getPT(); + shift = 0x18; + + do { + *(tPtr++) = (data >> shift); + nbytes--; + shift -= 8; + } while (nbytes != 0); + } + +osReadHost_ret: + __osPiRelAccess(); + return; +} + +void osWriteHost_pt(void* dramAddr, u32 nbytes) { + u8* tPtr; + u32 buf[256]; + u32* bp; + u32 ct; + u32 ct1; + u32 ct1_bak; + u32 cmd; + u32 size; + + if (nbytes == 0) { + return; + } + + if (!isWaitPtQueueCreated) { + createWaitPtQueue(); + } + + __osPiGetAccess(); + putPT(0x82); + + cmd = getPT_wait(); + + size = getPT(); + + if (cmd != 3) { + nbytes = -1; + } + + putPT(nbytes); + + if (size != nbytes) { + goto osWriteHost_ret; + } + + tPtr = dramAddr; + ct = (nbytes + 3) >> 2; + + while (ct != 0) { + if (ct > 0x100) { + ct1_bak = ct1 = 0x100; + ct -= 0x100; + } else { + ct1_bak = ct1 = ct; + ct = 0; + } + + memcpy(bp = buf, tPtr, ct1_bak * 4); + + while (ct1 != 0) { + putPT(*(bp++)); + ct1--; + } + + tPtr += ct1_bak * 4; + } + +osWriteHost_ret: + __osPiRelAccess(); + return; +} + +#endif diff --git a/lib/ultralib/src/host/readhost.c b/lib/ultralib/src/host/readhost.c new file mode 100644 index 0000000..ed6402d --- /dev/null +++ b/lib/ultralib/src/host/readhost.c @@ -0,0 +1,36 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" + +#include "macros.h" + +static int readHostInitialized = FALSE; +static OSMesgQueue readHostMesgQueue ALIGNED(8); +static OSMesg readHostMesgBuf[1]; + +u32 __osRdb_Read_Data_Buf; +u32 __osRdb_Read_Data_Ct; + +void osReadHost(void* dramAddr, u32 nbytes) { + char tstr[4]; + u32 sent = 0; + + if (!readHostInitialized) { + osCreateMesgQueue(&readHostMesgQueue, readHostMesgBuf, ARRLEN(readHostMesgBuf)); + osSetEventMesg(OS_EVENT_RDB_READ_DONE, &readHostMesgQueue, NULL); + readHostInitialized = TRUE; + } + + __osRdb_Read_Data_Buf = dramAddr; + __osRdb_Read_Data_Ct = nbytes; + + while (sent == 0) { + sent += __osRdbSend(tstr, 1, RDB_TYPE_GtoH_READY_FOR_DATA); + } + + osRecvMesg(&readHostMesgQueue, NULL, OS_MESG_BLOCK); + return; +} + +#endif diff --git a/lib/ultralib/src/host/writehost.c b/lib/ultralib/src/host/writehost.c new file mode 100644 index 0000000..c7477e6 --- /dev/null +++ b/lib/ultralib/src/host/writehost.c @@ -0,0 +1,57 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/ultraerror.h" + +#include "macros.h" + +static int writeHostInitialized = FALSE; +static OSMesgQueue writeHostMesgQueue ALIGNED(8); +static OSMesg writeHostMesgBuf[1]; + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +void osWriteHost(void* dramAddr, u32 nbytes) { + u8* tPtr = dramAddr; + u32 sent; + u8 dCount[3]; + u32 count; + +#ifndef NDEBUG + if (nbytes == 0) { + __osError(ERR_OSWRITEHOST_SIZE, 1, nbytes); + return; + } +#endif + + if (writeHostInitialized == FALSE) { + osCreateMesgQueue(&writeHostMesgQueue, writeHostMesgBuf, ARRLEN(writeHostMesgBuf)); + osSetEventMesg(OS_EVENT_RDB_DATA_DONE, &writeHostMesgQueue, NULL); + writeHostInitialized = TRUE; + } + + while (nbytes != 0) { + count = MIN(nbytes, 0x8000); + + dCount[0] = (count & 0xFF0000) >> 0x10; + dCount[1] = (count & 0xFF00) >> 8; + dCount[2] = count & 0xFF; + + sent = 0; + while (sent < ARRLEN(dCount)) { + sent += __osRdbSend(dCount + sent, ARRLEN(dCount) - sent, RDB_TYPE_GtoH_DATA_CT); + } + + sent = 0; + while (sent < count) { + sent += __osRdbSend(tPtr + sent, count - sent, RDB_TYPE_GtoH_DATA); + } + + nbytes -= count; + tPtr += count; + osRecvMesg(&writeHostMesgQueue, NULL, OS_MESG_BLOCK); + } +} + +#endif diff --git a/src/libultra/io/ai.c b/lib/ultralib/src/io/ai.c similarity index 88% rename from src/libultra/io/ai.c rename to lib/ultralib/src/io/ai.c index 5e345dc..4ece0f1 100644 --- a/src/libultra/io/ai.c +++ b/lib/ultralib/src/io/ai.c @@ -6,10 +6,10 @@ s32 __osAiDeviceBusy(void) { register s32 status = IO_READ(AI_STATUS_REG); - + if (status & AI_STATUS_FIFO_FULL) { return TRUE; + } else { + return FALSE; } - - return FALSE; } diff --git a/src/libultra/io/aigetlen.c b/lib/ultralib/src/io/aigetlen.c similarity index 100% rename from src/libultra/io/aigetlen.c rename to lib/ultralib/src/io/aigetlen.c diff --git a/src/libultra/io/aigetstat.c b/lib/ultralib/src/io/aigetstat.c similarity index 100% rename from src/libultra/io/aigetstat.c rename to lib/ultralib/src/io/aigetstat.c diff --git a/lib/ultralib/src/io/aisetfreq.c b/lib/ultralib/src/io/aisetfreq.c new file mode 100644 index 0000000..12f6817 --- /dev/null +++ b/lib/ultralib/src/io/aisetfreq.c @@ -0,0 +1,53 @@ +#include "PR/rcp.h" +#include "PR/ultraerror.h" +#include "../os/osint.h" +// TODO: not sure if this should be here +extern s32 osViClock; + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osAiSetFrequency(u32 frequency) { + register unsigned int dacRate; + register unsigned char bitRate; + register float f; + +#ifdef _DEBUG + if (osViClock == VI_PAL_CLOCK) { + if (frequency < AI_PAL_MIN_FREQ || frequency > AI_PAL_MAX_FREQ) { + __osError(ERR_OSAISETFREQUENCY, 3, AI_PAL_MIN_FREQ, AI_PAL_MAX_FREQ, frequency); + return -1; + } + } else if (osViClock == VI_MPAL_CLOCK) { + if (frequency < AI_MPAL_MIN_FREQ || frequency > AI_MPAL_MAX_FREQ) { + __osError(ERR_OSAISETFREQUENCY, 3, AI_MPAL_MIN_FREQ, AI_MPAL_MAX_FREQ, frequency); + return -1; + } + } else { + if (frequency < AI_NTSC_MIN_FREQ || frequency > AI_NTSC_MAX_FREQ) { + __osError(ERR_OSAISETFREQUENCY, 3, AI_NTSC_MIN_FREQ, AI_NTSC_MAX_FREQ, frequency); + return -1; + } + } +#endif + + f = osViClock / (float)frequency + .5f; + dacRate = f; + + if (dacRate < AI_MIN_DAC_RATE) { + return -1; + } + + bitRate = dacRate / 66; + + if (bitRate > AI_MAX_BIT_RATE) { + bitRate = AI_MAX_BIT_RATE; + } + + IO_WRITE(AI_DACRATE_REG, dacRate - 1); + IO_WRITE(AI_BITRATE_REG, bitRate - 1); +#if BUILD_VERSION < VERSION_I_P + 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 new file mode 100644 index 0000000..041b61d --- /dev/null +++ b/lib/ultralib/src/io/aisetnextbuf.c @@ -0,0 +1,52 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "../os/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +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)) { + __osError(ERR_OSAISETNEXTBUFFER_ADDR, 1, bufPtr); + return -1; + } + + if ((u32)size & (8 - 1)) { + __osError(ERR_OSAISETNEXTBUFFER_SIZE, 1, size); + return -1; + } +#endif + + bptr = bufPtr; + + if (hdwrBugFlag) { + bptr = (u8*)bufPtr - 0x2000; + } + + if ((((u32)bufPtr + size) & 0x1fff) == 0) { + hdwrBugFlag = TRUE; + } else { + 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 new file mode 100644 index 0000000..8fe6ebb --- /dev/null +++ b/lib/ultralib/src/io/cartrominit.c @@ -0,0 +1,96 @@ +#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_I_P +OSPiHandle __CartRomHandle ALIGNED(8); +OSPiHandle* osCartRomInit(void) { + u32 value = 0; + u32 saveMask; + static int first = 1; + register u32 stat; + u32 latency; + u32 pulse; + u32 pageSize; + u32 relDuration; + + __osPiGetAccess(); + + if (!first) { + __osPiRelAccess(); + return &__CartRomHandle; + } + + first = 0; + __CartRomHandle.type = DEVICE_TYPE_CART; + __CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); + __CartRomHandle.domain = PI_DOMAIN1; + __CartRomHandle.speed = 0; + + bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); + + WAIT_ON_IOBUSY(stat); + + latency = IO_READ(PI_BSD_DOM1_LAT_REG); + pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); + relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); + pulse = IO_READ(PI_BSD_DOM1_PWD_REG); + + IO_WRITE(PI_BSD_DOM1_LAT_REG, 0xFF); + IO_WRITE(PI_BSD_DOM1_PGS_REG, 0); + IO_WRITE(PI_BSD_DOM1_RLS_REG, 3); + IO_WRITE(PI_BSD_DOM1_PWD_REG, 0xFF); + + value = IO_READ(__CartRomHandle.baseAddress); + __CartRomHandle.latency = value & 0xFF; + __CartRomHandle.pageSize = (value >> 0x10) & 0xF; + __CartRomHandle.relDuration = (value >> 0x14) & 0xF; + __CartRomHandle.pulse = (value >> 8) & 0xFF; + + IO_WRITE(PI_BSD_DOM1_LAT_REG, latency); + IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize); + IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration); + IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse); + + saveMask = __osDisableInt(); + __CartRomHandle.next = __osPiTable; + __osPiTable = &__CartRomHandle; + __osRestoreInt(saveMask); + __osPiRelAccess(); + + 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/contchannelreset.c b/lib/ultralib/src/io/contchannelreset.c new file mode 100644 index 0000000..f6ed8a2 --- /dev/null +++ b/lib/ultralib/src/io/contchannelreset.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +s32 __osContChannelReset(OSMesgQueue* mq, int channel) { + s32 i; + s32 ret; + u8* ptr = (u8*)&__osPfsPifRam; + + __osSiGetAccess(); + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + *ptr++ = CONT_CMD_CHANNEL_RESET; + *ptr = CONT_CMD_END; + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osSiRelAccess(); + return ret; +} diff --git a/lib/ultralib/src/io/conteeplongread.c b/lib/ultralib/src/io/conteeplongread.c new file mode 100644 index 0000000..d8d59f6 --- /dev/null +++ b/lib/ultralib/src/io/conteeplongread.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osEepromLongRead(OSMesgQueue* mq, u8 address, u8* buffer, int length) { + s32 ret = 0; + + while (length > 0) { + ERRCK(osEepromRead(mq, address, buffer)); + length -= EEPROM_BLOCK_SIZE; + address++; + buffer += EEPROM_BLOCK_SIZE; + } + + return ret; +} diff --git a/lib/ultralib/src/io/conteeplongwrite.c b/lib/ultralib/src/io/conteeplongwrite.c new file mode 100644 index 0000000..c5668e1 --- /dev/null +++ b/lib/ultralib/src/io/conteeplongwrite.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osEepromLongWrite(OSMesgQueue* mq, u8 address, u8* buffer, int length) { + s32 ret = 0; + + while (length > 0) { + ERRCK(osEepromWrite(mq, address, buffer)); + length -= EEPROM_BLOCK_SIZE; + address++; + buffer += EEPROM_BLOCK_SIZE; + osSetTimer(&__osEepromTimer, OS_USEC_TO_CYCLES(12000), 0, &__osEepromTimerQ, &__osEepromTimerMsg); + osRecvMesg(&__osEepromTimerQ, NULL, OS_MESG_BLOCK); + } + + return ret; +} diff --git a/lib/ultralib/src/io/conteepprobe.c b/lib/ultralib/src/io/conteepprobe.c new file mode 100644 index 0000000..b19dc49 --- /dev/null +++ b/lib/ultralib/src/io/conteepprobe.c @@ -0,0 +1,34 @@ +#include "controller.h" +#include "siint.h" + +s32 osEepromProbe(OSMesgQueue* mq) { + s32 ret = 0; + u16 type; + OSContStatus sdata; + + __osSiGetAccess(); + ret = __osEepStatus(mq, &sdata); + type = sdata.type & (CONT_EEPROM | CONT_EEP16K); + + if (ret != 0) { + ret = 0; + } else { + switch (type) { + case CONT_EEPROM: + ret = EEPROM_TYPE_4K; + break; + case CONT_EEPROM | CONT_EEP16K: + ret = EEPROM_TYPE_16K; + break; + default: + ret = 0; + break; + } + } + +#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 new file mode 100644 index 0000000..5e084a0 --- /dev/null +++ b/lib/ultralib/src/io/conteepread.c @@ -0,0 +1,139 @@ +#include "macros.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +OSPifRam __osEepPifRam ALIGNED(16); +#if BUILD_VERSION >= VERSION_L +s32 __osEepromRead16K; +#endif +void __osPackEepReadData(u8 address); + +s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) { + s32 ret = 0; + int i = 0; + u16 type; + u8* ptr; + OSContStatus sdata; + __OSContEepromFormat eepromformat; + + ptr = (u8*)&__osEepPifRam.ramarray; + __osSiGetAccess(); + ret = __osEepStatus(mq, &sdata); + type = sdata.type & (CONT_EEPROM | CONT_EEP16K); + +#if BUILD_VERSION >= VERSION_I_P + if (ret == 0) { + switch (type) { + case CONT_EEPROM: + if (address >= EEPROM_MAXBLOCKS) { + ret = CONT_RANGE_ERROR; + } + break; + case CONT_EEPROM | CONT_EEP16K: + if (address >= EEP16K_MAXBLOCKS) { + // not technically possible + ret = CONT_RANGE_ERROR; + } +#if BUILD_VERSION >= VERSION_L + else { + __osEepromRead16K = 1; + } +#endif + break; + default: + ret = CONT_NO_RESPONSE_ERROR; + } + } + + if (ret != 0) { + __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); + } + + __osPackEepReadData(address); + ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); // send command to pif + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); // recv response + __osContLastCmd = CONT_CMD_READ_EEPROM; + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + for (i = 0; i < MAXCONTROLLERS; i++) { + // skip the first 4 bytes + ptr++; + } + + eepromformat = *(__OSContEepromFormat*)ptr; + ret = CHNL_ERR(eepromformat); + + if (ret == 0) { + for (i = 0; i < ARRLEN(eepromformat.data); i++) { + *buffer++ = eepromformat.data[i]; + } + } + __osSiRelAccess(); + return ret; +} + +void __osPackEepReadData(u8 address) { + u8* ptr = (u8*)&__osEepPifRam.ramarray; + __OSContEepromFormat eepromformat; + int i; + +#if BUILD_VERSION < VERSION_I_P + 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; + eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX; + eepromformat.cmd = CONT_CMD_READ_EEPROM; + eepromformat.address = address; + +#if BUILD_VERSION < VERSION_I_P + for (i = 0; i < ARRLEN(eepromformat.data); i++) { + eepromformat.data[i] = 0; + } +#endif + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = 0; + } + + *(__OSContEepromFormat*)(ptr) = eepromformat; + ptr += sizeof(__OSContEepromFormat); + ptr[0] = CONT_CMD_END; +} diff --git a/lib/ultralib/src/io/conteepwrite.c b/lib/ultralib/src/io/conteepwrite.c new file mode 100644 index 0000000..9bf2812 --- /dev/null +++ b/lib/ultralib/src/io/conteepwrite.c @@ -0,0 +1,203 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +static void __osPackEepWriteData(u8 address, u8* buffer); +s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) { + s32 ret = 0; +#if BUILD_VERSION < VERSION_I_P + 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_I_P + ret = __osEepStatus(mq, &sdata); // Duplicate that was removed in 2.0J +#endif + + type = sdata.type & (CONT_EEPROM | CONT_EEP16K); + +#if BUILD_VERSION >= VERSION_I_P + if (ret == 0) { + switch (type) { + case CONT_EEPROM: + if (address >= EEPROM_MAXBLOCKS) { + ret = CONT_RANGE_ERROR; + } + break; + case CONT_EEPROM | CONT_EEP16K: + if (address >= EEP16K_MAXBLOCKS) { + // not technically possible + ret = CONT_RANGE_ERROR; + } +#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; + } + } + + if (ret != 0) { + __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); + } + + __osPackEepWriteData(address, buffer); + ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); // send command to pif + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); // recv response + __osContLastCmd = CONT_CMD_WRITE_EEPROM; + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + // skip the first 4 bytes +#if BUILD_VERSION >= VERSION_I_P + ptr += 4; +#else + for (i = 0; i < 4; i++) { + ptr++; + } +#endif + + eepromformat = *(__OSContEepromFormat*)ptr; + + ret = CHNL_ERR(eepromformat); + + __osSiRelAccess(); + return ret; +} + +static void __osPackEepWriteData(u8 address, u8* buffer) { + u8* ptr = (u8*)&__osEepPifRam.ramarray; + __OSContEepromFormat eepromformat; + int i; + +#if BUILD_VERSION < VERSION_I_P + 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; + eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX; + eepromformat.cmd = CONT_CMD_WRITE_EEPROM; + eepromformat.address = address; + + for (i = 0; i < ARRLEN(eepromformat.data); i++) { + eepromformat.data[i] = *buffer++; + } + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = 0; + } + + *(__OSContEepromFormat*)(ptr) = eepromformat; + ptr += sizeof(__OSContEepromFormat); + ptr[0] = CONT_CMD_END; +} + +s32 __osEepStatus(OSMesgQueue* mq, OSContStatus* data) { + s32 ret = 0; + int i; + u8* ptr = (u8*)__osEepPifRam.ramarray; + __OSContRequesFormat requestformat; + + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { + __osEepPifRam.ramarray[i] = 0; + } + + __osEepPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osEepPifRam.ramarray; + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + requestformat.dummy = CONT_CMD_NOP; + requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; + requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; + requestformat.cmd = CONT_CMD_REQUEST_STATUS; + requestformat.typeh = CONT_CMD_NOP; + requestformat.typel = CONT_CMD_NOP; + requestformat.status = CONT_CMD_NOP; + requestformat.dummy1 = CONT_CMD_NOP; + *(__OSContRequesFormat*)ptr = requestformat; + ptr += sizeof(__OSContRequesFormat); + *ptr = CONT_CMD_END; + + ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); +#if BUILD_VERSION >= VERSION_I_P + __osContLastCmd = CONT_CMD_END; +#else + __osContLastCmd = CONT_CMD_REQUEST_STATUS; +#endif + ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + if (ret != 0) { + return ret; + } + + ptr = (u8*)&__osEepPifRam; + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = 0; + } + + requestformat = *(__OSContRequesFormat*)ptr; + data->errno = CHNL_ERR(requestformat); + data->type = (requestformat.typel << 8) | requestformat.typeh; + data->status = requestformat.status; + + if (data->errno != 0) { + return data->errno; + } + + return 0; +} diff --git a/lib/ultralib/src/io/contpfs.c b/lib/ultralib/src/io/contpfs.c new file mode 100644 index 0000000..83c856e --- /dev/null +++ b/lib/ultralib/src/io/contpfs.c @@ -0,0 +1,393 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "controller.h" +#include "PR/rmon.h" + +#if BUILD_VERSION >= VERSION_I_P +__OSInode __osPfsInodeCache ALIGNED(8); +s32 __osPfsInodeCacheChannel = -1; +u8 __osPfsInodeCacheBank = 250; +#endif + +u16 __osSumcalc(u8* ptr, int length) { + int i; + u32 sum = 0; + u8* tmp = ptr; + + for (i = 0; i < length; i++) { + sum += *tmp++; +#if BUILD_VERSION < VERSION_I_P + sum = sum & 0xFFFF; +#endif + } + +#if BUILD_VERSION >= VERSION_I_P + return sum & 0xFFFF; +#else + return sum; +#endif +} + +s32 __osIdCheckSum(u16* ptr, u16* csum, u16* icsum) { + u16 data = 0; + u32 j; + + *csum = *icsum = 0; + + for (j = 0; j < ((sizeof(__OSPackId) - sizeof(u32)) / sizeof(u8)); j += 2) { + data = *(u16*)((u32)ptr + j); + *csum += data; + *icsum += ~data; + } + + return 0; +} + +s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) { + s32 ret = 0; + u8 temp[BLOCKSIZE]; + u8 comp[BLOCKSIZE]; + u8 mask = 0; + int i; + int j; + u16 index[4]; + +#if BUILD_VERSION >= VERSION_I_P + 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; + +#if BUILD_VERSION >= VERSION_I_P + SET_ACTIVEBANK_TO_ZERO(); +#else + j = 0; +#endif + do { + ERRCK(SELECT_BANK(pfs, j)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, temp)); + + temp[0] = j | 0x80; + + for (i = 1; i < BLOCKSIZE; i++) { + temp[i] = ~temp[i]; + } + + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, 0, temp, FALSE)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, comp)); + + for (i = 0; i < BLOCKSIZE; i++) { + if (comp[i] != temp[i]) { + break; + } + } + + if (i != BLOCKSIZE) { + break; + } + + if (j > 0) { + ERRCK(SELECT_BANK(pfs, 0)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, (u8*)temp)); + + if (temp[0] != 0x80) { + break; + } + } + + j++; + } while (j < PFS_MAX_BANKS); + +#if BUILD_VERSION >= VERSION_I_P + SET_ACTIVEBANK_TO_ZERO(); +#else + ERRCK(SELECT_BANK(pfs, 0)); +#endif + + mask = (j > 0) ? 1 : 0; + + newid->deviceid = (badid->deviceid & (u16)~1) | mask; + newid->banks = j; + newid->version = badid->version; + __osIdCheckSum((u16*)newid, &newid->checksum, &newid->inverted_checksum); + index[0] = PFS_ID_0AREA; + index[1] = PFS_ID_1AREA; + index[2] = PFS_ID_2AREA; + index[3] = PFS_ID_3AREA; + + for (i = 0; i < ARRLEN(index); i++) { + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, index[i], (u8*)newid, TRUE)); + } + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp)); + + for (i = 0; i < BLOCKSIZE; i++) { + if (temp[i] != ((u8*)newid)[i]) { +#if BUILD_VERSION >= VERSION_I_P + return PFS_ERR_DEVICE; +#else + return PFS_ERR_ID_FATAL; +#endif + } + } + return 0; +} + +s32 __osCheckPackId(OSPfs* pfs, __OSPackId* temp) { + u16 index[4]; + s32 ret = 0; + u16 sum; + u16 isum; + int i; + int j; + + SET_ACTIVEBANK_TO_ZERO(); + index[0] = PFS_ID_0AREA; + index[1] = PFS_ID_1AREA; + index[2] = PFS_ID_2AREA; + index[3] = PFS_ID_3AREA; + for (i = 1; i < ARRLEN(index); i++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, index[i], (u8*)temp)); + __osIdCheckSum((u16*)temp, &sum, &isum); + if (temp->checksum == sum && temp->inverted_checksum == isum) { + break; + } + } + + if (i == ARRLEN(index)) { + return PFS_ERR_ID_FATAL; + } + + for (j = 0; j < ARRLEN(index); j++) { + if (j != i) { + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, index[j], (u8*)temp, TRUE)); + } + } + + return 0; +} + +s32 __osGetId(OSPfs* pfs) { +#if BUILD_VERSION < VERSION_I_P + int k; +#endif + u16 sum; + u16 isum; + u8 temp[BLOCKSIZE]; + __OSPackId newid; + s32 ret; + __OSPackId* id; + + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp)); + __osIdCheckSum((u16*)temp, &sum, &isum); + id = (__OSPackId*)temp; + + if (id->checksum != sum || id->inverted_checksum != isum) { + ret = __osCheckPackId(pfs, id); + + if (ret == PFS_ERR_ID_FATAL) { + 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; + } + } + +#if BUILD_VERSION >= VERSION_I_P + 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); + pfs->dir_size = 16; + pfs->inode_table = PFS_ONE_PAGE; + pfs->minode_table = (1 + pfs->banks) * PFS_ONE_PAGE; + pfs->dir_table = pfs->minode_table + pfs->banks * PFS_ONE_PAGE; + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label)); + return 0; +} + +s32 __osCheckId(OSPfs* pfs) { +#if BUILD_VERSION < VERSION_I_P + int k; +#endif + u8 temp[BLOCKSIZE]; + s32 ret; + +#if BUILD_VERSION >= VERSION_I_P + if (pfs->activebank != 0) { + ret = __osPfsSelectBank(pfs, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = __osPfsSelectBank(pfs, 0); + } + + if (ret != 0) { + return ret; + } + } +#else + SET_ACTIVEBANK_TO_ZERO(); +#endif + + ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp); + + if (ret != 0) { + if (ret != PFS_ERR_NEW_PACK) { + return ret; + } + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp)); + } + +#if BUILD_VERSION >= VERSION_I_P + 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; +} + +s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) { + u8 sum; + int j; + s32 ret; + int offset; + u8* addr; + +#if BUILD_VERSION >= VERSION_I_P + if (flag == PFS_READ && bank == __osPfsInodeCacheBank && (pfs->channel == __osPfsInodeCacheChannel)) { + bcopy(&__osPfsInodeCache, inode, sizeof(__OSInode)); + return 0; + } +#endif + + SET_ACTIVEBANK_TO_ZERO(); + + offset = (bank > 0) ? 1 : pfs->inode_start_page; + + if (flag == PFS_WRITE) { + inode->inode_page[0].inode_t.page = + __osSumcalc((u8*)&inode->inode_page[offset], (PFS_INODE_SIZE_PER_PAGE - offset) * 2); + } + + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * BLOCKSIZE); + + if (flag == PFS_WRITE) { + 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 * PFS_ONE_PAGE + j, addr); + } + + if (ret != 0) { + return ret; + } + } + + if (flag == PFS_READ) { + sum = __osSumcalc((u8*)&inode->inode_page[offset], (PFS_INODE_SIZE_PER_PAGE - offset) * 2); + if (sum != inode->inode_page[0].inode_t.page) { + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * BLOCKSIZE); + ret = __osContRamRead(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr); + } + +#if BUILD_VERSION >= VERSION_I_P + 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; + } + + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * BLOCKSIZE); + ret = + __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr, FALSE); + } + } +#if BUILD_VERSION < VERSION_I_P + 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_I_P + __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_I_P +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]; + __OSPackId* temp; + s32 ret; + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, id)); + + temp = (__OSPackId*)id; + rmonPrintf("repaired %x\n", temp->repaired); + rmonPrintf("random %x\n", temp->random); + rmonPrintf("serial_mid %llu\n", temp->serial_mid); + rmonPrintf("serial_low %llu\n", temp->serial_low); + rmonPrintf("deviceid %x\n", temp->deviceid); + rmonPrintf("banks %x\n", temp->banks); + rmonPrintf("version %x\n", temp->version); + rmonPrintf("checksum %x\n", temp->checksum); + rmonPrintf("inverted_checksum %x\n", temp->inverted_checksum); + return 0; +} +#endif diff --git a/lib/ultralib/src/io/contquery.c b/lib/ultralib/src/io/contquery.c new file mode 100644 index 0000000..df038ce --- /dev/null +++ b/lib/ultralib/src/io/contquery.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +s32 osContStartQuery(OSMesgQueue* mq) { + s32 ret = 0; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_REQUEST_STATUS) { + __osPackRequestData(CONT_CMD_REQUEST_STATUS); + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + __osContLastCmd = CONT_CMD_REQUEST_STATUS; + __osSiRelAccess(); + return ret; +} + +void osContGetQuery(OSContStatus* data) { + u8 pattern; + __osContGetInitData(&pattern, data); +} diff --git a/lib/ultralib/src/io/contramread.c b/lib/ultralib/src/io/contramread.c new file mode 100644 index 0000000..36601d6 --- /dev/null +++ b/lib/ultralib/src/io/contramread.c @@ -0,0 +1,163 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + +#if BUILD_VERSION >= VERSION_I_P +s32 __osPfsLastChannel = -1; + +s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + s32 i; + u8* ptr; + s32 retry = 2; + + __osSiGetAccess(); + + do { + ptr = (u8*)&__osPfsPifRam; + + if (__osContLastCmd != CONT_CMD_READ_PAK || (u32)__osPfsLastChannel != channel) { + __osContLastCmd = CONT_CMD_READ_PAK; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READFORMAT(ptr)->dummy = CONT_CMD_NOP; + READFORMAT(ptr)->txsize = CONT_CMD_READ_PAK_TX; + READFORMAT(ptr)->rxsize = CONT_CMD_READ_PAK_RX; + READFORMAT(ptr)->cmd = CONT_CMD_READ_PAK; + READFORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + +#if BUILD_VERSION >= VERSION_I_P + 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); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READFORMAT(ptr)); + + if (!ret) { + if (__osContDataCrc(READFORMAT(ptr)->data) != READFORMAT(ptr)->datacrc) { + ret = __osPfsGetStatus(mq, channel); + + if (ret) { + break; + } else { + ret = PFS_ERR_CONTRFAIL; + } + } else { + bcopy(READFORMAT(ptr)->data, buffer, BLOCKSIZE); + } + } else { + ret = PFS_ERR_NOPACK; + } + } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); + __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 new file mode 100644 index 0000000..9d49bd9 --- /dev/null +++ b/lib/ultralib/src/io/contramwrite.c @@ -0,0 +1,165 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +extern s32 __osPfsLastChannel; + +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + +#if BUILD_VERSION >= VERSION_I_P +s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) { + s32 ret = 0; + s32 i; + u8* ptr; + s32 retry = 2; + u8 crc; + + if ((force != TRUE) && (address < PFS_LABEL_AREA) && (address != 0)) { + return 0; + } + + __osSiGetAccess(); + + do { + ptr = (u8*)__osPfsPifRam.ramarray; + + if (__osContLastCmd != CONT_CMD_WRITE_PAK || (u32)__osPfsLastChannel != channel) { + __osContLastCmd = CONT_CMD_WRITE_PAK; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READFORMAT(ptr)->dummy = CONT_CMD_NOP; + READFORMAT(ptr)->txsize = CONT_CMD_WRITE_PAK_TX; + READFORMAT(ptr)->rxsize = CONT_CMD_WRITE_PAK_RX; + READFORMAT(ptr)->cmd = CONT_CMD_WRITE_PAK; + READFORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + +#if BUILD_VERSION >= VERSION_I_P + 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); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + crc = __osContDataCrc(buffer); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READFORMAT(ptr)); + + if (!ret) { + if (crc != READFORMAT(ptr)->datacrc) { + if ((ret = __osPfsGetStatus(mq, channel))) { + break; + } else { + ret = PFS_ERR_CONTRFAIL; + } + } + } else { + ret = PFS_ERR_NOPACK; + } + } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + 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/contreaddata.c b/lib/ultralib/src/io/contreaddata.c new file mode 100644 index 0000000..da0cac3 --- /dev/null +++ b/lib/ultralib/src/io/contreaddata.c @@ -0,0 +1,68 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +static void __osPackReadData(void); + +s32 osContStartReadData(OSMesgQueue* mq) { + s32 ret = 0; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_READ_BUTTON) { + __osPackReadData(); + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + __osContLastCmd = CONT_CMD_READ_BUTTON; + __osSiRelAccess(); + + return ret; +} + +void osContGetReadData(OSContPad* data) { + u8* ptr = (u8*)__osContPifRam.ramarray; + __OSContReadFormat readformat; + int i; + + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContReadFormat), data++) { + readformat = *(__OSContReadFormat*)ptr; + data->errno = CHNL_ERR(readformat); + + if (data->errno != 0) { + continue; + } + + data->button = readformat.button; + data->stick_x = readformat.stick_x; + data->stick_y = readformat.stick_y; + } +} + +static void __osPackReadData(void) { + u8* ptr = (u8*)__osContPifRam.ramarray; + __OSContReadFormat readformat; + int i; + + for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { + __osContPifRam.ramarray[i] = 0; + } + + __osContPifRam.pifstatus = CONT_CMD_EXE; + readformat.dummy = CONT_CMD_NOP; + readformat.txsize = CONT_CMD_READ_BUTTON_TX; + readformat.rxsize = CONT_CMD_READ_BUTTON_RX; + readformat.cmd = CONT_CMD_READ_BUTTON; + readformat.button = 0xFFFF; + readformat.stick_x = -1; + readformat.stick_y = -1; + + for (i = 0; i < __osMaxControllers; i++) { + *(__OSContReadFormat*)ptr = readformat; + ptr += sizeof(__OSContReadFormat); + } + + *ptr = CONT_CMD_END; +} diff --git a/lib/ultralib/src/io/contreset.c b/lib/ultralib/src/io/contreset.c new file mode 100644 index 0000000..140088a --- /dev/null +++ b/lib/ultralib/src/io/contreset.c @@ -0,0 +1,51 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +void __osPackResetData(void); + +s32 osContReset(OSMesgQueue* mq, OSContStatus* data) { + u8 pattern; + s32 ret; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_RESET) { + __osPackResetData(); + + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osPackRequestData(CONT_CMD_RESET); + + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osContLastCmd = CONT_CMD_RESET; + } + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osContGetInitData(&pattern, data); + __osSiRelAccess(); + + return ret; +} + +void __osPackResetData(void) { + u8* ptr; + int i; + + __osContPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osContPifRam.ramarray; + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = CONT_CMD_CHANNEL_RESET; + } + + *ptr = CONT_CMD_END; +} diff --git a/lib/ultralib/src/io/controller.c b/lib/ultralib/src/io/controller.c new file mode 100644 index 0000000..728c207 --- /dev/null +++ b/lib/ultralib/src/io/controller.c @@ -0,0 +1,101 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +OSPifRam __osContPifRam ALIGNED(16); +u8 __osContLastCmd; +u8 __osMaxControllers; + +OSTimer __osEepromTimer; +OSMesgQueue __osEepromTimerQ ALIGNED(8); +OSMesg __osEepromTimerMsg; + +s32 __osContinitialized = 0; + +s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) { + OSMesg dummy; + s32 ret = 0; + OSTime t; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + + if (__osContinitialized != 0) { + return 0; + } + + __osContinitialized = 1; + + t = osGetTime(); + if (t < OS_USEC_TO_CYCLES(500000)) { + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(500000) - t, 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + } + + __osMaxControllers = 4; + + __osPackRequestData(CONT_CMD_REQUEST_STATUS); + + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, &dummy, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + osRecvMesg(mq, &dummy, OS_MESG_BLOCK); + + __osContGetInitData(bitpattern, data); + __osContLastCmd = CONT_CMD_REQUEST_STATUS; + __osSiCreateAccessQueue(); + osCreateMesgQueue(&__osEepromTimerQ, &__osEepromTimerMsg, 1); + + return ret; +} + +void __osContGetInitData(u8* pattern, OSContStatus* data) { + u8* ptr; + __OSContRequesFormat requestHeader; + int i; + u8 bits = 0; + + ptr = (u8*)__osContPifRam.ramarray; + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestHeader), data++) { + requestHeader = *(__OSContRequesFormat*)ptr; + data->errno = CHNL_ERR(requestHeader); + + if (data->errno != 0) { + continue; + } + + data->type = requestHeader.typel << 8 | requestHeader.typeh; + data->status = requestHeader.status; + bits |= 1 << i; + } + *pattern = bits; +} + +void __osPackRequestData(u8 cmd) { + u8* ptr; + __OSContRequesFormat requestHeader; + s32 i; + + for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { + __osContPifRam.ramarray[i] = 0; + } + + __osContPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osContPifRam.ramarray; + requestHeader.dummy = CONT_CMD_NOP; + requestHeader.txsize = CONT_CMD_RESET_TX; + requestHeader.rxsize = CONT_CMD_RESET_RX; + requestHeader.cmd = cmd; + requestHeader.typeh = CONT_CMD_NOP; + requestHeader.typel = CONT_CMD_NOP; + requestHeader.status = CONT_CMD_NOP; + requestHeader.dummy1 = CONT_CMD_NOP; + + for (i = 0; i < __osMaxControllers; i++) { + *(__OSContRequesFormat*)ptr = requestHeader; + ptr += sizeof(requestHeader); + } + *ptr = CONT_CMD_END; +} diff --git a/lib/ultralib/src/io/controller.h b/lib/ultralib/src/io/controller.h new file mode 100644 index 0000000..96fa217 --- /dev/null +++ b/lib/ultralib/src/io/controller.h @@ -0,0 +1,289 @@ +#ifndef _CONTROLLER_H +#define _CONTROLLER_H + +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "PR/rcp.h" + +//should go somewhere else but +#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0]))) +#define CHNL_ERR(format) (((format).rxsize & CHNL_ERR_MASK) >> 4) + +typedef struct +{ + /* 0x0 */ u32 ramarray[15]; + /* 0x3C */ u32 pifstatus; +} OSPifRam; + +typedef struct +{ + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u16 button; + /* 0x6 */ s8 stick_x; + /* 0x7 */ s8 stick_y; +} __OSContReadFormat; + +typedef struct +{ + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 typeh; + /* 0x5 */ u8 typel; + /* 0x6 */ u8 status; + /* 0x7 */ u8 dummy1; +} __OSContRequesFormat; + +typedef struct +{ + /* 0x0 */ u8 txsize; + /* 0x1 */ u8 rxsize; + /* 0x2 */ u8 cmd; + /* 0x3 */ u8 typeh; + /* 0x4 */ u8 typel; + /* 0x5 */ u8 status; +} __OSContRequesFormatShort; + +typedef struct +{ + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; +#if BUILD_VERSION >= VERSION_I_P + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; +#else + /* 0x4 */ u16 address; +#endif + /* 0x6 */ u8 data[BLOCKSIZE]; + /* 0x26 */ u8 datacrc; +} __OSContRamReadFormat; + +typedef union { + /* 0x0 */ struct + { + /* 0x0 */ u8 bank; + /* 0x1 */ u8 page; + } inode_t; + /* 0x0 */ u16 ipage; +} __OSInodeUnit; + +typedef struct +{ + /* 0x0 */ u32 game_code; + /* 0x4 */ u16 company_code; + /* 0x6 */ __OSInodeUnit start_page; + /* 0x8 */ u8 status; + /* 0x9 */ s8 reserved; + /* 0xA */ u16 data_sum; + /* 0xC */ u8 ext_name[PFS_FILE_EXT_LEN]; + /* 0x10 */ u8 game_name[PFS_FILE_NAME_LEN]; +} __OSDir; + +typedef struct +{ + /* 0x0 */ __OSInodeUnit inode_page[128]; +} __OSInode; + +typedef struct +{ + /* 0x0 */ u32 repaired; + /* 0x4 */ u32 random; + /* 0x8 */ u64 serial_mid; + /* 0x10 */ u64 serial_low; + /* 0x18 */ u16 deviceid; + /* 0x1A */ u8 banks; + /* 0x1B */ u8 version; + /* 0x1C */ u16 checksum; + /* 0x1E */ u16 inverted_checksum; +} __OSPackId; + +typedef struct +{ + /* 0x0 */ u8 txsize; + /* 0x1 */ u8 rxsize; + /* 0x2 */ u8 cmd; + /* 0x3 */ u8 address; + /* 0x4 */ u8 data[EEPROM_BLOCK_SIZE]; +} __OSContEepromFormat; + +// Joybus commands +//from: http://en64.shoutwiki.com/wiki/SI_Registers_Detailed#CONT_CMD_Usage +#define CONT_CMD_REQUEST_STATUS 0 +#define CONT_CMD_READ_BUTTON 1 +#define CONT_CMD_READ_PAK 2 +#define CONT_CMD_WRITE_PAK 3 +#define CONT_CMD_READ_EEPROM 4 +#define CONT_CMD_WRITE_EEPROM 5 +#define CONT_CMD_READ36_VOICE 9 +#define CONT_CMD_WRITE20_VOICE 10 +#define CONT_CMD_READ2_VOICE 11 +#define CONT_CMD_WRITE4_VOICE 12 +#define CONT_CMD_SWRITE_VOICE 13 +#define CONT_CMD_CHANNEL_RESET 0xFD +#define CONT_CMD_RESET 0xFF + +// Bytes transmitted for each joybus command +#define CONT_CMD_REQUEST_STATUS_TX 1 +#define CONT_CMD_READ_BUTTON_TX 1 +#define CONT_CMD_READ_PAK_TX 3 +#define CONT_CMD_WRITE_PAK_TX 35 +#define CONT_CMD_READ_EEPROM_TX 2 +#define CONT_CMD_WRITE_EEPROM_TX 10 +#define CONT_CMD_READ36_VOICE_TX 3 +#define CONT_CMD_WRITE20_VOICE_TX 23 +#define CONT_CMD_READ2_VOICE_TX 3 +#define CONT_CMD_WRITE4_VOICE_TX 7 +#define CONT_CMD_SWRITE_VOICE_TX 3 +#define CONT_CMD_RESET_TX 1 + +// Bytes received for each joybus command +#define CONT_CMD_REQUEST_STATUS_RX 3 +#define CONT_CMD_READ_BUTTON_RX 4 +#define CONT_CMD_READ_PAK_RX 33 +#define CONT_CMD_WRITE_PAK_RX 1 +#define CONT_CMD_READ_EEPROM_RX 8 +#define CONT_CMD_WRITE_EEPROM_RX 1 +#define CONT_CMD_READ36_VOICE_RX 37 +#define CONT_CMD_WRITE20_VOICE_RX 1 +#define CONT_CMD_READ2_VOICE_RX 3 +#define CONT_CMD_WRITE4_VOICE_RX 1 +#define CONT_CMD_SWRITE_VOICE_RX 1 +#define CONT_CMD_RESET_RX 3 + +#define CONT_CMD_NOP 0xff +#define CONT_CMD_END 0xfe //indicates end of a command +#define CONT_CMD_EXE 1 //set pif ram status byte to this to do a command + +#define DIR_STATUS_EMPTY 0 +#define DIR_STATUS_UNKNOWN 1 +#define DIR_STATUS_OCCUPIED 2 + +// Controller accessory addresses +// https://github.com/joeldipops/TransferBoy/blob/master/docs/TransferPakReference.md + +// Accesory detection +#define CONT_ADDR_DETECT 0x8000 +// Rumble +#define CONT_ADDR_RUMBLE 0xC000 +// Controller Pak +// Transfer Pak +#define CONT_ADDR_GB_POWER 0x8000 // Same as the detection address, but semantically different +#define CONT_ADDR_GB_BANK 0xA000 +#define CONT_ADDR_GB_STATUS 0xB000 + +// Addresses sent to controller accessories are in blocks, not bytes +#define CONT_BLOCKS(x) ((x) / BLOCKSIZE) + +// Block addresses of the above +#define CONT_BLOCK_DETECT CONT_BLOCKS(CONT_ADDR_DETECT) +#define CONT_BLOCK_RUMBLE CONT_BLOCKS(CONT_ADDR_RUMBLE) +#define CONT_BLOCK_GB_POWER CONT_BLOCKS(CONT_ADDR_GB_POWER) +#define CONT_BLOCK_GB_BANK CONT_BLOCKS(CONT_ADDR_GB_BANK) +#define CONT_BLOCK_GB_STATUS CONT_BLOCKS(CONT_ADDR_GB_STATUS) + + +// Transfer pak + +#define GB_POWER_ON 0x84 +#define GB_POWER_OFF 0xFE + + +typedef struct +{ + /* 0x0 */ __OSInode inode; + /* 0x100 */ u8 bank; + /* 0x101 */ u8 map[PFS_INODE_DIST_MAP]; +} __OSInodeCache; + +extern s32 __osEepStatus(OSMesgQueue *, OSContStatus *); +u16 __osSumcalc(u8 *ptr, int length); +s32 __osIdCheckSum(u16 *ptr, u16 *csum, u16 *icsum); +s32 __osRepairPackId(OSPfs *pfs, __OSPackId *badid, __OSPackId *newid); +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_I_P +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_I_P +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); +void __osContGetInitData(u8 *pattern, OSContStatus *data); +void __osPackRequestData(u8 cmd); +void __osPfsRequestData(u8 cmd); +void __osPfsGetInitData(u8* pattern, OSContStatus* data); +u8 __osContAddressCrc(u16 addr); +u8 __osContDataCrc(u8 *data); +s32 __osPfsGetStatus(OSMesgQueue *queue, int channel); + +extern u8 __osContLastCmd; +extern OSTimer __osEepromTimer; +extern OSMesg __osEepromTimerMsg; +extern OSMesgQueue __osEepromTimerQ; +extern OSPifRam __osEepPifRam; +extern OSPifRam __osContPifRam; +extern OSPifRam __osPfsPifRam; +extern u8 __osMaxControllers; + +//some version of this almost certainly existed since there's plenty of times where it's used right before a return 0 +#define ERRCK(fn) \ + ret = fn; \ + if (ret != 0) \ + return ret + +#if BUILD_VERSION >= VERSION_I_P + +#define SELECT_BANK(pfs, bank) \ + __osPfsSelectBank((pfs), (bank)) + +#define SET_ACTIVEBANK_TO_ZERO() \ + if (pfs->activebank != 0) \ + { \ + ERRCK(__osPfsSelectBank(pfs, 0)); \ + } (void)0 + +#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() \ + if ((pfs->status & PFS_INITIALIZED) == 0) \ + return PFS_ERR_INVALID + +#define PFS_GET_STATUS() \ + __osSiGetAccess(); \ + ret = __osPfsGetStatus(queue, channel); \ + __osSiRelAccess(); \ + if (ret != 0) \ + return ret + +#endif diff --git a/lib/ultralib/src/io/controller_gbpak.h b/lib/ultralib/src/io/controller_gbpak.h new file mode 100644 index 0000000..db98bd4 --- /dev/null +++ b/lib/ultralib/src/io/controller_gbpak.h @@ -0,0 +1,8 @@ +#ifndef _CONTROLLER_GBPAK_H +#define _CONTROLLER_GBPAK_H + +extern OSTimer __osGbpakTimer; +extern OSMesg __osGbpakTimerMsg; +extern OSMesgQueue __osGbpakTimerQ; + +#endif diff --git a/lib/ultralib/src/io/controller_voice.h b/lib/ultralib/src/io/controller_voice.h new file mode 100644 index 0000000..1b9dee6 --- /dev/null +++ b/lib/ultralib/src/io/controller_voice.h @@ -0,0 +1,59 @@ +#ifndef CONTROLLER_VOICE_H +#define CONTROLLER_VOICE_H + +#include "PR/ultratypes.h" + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[2]; + /* 0x8 */ u8 datacrc; +} __OSVoiceRead2Format; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[36]; + /* 0x2A */ u8 datacrc; +} __OSVoiceRead36Format; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[4]; + /* 0xA */ u8 datacrc; +} __OSVoiceWrite4Format; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[20]; + /* 0x1A */ u8 datacrc; +} __OSVoiceWrite20Format; + +typedef struct { + /* 0x0 */ u8 txsize; + /* 0x1 */ u8 rxsize; + /* 0x2 */ u8 cmd; + /* 0x3 */ u8 data; + /* 0x4 */ u8 scrc; + /* 0x5 */ u8 datacrc; +} __OSVoiceSWriteFormat; + +#endif // CONTROLLER_VOICE_H diff --git a/lib/ultralib/src/io/contsetch.c b/lib/ultralib/src/io/contsetch.c new file mode 100644 index 0000000..0cababd --- /dev/null +++ b/lib/ultralib/src/io/contsetch.c @@ -0,0 +1,19 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +s32 osContSetCh(u8 ch) { + s32 ret = 0; + + __osSiGetAccess(); + + if (ch > MAXCONTROLLERS) { + __osMaxControllers = MAXCONTROLLERS; + } else { + __osMaxControllers = ch; + } + + __osContLastCmd = CONT_CMD_END; + __osSiRelAccess(); + return ret; +} diff --git a/lib/ultralib/src/io/crc.c b/lib/ultralib/src/io/crc.c new file mode 100644 index 0000000..bc00509 --- /dev/null +++ b/lib/ultralib/src/io/crc.c @@ -0,0 +1,114 @@ +#include "PR/os_internal.h" + +#if BUILD_VERSION >= VERSION_I_P + +u8 __osContAddressCrc(u16 addr) { + u32 temp = 0; + u32 i = 0x400; + + do { + temp <<= 1; + + if ((u32)addr & i) { + if (temp & 0x20) { + temp ^= 0x14; + } else { + ++temp; + } + } else if (temp & 0x20) { + temp ^= 0x15; + } + + i >>= 1; + } while (i != 0); + + i = 5; + + do { + temp <<= 1; + if (temp & 0x20) { + temp ^= 0x15; + } + } while (--i != 0); + + return temp & 0x1F; +} + +u8 __osContDataCrc(u8* data) { + u32 temp = 0; + u32 i; + u32 j; + + for (i = 0x20; i; --i) { + for (j = 0x80; j; j >>= 1) { + temp <<= 1; + + if ((*data & j) != 0) { + if ((temp & 0x100) != 0) { + temp ^= 0x84; + } else { + ++temp; + } + } else if (temp & 0x100) { + temp ^= 0x85; + } + } + + data++; + } + do { + temp <<= 1; + + if (temp & 0x100) { + temp ^= 0x85; + } + } while (++i < 8U); + + 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/devmgr.c b/lib/ultralib/src/io/devmgr.c new file mode 100644 index 0000000..616dee5 --- /dev/null +++ b/lib/ultralib/src/io/devmgr.c @@ -0,0 +1,108 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "piint.h" + +void __osDevMgrMain(void* args) { + OSIoMesg* mb; + OSMesg em; + OSMesg dummy; + s32 ret; + OSDevMgr* dm; + s32 messageSend = 0; + + dm = (OSDevMgr*)args; + mb = NULL; + ret = 0; + + while (TRUE) { + osRecvMesg(dm->cmdQueue, (OSMesg)&mb, OS_MESG_BLOCK); + + if (mb->piHandle != NULL && mb->piHandle->type == DEVICE_TYPE_64DD && + (mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0 || + mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_1)) { + __OSBlockInfo* blockInfo; + __OSTranxInfo* info; + info = &mb->piHandle->transferInfo; + blockInfo = &info->block[info->blockNum]; + info->sectorNum = -1; + + if (info->transferMode != LEO_SECTOR_MODE) { + blockInfo->dramAddr = (void*)((u32)blockInfo->dramAddr - blockInfo->sectorSize); + } + + if (info->transferMode == LEO_TRACK_MODE && mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0) { + messageSend = 1; + } else { + messageSend = 0; + } + + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + __osResetGlobalIntMask(OS_IM_PI); + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, (info->bmCtlShadow | 0x80000000)); + + readblock1: + osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); + info = &mb->piHandle->transferInfo; + blockInfo = &info->block[info->blockNum]; + + if (blockInfo->errStatus == LEO_ERROR_29) { + u32 stat; + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow); + __osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat); + + if (stat & LEO_STATUS_MECHANIC_INTERRUPT) { + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); + } + + blockInfo->errStatus = LEO_ERROR_4; + IO_WRITE(PI_STATUS_REG, PI_CLR_INTR); + __osSetGlobalIntMask(OS_IM_PI | SR_IBIT4); + } + + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + + if (messageSend == 1 && mb->piHandle->transferInfo.block[0].errStatus == LEO_ERROR_GOOD) { + messageSend = 0; + goto readblock1; + } + + osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); + if (mb->piHandle->transferInfo.blockNum == 1) { + osYieldThread(); + } + } else { + switch (mb->hdr.type) { + case OS_MESG_TYPE_DMAREAD: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_DMAWRITE: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_EDMAREAD: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_EDMAWRITE: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->edma(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_LOOPBACK: + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + ret = -1; + break; + default: + ret = -1; + break; + } + + if (ret == 0) { + osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); + } + } + } +} diff --git a/lib/ultralib/src/io/dp.c b/lib/ultralib/src/io/dp.c new file mode 100644 index 0000000..e636217 --- /dev/null +++ b/lib/ultralib/src/io/dp.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osDpDeviceBusy(void) { + register u32 stat = IO_READ(DPC_STATUS_REG); + + if (stat & DPC_STATUS_DMA_BUSY) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/src/libultra/io/dpctr.c b/lib/ultralib/src/io/dpctr.c similarity index 85% rename from src/libultra/io/dpctr.c rename to lib/ultralib/src/io/dpctr.c index 0c2164b..a53b030 100644 --- a/src/libultra/io/dpctr.c +++ b/lib/ultralib/src/io/dpctr.c @@ -1,7 +1,7 @@ #include "PR/os_internal.h" #include "PR/rcp.h" -void osDpGetCounters(u32 *array) { +void osDpGetCounters(u32* array) { *array++ = IO_READ(DPC_CLOCK_REG); *array++ = IO_READ(DPC_BUFBUSY_REG); *array++ = IO_READ(DPC_PIPEBUSY_REG); diff --git a/src/libultra/io/dpgetstat.c b/lib/ultralib/src/io/dpgetstat.c similarity index 100% rename from src/libultra/io/dpgetstat.c rename to lib/ultralib/src/io/dpgetstat.c diff --git a/lib/ultralib/src/io/dpsetnextbuf.c b/lib/ultralib/src/io/dpsetnextbuf.c new file mode 100644 index 0000000..6314472 --- /dev/null +++ b/lib/ultralib/src/io/dpsetnextbuf.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "../os/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osDpSetNextBuffer(void* bufPtr, u64 size) { + register u32 stat; + +#ifdef _DEBUG + if ((u32)bufPtr & 0x7) { + __osError(ERR_OSDPSETNEXTBUFFER_ADDR, 1, bufPtr); + return -1; + } + if (size & 0x7) { + __osError(ERR_OSDPSETNEXTBUFFER_SIZE, 1, size); + return -1; + } +#endif + + if (__osDpDeviceBusy()) { + return -1; + } + + IO_WRITE(DPC_STATUS_REG, DPC_CLR_XBUS_DMEM_DMA); + + while (TRUE) { + stat = IO_READ(DPC_STATUS_REG); + if ((stat & DPC_STATUS_XBUS_DMEM_DMA) == 0) { + break; + } + } + + IO_WRITE(DPC_START_REG, osVirtualToPhysical(bufPtr)); + IO_WRITE(DPC_END_REG, osVirtualToPhysical(bufPtr) + size); + return 0; +} diff --git a/src/libultra/io/dpsetstat.c b/lib/ultralib/src/io/dpsetstat.c similarity index 100% rename from src/libultra/io/dpsetstat.c rename to lib/ultralib/src/io/dpsetstat.c diff --git a/lib/ultralib/src/io/driverominit.c b/lib/ultralib/src/io/driverominit.c new file mode 100644 index 0000000..aba3f38 --- /dev/null +++ b/lib/ultralib/src/io/driverominit.c @@ -0,0 +1,33 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "macros.h" + +#if BUILD_VERSION != VERSION_I_P +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; +} +#endif diff --git a/lib/ultralib/src/io/epidma.c b/lib/ultralib/src/io/epidma.c new file mode 100644 index 0000000..06a9f69 --- /dev/null +++ b/lib/ultralib/src/io/epidma.c @@ -0,0 +1,61 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +s32 osEPiStartDma(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { + register s32 ret; + + if (!__osPiDevMgr.active) { +#ifdef _DEBUG + __osError(ERR_OSPISTARTDMA_PIMGR, 0); +#endif + return -1; + } + +#ifdef _DEBUG + if ((mb->hdr.pri != OS_MESG_PRI_NORMAL) && (mb->hdr.pri != OS_MESG_PRI_HIGH)) { + __osError(ERR_OSPISTARTDMA_PRI, 1, mb->hdr.pri); + return -1; + } + + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPISTARTDMA_DIR, 1, direction); + return -1; + } + + if (mb->devAddr & 0x1) { + __osError(ERR_OSPISTARTDMA_DEVADDR, 1, mb->devAddr); + return -1; + } + + if ((u32)mb->dramAddr & 0x7) { + __osError(ERR_OSPISTARTDMA_ADDR, 1, mb->dramAddr); + return -1; + } + + if (mb->size & 0x1) { + __osError(ERR_OSPISTARTDMA_SIZE, 1, mb->size); + return -1; + } + + if ((mb->size == 0) || (mb->size > (16 * 1024 * 1024))) { + __osError(ERR_OSPISTARTDMA_RANGE, 1, mb->size); + return -1; + } +#endif + + mb->piHandle = pihandle; + + if (direction == OS_READ) { + mb->hdr.type = OS_MESG_TYPE_EDMAREAD; + } else { + mb->hdr.type = OS_MESG_TYPE_EDMAWRITE; + } + + if (mb->hdr.pri == OS_MESG_PRI_HIGH) { + ret = osJamMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } else { + ret = osSendMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } + + return ret; +} diff --git a/lib/ultralib/src/io/epigettype.c b/lib/ultralib/src/io/epigettype.c new file mode 100644 index 0000000..c94012c --- /dev/null +++ b/lib/ultralib/src/io/epigettype.c @@ -0,0 +1,7 @@ +#include "piint.h" + +s32 osEPiGetDeviceType(OSPiHandle* pihandle, OSPiInfo* info) { + info->type = pihandle->type; + info->address = pihandle->baseAddress; + return 0; +} diff --git a/src/libultra/os/epilinkhandle.c b/lib/ultralib/src/io/epilinkhandle.c similarity index 67% rename from src/libultra/os/epilinkhandle.c rename to lib/ultralib/src/io/epilinkhandle.c index 6872c1f..5f51854 100644 --- a/src/libultra/os/epilinkhandle.c +++ b/lib/ultralib/src/io/epilinkhandle.c @@ -1,10 +1,11 @@ -#include +#include "piint.h" -s32 osEPiLinkHandle(OSPiHandle *EPiHandle) -{ +s32 osEPiLinkHandle(OSPiHandle* EPiHandle) { u32 saveMask = __osDisableInt(); + EPiHandle->next = __osPiTable; __osPiTable = EPiHandle; + __osRestoreInt(saveMask); return 0; } diff --git a/lib/ultralib/src/io/epirawdma.c b/lib/ultralib/src/io/epirawdma.c new file mode 100644 index 0000000..69a404d --- /dev/null +++ b/lib/ultralib/src/io/epirawdma.c @@ -0,0 +1,53 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osEPiRawStartDma(OSPiHandle* pihandle, s32 direction, u32 devAddr, void* dramAddr, u32 size) { + u32 stat; + u32 domain; + +#ifdef _DEBUG + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPIRAWSTARTDMA_DIR, 1, direction); + return -1; + } + + if (devAddr & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_DEVADDR, 1, devAddr); + return -1; + } + + if ((u32)dramAddr & 0x7) { + __osError(ERR_OSPIRAWSTARTDMA_ADDR, 1, dramAddr); + return -1; + } + + if (size & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_SIZE, 1, size); + return -1; + } + + if ((size == 0) || (size > (16 * 1024 * 1024))) { + __osError(ERR_OSPIRAWSTARTDMA_RANGE, 1, size); + return -1; + } +#endif + + EPI_SYNC(pihandle, stat, domain); + IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS(pihandle->baseAddress | devAddr)); + + switch (direction) { + case OS_READ: + IO_WRITE(PI_WR_LEN_REG, size - 1); + break; + case OS_WRITE: + IO_WRITE(PI_RD_LEN_REG, size - 1); + break; + default: + return -1; + } + return 0; +} diff --git a/lib/ultralib/src/io/epirawread.c b/lib/ultralib/src/io/epirawread.c new file mode 100644 index 0000000..500a2ce --- /dev/null +++ b/lib/ultralib/src/io/epirawread.c @@ -0,0 +1,48 @@ +#include "piint.h" +#include "PR/ultraerror.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 28 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osEPiRawReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { + register u32 stat; + register u32 domain; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWREADIO, 1, devAddr); + return -1; + } +#endif + assert(data != NULL); + + EPI_SYNC(pihandle, stat, domain); + *data = IO_READ(pihandle->baseAddress | devAddr); + + return 0; +} diff --git a/lib/ultralib/src/io/epirawwrite.c b/lib/ultralib/src/io/epirawwrite.c new file mode 100644 index 0000000..79fba31 --- /dev/null +++ b/lib/ultralib/src/io/epirawwrite.c @@ -0,0 +1,22 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osEPiRawWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) { + register u32 stat; + register u32 domain; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWWRITEIO, 1, devAddr); + return -1; + } +#endif + + EPI_SYNC(pihandle, stat, domain); + IO_WRITE(pihandle->baseAddress | devAddr, data); + + return 0; +} diff --git a/lib/ultralib/src/io/epiread.c b/lib/ultralib/src/io/epiread.c new file mode 100644 index 0000000..08cd0be --- /dev/null +++ b/lib/ultralib/src/io/epiread.c @@ -0,0 +1,19 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +s32 osEPiReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIREADIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osEPiRawReadIo(pihandle, devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/io/epiwrite.c b/lib/ultralib/src/io/epiwrite.c new file mode 100644 index 0000000..42a239e --- /dev/null +++ b/lib/ultralib/src/io/epiwrite.c @@ -0,0 +1,19 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +s32 osEPiWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIWRITEIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osEPiRawWriteIo(pihandle, devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/io/gbpakcheckconnector.c b/lib/ultralib/src/io/gbpakcheckconnector.c new file mode 100644 index 0000000..8eb3298 --- /dev/null +++ b/lib/ultralib/src/io/gbpakcheckconnector.c @@ -0,0 +1,131 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" + +s32 osGbpakCheckConnector(OSPfs* pfs, u8* status) { + s32 ret; + s32 bufn = 1; + s32 oldbufn = 0; + u16 address = 0; + u16 oldaddr = 0; + u16 daddr = 0; + u16 num; + u8 buf[3][4][BLOCKSIZE]; + u8 buf_status[3][4]; + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = osGbpakGetStatus(pfs, status); + } + + if (ret == PFS_ERR_NEW_GBCART) { + return PFS_ERR_CONTRFAIL; + } else if (ret == 0) { + if (!(*status & OS_GBPAK_POWER)) { + ERRCK(osGbpakPower(pfs, OS_GBPAK_POWER_ON)); + } + + bzero(buf_status, sizeof(buf_status)); + + for (address = 0x80; address <= 0x4000; address <<= 1) { + num = 0; + daddr = 0; + + do { + ERRCK(osGbpakReadWrite(pfs, OS_READ, address + daddr, buf[bufn][num], BLOCKSIZE)); + buf_status[bufn][num] = 1; + + if (buf_status[oldbufn][num] == 0) { + ret = osGbpakReadWrite(pfs, OS_READ, oldaddr + daddr, buf[oldbufn][num], BLOCKSIZE); + + if (ret != 0) { + return ret; + } else { + buf_status[oldbufn][num] = 1; + } + } + + if (bcmp(buf[bufn][num], buf[oldbufn][num], BLOCKSIZE) != 0) { + num = 0; + break; + } + + daddr += BLOCKSIZE; + } while (num++ < ARRLEN(buf[0]) - 1); + + if (num != 0) { + return PFS_ERR_CONTRFAIL; + } + + if (oldbufn != 0) { + num = 0; + daddr = 0; + + do { + if (buf_status[bufn][num] == 0) { + ERRCK(osGbpakReadWrite(pfs, OS_READ, address + daddr, buf[bufn][num], BLOCKSIZE)); + buf_status[bufn][num] = 1; + } + + if (buf_status[0][num] == 0) { + ret = osGbpakReadWrite(pfs, OS_READ, daddr, buf[0][num], BLOCKSIZE); + if (ret != 0) { + return ret; + } else { + buf_status[0][num] = 1; + } + } + + if (bcmp(buf[bufn][num], buf[0][num], BLOCKSIZE)) { + num = 0; + break; + } + + daddr += BLOCKSIZE; + } while (num++ < ARRLEN(buf_status[0]) - 1); + } + + if (num != 0) { + return PFS_ERR_CONTRFAIL; + } + + if (oldbufn != 0) { + bzero(buf_status[oldbufn], ARRLEN(buf_status[oldbufn])); + } + + oldaddr = address; + oldbufn = bufn; + bufn ^= 3; + } + + if ((pfs->dir_size >= 2) || (pfs->version == 2)) { + num = 0; + daddr = 0; + + do { + ERRCK(osGbpakReadWrite(pfs, OS_READ, daddr + 0xA000, buf[bufn][num], BLOCKSIZE)); + ERRCK(osGbpakReadWrite(pfs, OS_READ, daddr + 0x2000, buf[oldbufn][num], BLOCKSIZE)); + + if (bcmp(buf[bufn][num], buf[oldbufn][num], BLOCKSIZE)) { + num = 0; + break; + } + + daddr += BLOCKSIZE; + } while (num++ < ARRLEN(buf[0]) - 1); + + if (num != 0) { + return PFS_ERR_CONTRFAIL; + } + } + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = PFS_ERR_CONTRFAIL; + } + } + + return ret; +} diff --git a/lib/ultralib/src/io/gbpakgetbank.c b/lib/ultralib/src/io/gbpakgetbank.c new file mode 100644 index 0000000..a2e5f38 --- /dev/null +++ b/lib/ultralib/src/io/gbpakgetbank.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 __osGbpakGetBank(OSPfs* pfs, u8* bank) { + s32 ret; + u32 temp[BLOCKSIZE / sizeof(u32)]; + + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, (u8*)temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = osGbpakInit(pfs->queue, pfs, pfs->channel); + + if (ret == 0) { + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, (u8*)temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + if (ret == 0) { + *bank = ((u8*)temp)[0]; + pfs->banks = *bank; + } + + return ret; +} diff --git a/lib/ultralib/src/io/gbpakgetstatus.c b/lib/ultralib/src/io/gbpakgetstatus.c new file mode 100644 index 0000000..d17d15c --- /dev/null +++ b/lib/ultralib/src/io/gbpakgetstatus.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osGbpakGetStatus(OSPfs* pfs, u8* status) { + s32 ret; + s32 i; + u32 temp[BLOCKSIZE / sizeof(u32)]; + + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_POWER, (u8*)temp); + + if ((ret == PFS_ERR_NEW_PACK) || (((u8*)temp)[BLOCKSIZE - 1] != GB_POWER_ON)) { + ERRCK(osGbpakInit(pfs->queue, pfs, pfs->channel)); + } + + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_STATUS, (u8*)temp); + + if (ret == 0) { + ERRCK(__osPfsGetStatus(pfs->queue, pfs->channel)); + + *status = ((u8*)temp)[0]; + + for (i = 1; i < BLOCKSIZE; i++) { + *status |= ((u8*)temp)[i]; + } + + *status &= (OS_GBPAK_GBCART_PULL | OS_GBPAK_RSTB_DETECTION); + *status |= ((u8*)temp)[BLOCKSIZE - 1]; + + if (!(*status & OS_GBPAK_GBCART_ON)) { + ret = PFS_ERR_NO_GBCART; + } else if (*status & OS_GBPAK_GBCART_PULL) { + ret = PFS_ERR_NEW_GBCART; + } + } else if (ret == 2) { + ret = PFS_ERR_CONTRFAIL; + } + + return ret; +} diff --git a/lib/ultralib/src/io/gbpakinit.c b/lib/ultralib/src/io/gbpakinit.c new file mode 100644 index 0000000..102d962 --- /dev/null +++ b/lib/ultralib/src/io/gbpakinit.c @@ -0,0 +1,90 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" +#include "controller_gbpak.h" + +OSTimer __osGbpakTimer; +OSMesgQueue __osGbpakTimerQ ALIGNED(8); +OSMesg __osGbpakTimerMsg; + +s32 osGbpakInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { + int i; + s32 ret; + u8 temp[BLOCKSIZE]; + + pfs->status = 0; + + // Turn off the transfer pak + for (i = 0; i < BLOCKSIZE; temp[i++] = GB_POWER_OFF) { + ; + } + + ret = __osContRamWrite(mq, channel, CONT_BLOCK_GB_POWER, temp, FALSE); + if (ret == PFS_ERR_NEW_PACK) { + ret = __osContRamWrite(mq, channel, CONT_BLOCK_GB_POWER, temp, FALSE); + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(mq, channel, CONT_BLOCK_GB_POWER, temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } else { + // Check if the power is still off as set earlier + if (temp[BLOCKSIZE - 1] == GB_POWER_OFF) { + return PFS_ERR_DEVICE; + } + } + + // Turn on the transfer pak + for (i = 0; i < BLOCKSIZE; temp[i++] = GB_POWER_ON) { + ; + } + + ret = __osContRamWrite(mq, channel, CONT_BLOCK_GB_POWER, temp, FALSE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(mq, channel, CONT_BLOCK_GB_POWER, temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } else { + // Check if the power is still on as set earlier + if (temp[BLOCKSIZE - 1] != GB_POWER_ON) { + return PFS_ERR_DEVICE; + } + } + + ERRCK(__osPfsGetStatus(mq, channel)); + + osCreateMesgQueue(&__osGbpakTimerQ, &__osGbpakTimerMsg, 1); + osSetTimer(&__osGbpakTimer, OS_USEC_TO_CYCLES(192000), 0, &__osGbpakTimerQ, &__osGbpakTimerMsg); + osRecvMesg(&__osGbpakTimerQ, NULL, OS_MESG_BLOCK); + pfs->queue = mq; + pfs->status = PFS_GBPAK_INITIALIZED; + pfs->channel = channel; + pfs->activebank = 0x84; + pfs->banks = 0xFF; + pfs->version = 0xFF; + pfs->dir_size = 0xFF; + + return 0; +} diff --git a/lib/ultralib/src/io/gbpakpower.c b/lib/ultralib/src/io/gbpakpower.c new file mode 100644 index 0000000..3d4a8f4 --- /dev/null +++ b/lib/ultralib/src/io/gbpakpower.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "controller_gbpak.h" + +s32 osGbpakPower(OSPfs* pfs, s32 flag) { + s32 i; + s32 ret; + u8 temp[BLOCKSIZE]; + + for (i = 0; i < BLOCKSIZE; temp[i++] = (u8)flag) { + ; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_STATUS, temp, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = osGbpakInit(pfs->queue, pfs, pfs->channel); + + if (ret == 0) { + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_STATUS, temp, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + if (flag != OS_GBPAK_POWER_OFF) { + osSetTimer(&__osGbpakTimer, OS_USEC_TO_CYCLES(120000), 0, &__osGbpakTimerQ, &__osGbpakTimerMsg); + osRecvMesg(&__osGbpakTimerQ, NULL, OS_MESG_BLOCK); + } + + return ret; +} diff --git a/lib/ultralib/src/io/gbpakreadid.c b/lib/ultralib/src/io/gbpakreadid.c new file mode 100644 index 0000000..fd2d0c3 --- /dev/null +++ b/lib/ultralib/src/io/gbpakreadid.c @@ -0,0 +1,99 @@ +#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, + 0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E }; + static u8 mmc_type[] = { 0x00, 0x01, 0x01, 0x01, 0xFF, 0x02, 0x02, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03 }; + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = osGbpakGetStatus(pfs, status); + } + + if (ret == PFS_ERR_NEW_GBCART) { + return PFS_ERR_CONTRFAIL; + } else if (ret == 0) { + if (!(*status & OS_GBPAK_POWER)) { + ERRCK(osGbpakPower(pfs, OS_GBPAK_POWER_ON)); + } + + ERRCK(osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf))); + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + +#if BUILD_VERSION >= VERSION_J + if (!(*status & OS_GBPAK_RSTB_STATUS)) { + return PFS_ERR_CONTRFAIL; + } +#endif + +#if BUILD_VERSION >= VERSION_K + if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) { + for (i = 0; i < ARRLEN(temp); temp[i++] = 0) { + ; + } + + ERRCK(osGbpakReadWrite(pfs, OS_WRITE, 0x6000U, temp, ARRLEN(temp))); + ret = osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf)); + ERRCK(osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf))); + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) { + return PFS_ERR_CONTRFAIL; + } + } +#else + if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) { + return PFS_ERR_CONTRFAIL; + } +#endif + for (i = 0x34, isum = 0; i < 0x4E; i++) { + isum += buf[i]; + } + + if ((isum + 0x19) & 0xFF) { + return PFS_ERR_CONTRFAIL; + } + + bcopy(buf, id, 0x50); + + if (id->cart_type < 0x14) { + pfs->version = (int)mmc_type[id->cart_type]; + } + + pfs->dir_size = (int)id->ram_size; + } + + return ret; +} diff --git a/lib/ultralib/src/io/gbpakreadwrite.c b/lib/ultralib/src/io/gbpakreadwrite.c new file mode 100644 index 0000000..a6d4b02 --- /dev/null +++ b/lib/ultralib/src/io/gbpakreadwrite.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "os_version.h" + +s32 __osGbpakSetBank(OSPfs* pfs, u8 bank); + +s32 osGbpakReadWrite(OSPfs* pfs, u16 flag, u16 address, u8* buffer, u16 size) { + s32 i; + s32 ret; + u8 bank; + + bank = (u8)(address >> 0xE); + + if (bank != pfs->banks) { + ret = __osGbpakSetBank(pfs, bank); + + if (ret != 0) { + return ret; + } + } + +#if BUILD_VERSION >= VERSION_K + if (size == 0) { + return 0; + } +#endif + + size = (u16)(size >> 5); + address = (u16)((address | 0xC000) >> 5); + + if (flag == 1) { + for (i = 0; i < (s32)size; i++, buffer += BLOCKSIZE) { + ret = __osContRamWrite(pfs->queue, pfs->channel, address, buffer, 0); + + if (ret != 0) { + break; + } + + if ((++address >= 0x800) && (i < (s32)(size - 1))) { + ret = __osGbpakSetBank(pfs, ++bank); + + if (ret != 0) { + break; + } + + address = 0x600U; + } + } + } else { + for (i = 0; i < (s32)size; i++, buffer += BLOCKSIZE) { + ret = __osContRamRead(pfs->queue, pfs->channel, address, buffer); + + if (ret != 0) { + break; + } + + if (++address >= 0x800 && (i < (s32)(size - 1))) { + ret = __osGbpakSetBank(pfs, ++bank); + + if (ret != 0) { + break; + } + + address = 0x600U; + } + } + } + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + return ret; +} diff --git a/lib/ultralib/src/io/gbpaksetbank.c b/lib/ultralib/src/io/gbpaksetbank.c new file mode 100644 index 0000000..7a08646 --- /dev/null +++ b/lib/ultralib/src/io/gbpaksetbank.c @@ -0,0 +1,35 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 __osGbpakSetBank(OSPfs* pfs, u8 bank) { + int i; + s32 ret; + u8 temp[BLOCKSIZE]; + + if (bank > 2) { + return PFS_ERR_INVALID; + } + + for (i = 0; i < BLOCKSIZE; temp[i++] = bank) { + ; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, temp, FALSE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = osGbpakInit(pfs->queue, pfs, pfs->channel); + + if (ret == 0) { + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, temp, FALSE); + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + if (ret == 0) { + pfs->banks = bank; + } + + return ret; +} diff --git a/lib/ultralib/src/io/leodiskinit.c b/lib/ultralib/src/io/leodiskinit.c new file mode 100644 index 0000000..c5df8c1 --- /dev/null +++ b/lib/ultralib/src/io/leodiskinit.c @@ -0,0 +1,38 @@ +// 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 CartRomHandle ALIGNED(8); +OSPiHandle LeoDiskHandle ALIGNED(8); +#if BUILD_VERSION >= VERSION_J +OSPiHandle *__osDiskHandle; +OSPiHandle *osLeoDiskInit(void) { + 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; +} +#endif diff --git a/lib/ultralib/src/io/leointerrupt.c b/lib/ultralib/src/io/leointerrupt.c new file mode 100644 index 0000000..c75bb9c --- /dev/null +++ b/lib/ultralib/src/io/leointerrupt.c @@ -0,0 +1,202 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/osint.h" +#include "piint.h" +#include "macros.h" + +extern OSPiHandle *__osDiskHandle; + +#if BUILD_VERSION == VERSION_I_P +u8 leoDiskStack[0x10] ALIGNED(16); +#else +u8 leoDiskStack[OS_PIM_STACKSIZE] ALIGNED(16); +#endif + +static void __osLeoAbnormalResume(void); +static void __osLeoResume(void); + +#if BUILD_VERSION >= VERSION_J + +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)); + } +} + +#endif diff --git a/lib/ultralib/src/io/motor.c b/lib/ultralib/src/io/motor.c new file mode 100644 index 0000000..b1bcf6c --- /dev/null +++ b/lib/ultralib/src/io/motor.c @@ -0,0 +1,332 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "controller.h" +#include "siint.h" + +#if BUILD_VERSION >= VERSION_I_P +static OSPifRam __MotorDataBuf[MAXCONTROLLERS] ALIGNED(8); + +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + +s32 __osMotorAccess(OSPfs* pfs, s32 flag) { + int i; + s32 ret; + u8* ptr = (u8*)&__MotorDataBuf[pfs->channel]; + + if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { + return 5; + } + + __osSiGetAccess(); + __MotorDataBuf[pfs->channel].pifstatus = CONT_CMD_EXE; + ptr += pfs->channel; + + for (i = 0; i < BLOCKSIZE; i++) { + READFORMAT(ptr)->data[i] = flag; + } + + __osContLastCmd = CONT_CMD_END; + __osSiRawStartDma(OS_WRITE, &__MotorDataBuf[pfs->channel]); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + + ret = READFORMAT(ptr)->rxsize & CHNL_ERR_MASK; + if (!ret) { + if (!flag) { + if (READFORMAT(ptr)->datacrc != 0) { + ret = PFS_ERR_CONTRFAIL; + } + } else { + if (READFORMAT(ptr)->datacrc != 0xEB) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + __osSiRelAccess(); + + return ret; +} + +static void __osMakeMotorData(int channel, OSPifRam* mdata) { + u8* ptr = (u8*)mdata->ramarray; + __OSContRamReadFormat ramreadformat; + int i; + + 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.addrh = CONT_BLOCK_RUMBLE >> 3; + ramreadformat.addrl = (u8)(__osContAddressCrc(CONT_BLOCK_RUMBLE) | (CONT_BLOCK_RUMBLE << 5)); + + if (channel != 0) { + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + } + + *READFORMAT(ptr) = ramreadformat; + ptr += sizeof(__OSContRamReadFormat); + ptr[0] = CONT_CMD_END; +} + +s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { + s32 ret; + u8 temp[32]; + + pfs->queue = mq; + pfs->channel = channel; + pfs->activebank = 0xFF; + pfs->status = 0; + + ret = SELECT_BANK(pfs, 0xFE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = SELECT_BANK(pfs, 0x80); + } + + 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; + } else if (temp[31] == 254) { + return PFS_ERR_DEVICE; + } + + ret = SELECT_BANK(pfs, 0x80); + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + 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; + } else if (temp[31] != 0x80) { + return PFS_ERR_DEVICE; + } + + if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { + __osMakeMotorData(channel, &__MotorDataBuf[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 new file mode 100644 index 0000000..2edd0a2 --- /dev/null +++ b/lib/ultralib/src/io/pfsallocatefile.c @@ -0,0 +1,371 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "PR/rmon.h" + +#define ROUND_UP_DIVIDE(numerator, denominator) (((numerator) + (denominator)-1) / (denominator)) + +#if BUILD_VERSION >= VERSION_I_P + +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; + 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 (((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) { + return PFS_ERR_INVALID; + } + + 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)); + } + + if (file_size_in_pages > decleared) { + bcopy(&inode, &backup_inode, sizeof(__OSInode)); + old_last_page = last_page; + old_bank = bank; + file_size_in_pages -= decleared; + firsttime++; + } else { + file_size_in_pages = 0; + ERRCK(__osPfsRWInode(pfs, &inode, PFS_WRITE, bank)); + break; + } + } + } + + if (file_size_in_pages > 0 || start_page == -1) { + return PFS_ERR_INCONSISTENT; + } + + dir.start_page = fpage; + dir.company_code = company_code; + dir.game_code = game_code; + dir.data_sum = 0; + + bcopy(game_name, dir.game_name, PFS_FILE_NAME_LEN); + bcopy(ext_name, dir.ext_name, PFS_FILE_EXT_LEN); + + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + *file_no, (u8*)&dir, FALSE); + return ret; +} + +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; + 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; + } + + 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; + old_page = j; + (*decleared)++; + } + j++; + } + + *first_page = spage; + + if (j == ARRLEN(inode->inode_page) && file_size_in_pages > *decleared) { + *last_page = old_page; + } else { + inode->inode_page[old_page].ipage = 1; + *last_page = 0; + } + + 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; + __OSInode inode; + 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++) { + rmonPrintf("%x ", inode.inode_page[j].ipage); + } + } + + rmonPrintf("dir_size %d %d\n", pfs->dir_size, pfs->inode_start_page); + + for (j = 0; j < pfs->dir_size; j++) { + __osContRamRead(pfs->queue, pfs->channel, (u16)(pfs->dir_table + (int)j), (u8*)&dir); + rmonPrintf("file %d game_code %d page %x c_code %d sum %d\n", j, dir.game_code, dir.start_page.ipage, + dir.company_code, dir.data_sum); + } + rmonPrintf("End of Dump\n"); + return ret; +} +#endif diff --git a/lib/ultralib/src/io/pfschecker.c b/lib/ultralib/src/io/pfschecker.c new file mode 100644 index 0000000..b736200 --- /dev/null +++ b/lib/ultralib/src/io/pfschecker.c @@ -0,0 +1,258 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 corrupted_init(OSPfs* pfs, __OSInodeCache* cache); +s32 corrupted(OSPfs* pfs, __OSInodeUnit fpage, __OSInodeCache* cache); + +#define CHECK_IPAGE(p) \ + (((p).ipage >= pfs->inode_start_page) && ((p).inode_t.bank < pfs->banks) && ((p).inode_t.page >= 0x01) && \ + ((p).inode_t.page < 0x80)) + +s32 osPfsChecker(OSPfs* pfs) { + int j; + s32 ret; + __OSInodeUnit next_page; + __OSInode checked_inode; + __OSInode tmp_inode; + __OSDir tmp_dir; + __OSInodeUnit file_next_node[16]; + __OSInodeCache cache; + int fixed = 0; + u8 bank; +#if BUILD_VERSION >= VERSION_J + u8 oldbank = 254; +#endif + s32 cc; + s32 cl; + int offset; + + ret = __osCheckId(pfs); + + if (ret == PFS_ERR_NEW_PACK) { + ret = __osGetId(pfs); + } + + if (ret != 0) { + return ret; + } + + ERRCK(corrupted_init(pfs, &cache)); + + 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; + } else { + 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; + + if (oldbank != bank) { + ret = __osPfsRWInode(pfs, &tmp_inode, OS_READ, bank); + oldbank = 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) { + bzero(&tmp_dir, sizeof(__OSDir)); + + 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)); + + if (tmp_dir.company_code != 0 && tmp_dir.game_code != 0 && + tmp_dir.start_page.ipage >= (u16)pfs->inode_start_page) { + file_next_node[j].ipage = tmp_dir.start_page.ipage; + } else { + file_next_node[j].ipage = 0; + } + } + + for (bank = 0; bank < pfs->banks; bank++) { + ret = __osPfsRWInode(pfs, &tmp_inode, 0, bank); + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + + offset = (bank > 0) ? 1 : pfs->inode_start_page; + + for (j = 0; j < offset; j++) { + checked_inode.inode_page[j].ipage = tmp_inode.inode_page[j].ipage; + } + + for (; j < 128; j++) { + checked_inode.inode_page[j].ipage = PFS_PAGE_NOT_USED; + } + + for (j = 0; j < pfs->dir_size; j++) { + while (file_next_node[j].inode_t.bank == bank && file_next_node[j].ipage >= (u16)pfs->inode_start_page) { + u8 pp = file_next_node[j].inode_t.page; + file_next_node[j] = checked_inode.inode_page[pp] = tmp_inode.inode_page[pp]; + } + } + ERRCK(__osPfsRWInode(pfs, &checked_inode, OS_WRITE, bank)); + } + + if (fixed) { + pfs->status |= PFS_CORRUPTED; + } else { + pfs->status &= ~PFS_CORRUPTED; + } + + return 0; +} + +s32 corrupted_init(OSPfs* pfs, __OSInodeCache* cache) { + int i; + int n; + int offset; + u8 bank; + __OSInodeUnit tpage; + __OSInode tmp_inode; + s32 ret; + + for (i = 0; i < PFS_INODE_DIST_MAP; i++) { + cache->map[i] = 0; + } + + cache->bank = -1; + for (bank = 0; bank < pfs->banks; bank++) { + offset = bank > 0 ? 1 : pfs->inode_start_page; + + ret = __osPfsRWInode(pfs, &tmp_inode, OS_READ, bank); + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + + for (i = offset; i < ARRLEN(tmp_inode.inode_page); i++) { + 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); + } + } + } + return 0; +} + +s32 corrupted(OSPfs* pfs, __OSInodeUnit fpage, __OSInodeCache* cache) { + int j; + int n; + int hit; + u8 bank; + int offset; + s32 ret; + + hit = 0; + ret = 0; + n = (fpage.inode_t.page / PFS_SECTOR_SIZE) + (fpage.inode_t.bank % PFS_BANK_LAPPED_BY) * BLOCKSIZE; + + for (bank = 0; bank < pfs->banks; bank++) { + offset = bank > 0 ? 1 : pfs->inode_start_page; + + if (bank == fpage.inode_t.bank || cache->map[n] & (1 << (bank % PFS_BANK_LAPPED_BY))) { + if (bank != cache->bank) { + ret = __osPfsRWInode(pfs, &cache->inode, 0, bank); + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + + cache->bank = bank; + } + + for (j = offset; hit < 2 && (j < ARRLEN(cache->inode.inode_page)); j++) { + if (cache->inode.inode_page[j].ipage == fpage.ipage) { + hit++; + } + } + + if (hit >= 2) { + return PFS_ERR_NEW_PACK; + } + } + } + return hit; +} diff --git a/lib/ultralib/src/io/pfsdeletefile.c b/lib/ultralib/src/io/pfsdeletefile.c new file mode 100644 index 0000000..204da8e --- /dev/null +++ b/lib/ultralib/src/io/pfsdeletefile.c @@ -0,0 +1,180 @@ +#include "PR/os_internal.h" +#include "controller.h" + +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; + + if (company_code == 0 || game_code == 0) { + 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(); +#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_I_P + 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) { + break; + } + + bank = last_page.inode_t.bank; + startpage = last_page.inode_t.page; + } + + if (bank >= pfs->banks) { + 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_I_P + +s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u8 bank, __OSInodeUnit* last_page) { + __OSInodeUnit next_page; + __OSInodeUnit old_page; + s32 ret = 0; + + next_page.ipage = (bank << 8) + start_page; + + do { + old_page = next_page; + next_page = inode->inode_page[next_page.inode_t.page]; + inode->inode_page[old_page.inode_t.page].ipage = PFS_PAGE_NOT_USED; + } while (next_page.ipage >= pfs->inode_start_page && next_page.inode_t.bank == bank); + + *last_page = next_page; + + 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 new file mode 100644 index 0000000..4f80020 --- /dev/null +++ b/lib/ultralib/src/io/pfsfilestate.c @@ -0,0 +1,112 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osPfsFileState(OSPfs* pfs, s32 file_no, OSPfsState* state) { + s32 ret; + int pages; + __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(); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osCheckId(pfs)); +#else + PFS_CHECK_ID(); +#endif + 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) { + return PFS_ERR_INVALID; + } + +#if BUILD_VERSION >= VERSION_J + pages = 0; + next_page = dir.start_page; + bank = 0xFF; + + while (TRUE) { + if (next_page.ipage < pfs->inode_start_page) { + break; + } else if (next_page.inode_t.bank != bank) { + bank = next_page.inode_t.bank; + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); + } + + pages++; + next_page = inode.inode_page[next_page.inode_t.page]; + } + + 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; + bcopy(&dir.game_name, state->game_name, PFS_FILE_NAME_LEN); + bcopy(&dir.ext_name, state->ext_name, PFS_FILE_EXT_LEN); + + 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 new file mode 100644 index 0000000..68a54c6 --- /dev/null +++ b/lib/ultralib/src/io/pfsfreeblocks.c @@ -0,0 +1,31 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osPfsFreeBlocks(OSPfs* pfs, s32* bytes_not_used) { + int j; + int pages = 0; + __OSInode inode; + s32 ret = 0; + u8 bank; + int offset; + + 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); + + for (j = offset; j < ARRLEN(inode.inode_page); j++) { + if (inode.inode_page[j].ipage == PFS_PAGE_NOT_USED) { + pages++; + } + } + } + + *bytes_not_used = pages * PFS_ONE_PAGE * BLOCKSIZE; + return 0; +} diff --git a/lib/ultralib/src/io/pfsgetlabel.c b/lib/ultralib/src/io/pfsgetlabel.c new file mode 100644 index 0000000..0e4de49 --- /dev/null +++ b/lib/ultralib/src/io/pfsgetlabel.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osPfsGetLabel(OSPfs* pfs, u8* label, int* len) { + int i; + + if (label == NULL) { + return PFS_ERR_INVALID; + } + + 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) { + break; + } + + *label++ = *(u8*)(u32)(i + pfs->label); + } + + *len = i; + return 0; +} diff --git a/lib/ultralib/src/io/pfsgetstatus.c b/lib/ultralib/src/io/pfsgetstatus.c new file mode 100644 index 0000000..399ec7c --- /dev/null +++ b/lib/ultralib/src/io/pfsgetstatus.c @@ -0,0 +1,100 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +#if BUILD_VERSION >= VERSION_I_P +void __osPfsRequestOneChannel(int channel, u8 cmd); +#else +void __osPfsRequestOneChannel(int channel); +#endif +void __osPfsGetOneChannelData(int channel, OSContStatus* data); + +s32 __osPfsGetStatus(OSMesgQueue* queue, int channel) { + s32 ret = 0; + OSMesg dummy; + OSContStatus data; + +#if BUILD_VERSION >= VERSION_I_P + __osPfsInodeCacheBank = 250; + + __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); +#else + __osPfsRequestOneChannel(channel); +#endif + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + + __osPfsGetOneChannelData(channel, &data); + + if (((data.status & CONT_CARD_ON) != 0) && ((data.status & CONT_CARD_PULL) != 0)) { + return PFS_ERR_NEW_PACK; + } else if ((data.errno != 0) || ((data.status & CONT_CARD_ON) == 0)) { + return PFS_ERR_NOPACK; + } else if ((data.status & CONT_ADDR_CRC_ER) != 0) { + return PFS_ERR_CONTRFAIL; + } + + return ret; +} + +#if BUILD_VERSION >= VERSION_I_P +void __osPfsRequestOneChannel(int channel, u8 cmd) { +#else +void __osPfsRequestOneChannel(int channel) { +#endif + u8* ptr; + __OSContRequesFormatShort requestformat; + int i; + +#if BUILD_VERSION >= VERSION_I_P + __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_I_P + 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; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + *(__OSContRequesFormatShort*)ptr = requestformat; + ptr += sizeof(__OSContRequesFormatShort); + *ptr = CONT_CMD_END; +} + +void __osPfsGetOneChannelData(int channel, OSContStatus* data) { + u8* ptr = (u8*)&__osPfsPifRam; + __OSContRequesFormatShort requestformat; + int i; + + for (i = 0; i < channel; i++) { + ptr++; + } + + requestformat = *(__OSContRequesFormatShort*)ptr; + data->errno = CHNL_ERR(requestformat); + + if (data->errno != 0) { + return; + } + + data->type = (requestformat.typel << 8) | (requestformat.typeh); + data->status = requestformat.status; +} diff --git a/lib/ultralib/src/io/pfsinit.c b/lib/ultralib/src/io/pfsinit.c new file mode 100644 index 0000000..5633c78 --- /dev/null +++ b/lib/ultralib/src/io/pfsinit.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +s32 osPfsInit(OSMesgQueue* queue, OSPfs* pfs, int channel) { + s32 ret = 0; + + __osSiGetAccess(); + ret = __osPfsGetStatus(queue, channel); + __osSiRelAccess(); + + if (ret != 0) { + return ret; + } + + pfs->queue = queue; + pfs->channel = channel; + pfs->status = 0; + pfs->activebank = -1; + ERRCK(__osGetId(pfs)); + + ret = osPfsChecker(pfs); + pfs->status |= PFS_INITIALIZED; + return ret; +} diff --git a/lib/ultralib/src/io/pfsinitpak.c b/lib/ultralib/src/io/pfsinitpak.c new file mode 100644 index 0000000..d3fde1f --- /dev/null +++ b/lib/ultralib/src/io/pfsinitpak.c @@ -0,0 +1,129 @@ +#include "PR/os_internal.h" +#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; + u8 temp[BLOCKSIZE]; + __OSPackId* id; + __OSPackId newid; + + __osSiGetAccess(); + + ret = __osPfsGetStatus(queue, channel); + + __osSiRelAccess(); + + if (ret != 0) { + return ret; + } + + pfs->queue = queue; + pfs->channel = channel; + pfs->status = 0; + +#if BUILD_VERSION >= VERSION_J + ERRCK(__osPfsCheckRamArea(pfs)); +#endif + ERRCK(SELECT_BANK(pfs, 0)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)); + + __osIdCheckSum((u16*)temp, &sum, &isum); + id = (__OSPackId*)temp; + + if ((id->checksum != sum) || (id->inverted_checksum != isum)) { + 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; + } + + id = &newid; + + if (!(id->deviceid & 1)) { + return PFS_ERR_DEVICE; + } + } + +#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); + pfs->dir_size = DEF_DIR_PAGES * PFS_ONE_PAGE; + pfs->inode_table = 1 * PFS_ONE_PAGE; + pfs->minode_table = (1 + pfs->banks) * PFS_ONE_PAGE; + pfs->dir_table = pfs->minode_table + (pfs->banks * PFS_ONE_PAGE); + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label)); + + ret = osPfsChecker(pfs); + pfs->status |= PFS_INITIALIZED; + + return ret; +} + +#if BUILD_VERSION >= VERSION_J +static s32 __osPfsCheckRamArea(OSPfs* pfs) { + s32 i; + s32 ret = 0; + u8 temp1[BLOCKSIZE]; + u8 temp2[BLOCKSIZE]; + u8 save[BLOCKSIZE]; + + ERRCK(SELECT_BANK(pfs, PFS_ID_BANK_256K)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, save)); + + for (i = 0; i < BLOCKSIZE; i++) { + temp1[i] = i; + } + + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, 0, temp1, FALSE)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, temp2)); + + if (bcmp(temp1, temp2, BLOCKSIZE) != 0) { + return PFS_ERR_DEVICE; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, 0, save, FALSE); + return ret; +} +#endif diff --git a/lib/ultralib/src/io/pfsisplug.c b/lib/ultralib/src/io/pfsisplug.c new file mode 100644 index 0000000..9607907 --- /dev/null +++ b/lib/ultralib/src/io/pfsisplug.c @@ -0,0 +1,97 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +OSPifRam __osPfsPifRam ALIGNED(16); + +s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern) { + s32 ret = 0; + OSMesg msg; + u8 bitpattern; + OSContStatus contData[MAXCONTROLLERS]; + s32 channel; + u8 bits = 0; + s32 crcErrorCount = 3; + + __osSiGetAccess(); + + do { + __osPfsRequestData(CONT_CMD_REQUEST_STATUS); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + __osPfsGetInitData(&bitpattern, &contData[0]); + + for (channel = 0; channel < __osMaxControllers; channel++) { + if ((contData[channel].status & CONT_ADDR_CRC_ER) == 0) { + crcErrorCount--; + break; + } + } + + if (channel == __osMaxControllers) { + crcErrorCount = 0; + } + } while (crcErrorCount > 0); + + for (channel = 0; channel < __osMaxControllers; channel++) { + if ((contData[channel].errno == 0) && ((contData[channel].status & CONT_CARD_ON) != 0)) { + bits |= (1 << channel); + } + } + __osSiRelAccess(); + *pattern = bits; + return ret; +} + +void __osPfsRequestData(u8 cmd) { + u8* ptr = (u8*)&__osPfsPifRam; + __OSContRequesFormat requestformat; + int i; + + __osContLastCmd = cmd; + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + requestformat.dummy = CONT_CMD_NOP; + requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; + requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; + requestformat.cmd = cmd; + requestformat.typeh = CONT_CMD_NOP; + requestformat.typel = CONT_CMD_NOP; + requestformat.status = CONT_CMD_NOP; + requestformat.dummy1 = CONT_CMD_NOP; + + for (i = 0; i < __osMaxControllers; i++) { + *((__OSContRequesFormat*)ptr) = requestformat; + ptr += sizeof(__OSContRequesFormat); + } + + *ptr = CONT_CMD_END; +} + +void __osPfsGetInitData(u8* pattern, OSContStatus* data) { + u8* ptr; + __OSContRequesFormat requestformat; + int i; + u8 bits = 0; + + ptr = (u8*)&__osPfsPifRam; + + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestformat), data++) { + requestformat = *((__OSContRequesFormat*)ptr); + data->errno = CHNL_ERR(requestformat); + + if (data->errno != 0) { + continue; + } + + data->type = ((requestformat.typel << 8) | requestformat.typeh); + data->status = requestformat.status; + bits |= (1 << i); + } + *pattern = bits; +} diff --git a/lib/ultralib/src/io/pfsnumfiles.c b/lib/ultralib/src/io/pfsnumfiles.c new file mode 100644 index 0000000..7fa352e --- /dev/null +++ b/lib/ultralib/src/io/pfsnumfiles.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osPfsNumFiles(OSPfs* pfs, s32* max_files, s32* files_used) { + int j; + s32 ret; + __OSDir dir; + int files = 0; + + PFS_CHECK_STATUS(); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osCheckId(pfs)); +#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)); + + if (dir.company_code != 0 && dir.game_code != 0) { + files++; + } + } + *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 new file mode 100644 index 0000000..17afe54 --- /dev/null +++ b/lib/ultralib/src/io/pfsreadwritefile.c @@ -0,0 +1,124 @@ +#include "PR/os_internal.h" +#include "controller.h" + +static s32 __osPfsGetNextPage(OSPfs* pfs, u8* bank, __OSInode* inode, __OSInodeUnit* page) { + s32 ret; + + if (page->inode_t.bank != *bank) { + *bank = page->inode_t.bank; + ERRCK(__osPfsRWInode(pfs, inode, 0, *bank)); + } + + *page = inode->inode_page[page->inode_t.page]; + + if (page->ipage < pfs->inode_start_page || page->inode_t.bank >= pfs->banks || page->inode_t.page <= 0 || + page->inode_t.page >= ARRLEN(inode->inode_page)) { + + if (page->ipage == 1) { + return PFS_ERR_INVALID; + } + + return PFS_ERR_INCONSISTENT; + } + return 0; +} +s32 osPfsReadWriteFile(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in_bytes, u8* data_buffer) { + s32 ret; + __OSDir dir; + __OSInode inode; + __OSInodeUnit cur_page; + int cur_block; + int siz_block; + u8* buffer; + u8 bank; + u16 blockno; + + if ((file_no >= (s32)pfs->dir_size) || (file_no < 0)) { + return PFS_ERR_INVALID; + } + + if ((size_in_bytes <= 0) || ((size_in_bytes % BLOCKSIZE) != 0)) { + return PFS_ERR_INVALID; + } + + if ((offset < 0) || ((offset % BLOCKSIZE) != 0)) { + return PFS_ERR_INVALID; + } + + 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) { + return PFS_ERR_INVALID; + } + + if (dir.start_page.ipage < pfs->inode_start_page || dir.start_page.inode_t.bank >= pfs->banks || + dir.start_page.inode_t.page <= 0 || dir.start_page.inode_t.page >= ARRLEN(inode.inode_page)) { + if ((dir.start_page.ipage == 1)) { + return PFS_ERR_INVALID; + } + + return PFS_ERR_INCONSISTENT; + } + + if (flag == PFS_READ && (dir.status & DIR_STATUS_OCCUPIED) == 0) { + return PFS_ERR_BAD_DATA; + } + + bank = -1; + cur_block = offset / BLOCKSIZE; + cur_page = dir.start_page; + + while (cur_block >= PFS_ONE_PAGE) { + ERRCK(__osPfsGetNextPage(pfs, &bank, &inode, &cur_page)); + cur_block -= PFS_ONE_PAGE; + } + + siz_block = size_in_bytes / BLOCKSIZE; + buffer = data_buffer; + + while (siz_block > 0) { + if (cur_block == PFS_ONE_PAGE) { + ERRCK(__osPfsGetNextPage(pfs, &bank, &inode, &cur_page)); + cur_block = 0; + } + + if (pfs->activebank != 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; + + if (flag == OS_READ) { + ret = __osContRamRead(pfs->queue, pfs->channel, blockno, buffer); + } else { + ret = __osContRamWrite(pfs->queue, pfs->channel, blockno, buffer, FALSE); + } + + if (ret != 0) { + return ret; + } + buffer += BLOCKSIZE; + cur_block++; + siz_block--; + } + + if (flag == PFS_WRITE && (dir.status & DIR_STATUS_OCCUPIED) == 0) { + dir.status |= DIR_STATUS_OCCUPIED; +#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 new file mode 100644 index 0000000..687b456 --- /dev/null +++ b/lib/ultralib/src/io/pfsreformat.c @@ -0,0 +1,71 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +s32 osPfsReFormat(OSPfs* pfs, OSMesgQueue* queue, int channel) { + int j; + int i; + __OSInode inode; + u8 tmp_data[32]; + u8* ptr; + s32 ret; + __osSiGetAccess(); + ret = __osPfsGetStatus(queue, channel); + + if (ret != 0) { + __osSiRelAccess(); + return ret; + } + + pfs->status ^= PFS_INITIALIZED; + pfs->queue = queue; + pfs->channel = channel; + __osSiRelAccess(); + ERRCK(__osGetId(pfs)); + + SET_ACTIVEBANK_TO_ZERO(); + + for (j = 0; j < ARRLEN(tmp_data); j++) { + tmp_data[j] = 0; + } + + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamWrite(queue, channel, pfs->dir_table + j, tmp_data, FALSE)); + } + + for (j = 0; j < pfs->inode_start_page; j++) { + inode.inode_page[j].ipage = 0; + } + + for (j = pfs->inode_start_page; j < ARRLEN(inode.inode_page); j++) { + inode.inode_page[j].ipage = 3; + } + + inode.inode_page[0].ipage = __osSumcalc((u8*)(inode.inode_page + pfs->inode_start_page), + (ARRLEN(inode.inode_page) - pfs->inode_start_page) * sizeof(__OSInodeUnit)); + ptr = (u8*)&inode; + + for (j = 0; j < PFS_ONE_PAGE; j++) { + ERRCK(__osContRamWrite(queue, channel, pfs->inode_table + j, ptr + j * BLOCKSIZE, FALSE)); + ERRCK(__osContRamWrite(queue, channel, pfs->minode_table + j, ptr + j * BLOCKSIZE, FALSE)); + } + + for (i = 1; i < pfs->banks; i++) { + for (j = 1; j < ARRLEN(inode.inode_page); j++) { + inode.inode_page[j].ipage = 3; + } + + inode.inode_page[0].ipage = + __osSumcalc((u8*)(inode.inode_page + 1), (ARRLEN(inode.inode_page) - 1) * sizeof(__OSInodeUnit)); + ptr = (u8*)&inode; + + for (j = 0; j < PFS_ONE_PAGE; j++) { + ERRCK( + __osContRamWrite(queue, channel, pfs->inode_table + i * PFS_ONE_PAGE + j, ptr + j * BLOCKSIZE, FALSE)); + ERRCK( + __osContRamWrite(queue, channel, pfs->minode_table + i * PFS_ONE_PAGE + j, ptr + j * BLOCKSIZE, FALSE)); + } + } + + return 0; +} diff --git a/lib/ultralib/src/io/pfsrepairid.c b/lib/ultralib/src/io/pfsrepairid.c new file mode 100644 index 0000000..348f8b2 --- /dev/null +++ b/lib/ultralib/src/io/pfsrepairid.c @@ -0,0 +1,73 @@ +#include "PR/os_internal.h" +#include "controller.h" + +#if BUILD_VERSION >= VERSION_J + +s32 osPfsRepairId(OSPfs* pfs) { + s32 ret = 0; + + if ((pfs->status & (PFS_INITIALIZED | PFS_ID_BROKEN))) { + ret = __osGetId(pfs); + + if (ret == 0) { + pfs->status &= ~(PFS_ID_BROKEN); + } + } else { + ret = PFS_ERR_INVALID; + } + + 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 new file mode 100644 index 0000000..4fa3c57 --- /dev/null +++ b/lib/ultralib/src/io/pfssearchfile.c @@ -0,0 +1,56 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osPfsFindFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, s32* file_no) { + s32 j; + int i; + __OSDir dir; + 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; + + if (game_name != NULL) { + for (i = 0; i < ARRLEN(dir.game_name); i++) { + if (dir.game_name[i] != game_name[i]) { + fail = TRUE; + break; + } + } + } + + if (ext_name != NULL && !fail) { + for (i = 0; i < ARRLEN(dir.ext_name); i++) { + if (dir.ext_name[i] != ext_name[i]) { + fail = TRUE; + break; + } + } + } + + if (!fail) { + *file_no = j; + return ret; + } + } + } + + *file_no = -1; + return PFS_ERR_INVALID; +} diff --git a/lib/ultralib/src/io/pfsselectbank.c b/lib/ultralib/src/io/pfsselectbank.c new file mode 100644 index 0000000..767db83 --- /dev/null +++ b/lib/ultralib/src/io/pfsselectbank.c @@ -0,0 +1,22 @@ +#include "PR/os_internal.h" +#include "controller.h" + +#if BUILD_VERSION >= VERSION_I_P +s32 __osPfsSelectBank(OSPfs* pfs, u8 bank) { + u8 temp[BLOCKSIZE]; + int i; + s32 ret = 0; + + for (i = 0; i < BLOCKSIZE; i++) { + temp[i] = bank; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_DETECT, temp, FALSE); + + if (ret == 0) { + pfs->activebank = bank; + } + + return ret; +} +#endif diff --git a/lib/ultralib/src/io/pfssetlabel.c b/lib/ultralib/src/io/pfssetlabel.c new file mode 100644 index 0000000..43308c7 --- /dev/null +++ b/lib/ultralib/src/io/pfssetlabel.c @@ -0,0 +1,41 @@ +#include "PR/os_internal.h" +#include "controller.h" + +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++) { + if (*label == 0) { + break; + } + + *(pfs->label + i) = *label++; + } + } + +#if BUILD_VERSION >= VERSION_J + if (pfs->activebank != 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/pi.c b/lib/ultralib/src/io/pi.c new file mode 100644 index 0000000..3e67ddb --- /dev/null +++ b/lib/ultralib/src/io/pi.c @@ -0,0 +1,15 @@ + +#include "PR/os_internal.h" +#include "piint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osPiDeviceBusy() { + register u32 stat = IO_READ(PI_STATUS_REG); + if (stat & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/lib/ultralib/src/io/piacs.c b/lib/ultralib/src/io/piacs.c new file mode 100644 index 0000000..c95147f --- /dev/null +++ b/lib/ultralib/src/io/piacs.c @@ -0,0 +1,25 @@ +#include "macros.h" +#include "PR/os_internal.h" + +#define PI_Q_BUF_LEN 1 +u32 __osPiAccessQueueEnabled = 0; +static OSMesg piAccessBuf[PI_Q_BUF_LEN]; +OSMesgQueue __osPiAccessQueue ALIGNED(8); + +void __osPiCreateAccessQueue(void) { + __osPiAccessQueueEnabled = 1; + osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, PI_Q_BUF_LEN); + osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); +} + +void __osPiGetAccess(void) { + OSMesg dummyMesg; + if (!__osPiAccessQueueEnabled) { + __osPiCreateAccessQueue(); + } + osRecvMesg(&__osPiAccessQueue, &dummyMesg, OS_MESG_BLOCK); +} + +void __osPiRelAccess(void) { + osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); +} diff --git a/lib/ultralib/src/io/pidma.c b/lib/ultralib/src/io/pidma.c new file mode 100644 index 0000000..0584e12 --- /dev/null +++ b/lib/ultralib/src/io/pidma.c @@ -0,0 +1,66 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "piint.h" + +s32 osPiStartDma(OSIoMesg* mb, s32 priority, s32 direction, u32 devAddr, void* dramAddr, u32 size, OSMesgQueue* mq) { + register s32 ret; + if (!__osPiDevMgr.active) { +#ifdef _DEBUG + __osError(ERR_OSPISTARTDMA_PIMGR, 0); +#endif + return -1; + } + +#ifdef _DEBUG + if ((priority != OS_MESG_PRI_NORMAL) && (priority != OS_MESG_PRI_HIGH)) { + __osError(ERR_OSPISTARTDMA_PRI, 1, priority); + return -1; + } + + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPISTARTDMA_DIR, 1, direction); + return -1; + } + + if (devAddr & 0x1) { + __osError(ERR_OSPISTARTDMA_DEVADDR, 1, devAddr); + return -1; + } + + if ((u32)dramAddr & 0x7) { + __osError(ERR_OSPISTARTDMA_ADDR, 1, dramAddr); + return -1; + } + + if (size & 0x1) { + __osError(ERR_OSPISTARTDMA_SIZE, 1, size); + return -1; + } + + if ((size == 0) || (size > (16 * 1024 * 1024))) { + __osError(ERR_OSPISTARTDMA_RANGE, 1, size); + return -1; + } +#endif + + if (direction == OS_READ) { + mb->hdr.type = OS_MESG_TYPE_DMAREAD; + } else { + mb->hdr.type = OS_MESG_TYPE_DMAWRITE; + } + + mb->hdr.pri = priority; + mb->hdr.retQueue = mq; + mb->dramAddr = dramAddr; + mb->devAddr = devAddr; + mb->size = size; + mb->piHandle = NULL; + + if (priority == OS_MESG_PRI_HIGH) { + ret = osJamMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } else { + ret = osSendMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } + + return ret; +} diff --git a/lib/ultralib/src/io/pigetcmdq.c b/lib/ultralib/src/io/pigetcmdq.c new file mode 100644 index 0000000..4724301 --- /dev/null +++ b/lib/ultralib/src/io/pigetcmdq.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "piint.h" + +OSMesgQueue* osPiGetCmdQueue(void) { + if (!__osPiDevMgr.active) { + return NULL; + } else { + return __osPiDevMgr.cmdQueue; + } +} diff --git a/lib/ultralib/src/io/pigetstat.c b/lib/ultralib/src/io/pigetstat.c new file mode 100644 index 0000000..43e9a27 --- /dev/null +++ b/lib/ultralib/src/io/pigetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "piint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 osPiGetStatus() { + return IO_READ(PI_STATUS_REG); +} diff --git a/lib/ultralib/src/io/pigettype.c b/lib/ultralib/src/io/pigettype.c new file mode 100644 index 0000000..f918306 --- /dev/null +++ b/lib/ultralib/src/io/pigettype.c @@ -0,0 +1,8 @@ +#include "PR/os_internal.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osPiGetDeviceType() { + return osRomType; +} diff --git a/src/libultra/io/piint.h b/lib/ultralib/src/io/piint.h similarity index 75% rename from src/libultra/io/piint.h rename to lib/ultralib/src/io/piint.h index 734fdde..f7fef9d 100644 --- a/src/libultra/io/piint.h +++ b/lib/ultralib/src/io/piint.h @@ -94,12 +94,22 @@ #define LEO_ERROR_29 29 // extern OSDevMgr __osPiDevMgr; -extern OSPiHandle *__osCurrentHandle[2]; +extern OSPiHandle *__osCurrentHandle[]; extern OSPiHandle CartRomHandle; 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); @@ -114,14 +124,18 @@ s32 __osEPiRawStartDma(OSPiHandle *, s32 , u32 , void *, u32 ); OSMesgQueue *osPiGetCmdQueue(void); #define WAIT_ON_IOBUSY(stat) \ - while (stat = IO_READ(PI_STATUS_REG), stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \ - ; \ - (void)0 + { \ + stat = IO_READ(PI_STATUS_REG); \ + while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \ + stat = IO_READ(PI_STATUS_REG); \ + } (void)0 #define UPDATE_REG(pihandle, reg, var) \ if (cHandle->var != pihandle->var) \ IO_WRITE(reg, pihandle->var) +#if BUILD_VERSION >= VERSION_I_P + #define EPI_SYNC(pihandle, stat, domain) \ \ WAIT_ON_IOBUSY(stat); \ @@ -151,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 new file mode 100644 index 0000000..4f0b782 --- /dev/null +++ b/lib/ultralib/src/io/pimgr.c @@ -0,0 +1,114 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "piint.h" +#include "PR/rdb.h" + +OSThread piThread ALIGNED(8); +static char piThreadStack[OS_PIM_STACKSIZE] ALIGNED(16); + +#ifndef _FINALROM +static OSThread ramromThread ALIGNED(8); +static char ramromThreadStack[1024] ALIGNED(16); +static OSMesgQueue getRamromQ ALIGNED(8); +static OSMesg getRamromBuf[1]; +static OSMesgQueue freeRamromQ ALIGNED(8); +static OSMesg freeRamromBuf[1]; +static void ramromMain(void*); +#endif + +static OSMesgQueue piEventQueue ALIGNED(8); +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; + OSPri oldPri; + OSPri myPri; + +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATEPIMANAGER, 1, pri); + return; + } +#endif + + if (__osPiDevMgr.active) { + return; + } + osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt); + osCreateMesgQueue(&piEventQueue, (OSMesg*)piEventBuf, 1); + + if (!__osPiAccessQueueEnabled) { + __osPiCreateAccessQueue(); + } + + osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222); + oldPri = -1; + myPri = osGetThreadPri(NULL); + + if (myPri < pri) { + oldPri = myPri; + osSetThreadPri(NULL, pri); + } + + savedMask = __osDisableInt(); + __osPiDevMgr.active = 1; + __osPiDevMgr.thread = &piThread; + __osPiDevMgr.cmdQueue = cmdQ; + __osPiDevMgr.evtQueue = &piEventQueue; + __osPiDevMgr.acsQueue = &__osPiAccessQueue; + __osPiDevMgr.dma = __osPiRawStartDma; + __osPiDevMgr.edma = __osEPiRawStartDma; + osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, &piThreadStack[OS_PIM_STACKSIZE], pri); + osStartThread(&piThread); + +#ifndef _FINALROM + osCreateThread(&ramromThread, 0, ramromMain, NULL, ramromThreadStack + 1024, (OSPri)pri - 1); + osStartThread(&ramromThread); +#endif + __osRestoreInt(savedMask); + + if (oldPri != -1) { + osSetThreadPri(NULL, oldPri); + } +} + +#ifndef _FINALROM +static void ramromMain(void* arg) { + u32 sent; + u8 tmp[3]; + + osCreateMesgQueue(&getRamromQ, getRamromBuf, 1); + osCreateMesgQueue(&freeRamromQ, freeRamromBuf, 1); + osSetEventMesg(OS_EVENT_RDB_REQ_RAMROM, &getRamromQ, NULL); + osSetEventMesg(OS_EVENT_RDB_FREE_RAMROM, &freeRamromQ, NULL); + + while (TRUE) { + osRecvMesg(&getRamromQ, NULL, OS_MESG_BLOCK); + + __osPiGetAccess(); + + sent = 0; + + while (sent < 1) { + sent += __osRdbSend(tmp, 1, RDB_TYPE_GtoH_RAMROM); + } + + osRecvMesg(&freeRamromQ, NULL, OS_MESG_BLOCK); + + __osPiRelAccess(); + } +} +#endif diff --git a/lib/ultralib/src/io/pirawdma.c b/lib/ultralib/src/io/pirawdma.c new file mode 100644 index 0000000..d5ea8c3 --- /dev/null +++ b/lib/ultralib/src/io/pirawdma.c @@ -0,0 +1,53 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osPiRawStartDma(s32 direction, u32 devAddr, void* dramAddr, u32 size) { + register u32 stat; + +#ifdef _DEBUG + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPIRAWSTARTDMA_DIR, 1, direction); + return -1; + } + + if (devAddr & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_DEVADDR, 1, devAddr); + return -1; + } + + if ((u32)dramAddr & 0x7) { + __osError(ERR_OSPIRAWSTARTDMA_ADDR, 1, dramAddr); + return -1; + } + + if (size & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_SIZE, 1, size); + return -1; + } + + if ((size == 0) || (size > (16 * 1024 * 1024))) { + __osError(ERR_OSPIRAWSTARTDMA_RANGE, 1, size); + return -1; + } +#endif + + WAIT_ON_IOBUSY(stat); + + IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS((u32)osRomBase | devAddr)); + + switch (direction) { + case OS_READ: + IO_WRITE(PI_WR_LEN_REG, size - 1); + break; + case OS_WRITE: + IO_WRITE(PI_RD_LEN_REG, size - 1); + break; + default: + return -1; + } + return 0; +} diff --git a/lib/ultralib/src/io/pirawread.c b/lib/ultralib/src/io/pirawread.c new file mode 100644 index 0000000..95d7082 --- /dev/null +++ b/lib/ultralib/src/io/pirawread.c @@ -0,0 +1,66 @@ +#include "piint.h" +#include "assert.h" +#include "PR/ultraerror.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// 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 __osPiRawReadIo(u32 devAddr, u32* data) { + register u32 stat; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWREADIO, 1, devAddr); + return -1; + } +#endif + + assert(data != NULL); + + WAIT_ON_IOBUSY(stat); + *data = IO_READ((u32)osRomBase | devAddr); + + return 0; +} diff --git a/lib/ultralib/src/io/pirawwrite.c b/lib/ultralib/src/io/pirawwrite.c new file mode 100644 index 0000000..92eba84 --- /dev/null +++ b/lib/ultralib/src/io/pirawwrite.c @@ -0,0 +1,21 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osPiRawWriteIo(u32 devAddr, u32 data) { + register u32 stat; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWWRITEIO, 1, devAddr); + return -1; + } +#endif + + WAIT_ON_IOBUSY(stat); + IO_WRITE((u32)osRomBase | devAddr, data); + + return 0; +} diff --git a/lib/ultralib/src/io/piread.c b/lib/ultralib/src/io/piread.c new file mode 100644 index 0000000..42bcf3e --- /dev/null +++ b/lib/ultralib/src/io/piread.c @@ -0,0 +1,19 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +s32 osPiReadIo(u32 devAddr, u32* data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIREADIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osPiRawReadIo(devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/io/piwrite.c b/lib/ultralib/src/io/piwrite.c new file mode 100644 index 0000000..75c00d1 --- /dev/null +++ b/lib/ultralib/src/io/piwrite.c @@ -0,0 +1,19 @@ +#include "piint.h" +#include "PR/ultraerror.h" + +s32 osPiWriteIo(u32 devAddr, u32 data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIWRITEIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osPiRawWriteIo(devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/io/si.c b/lib/ultralib/src/io/si.c new file mode 100644 index 0000000..0188927 --- /dev/null +++ b/lib/ultralib/src/io/si.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "siint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osSiDeviceBusy() { + register u32 stat = IO_READ(SI_STATUS_REG); + + if (stat & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/lib/ultralib/src/io/siacs.c b/lib/ultralib/src/io/siacs.c new file mode 100644 index 0000000..8ef5b3f --- /dev/null +++ b/lib/ultralib/src/io/siacs.c @@ -0,0 +1,25 @@ +#include "macros.h" +#include "PR/os_internal.h" + +#define SI_Q_BUF_LEN 1 +static OSMesg siAccessBuf[SI_Q_BUF_LEN] ALIGNED(8); +OSMesgQueue __osSiAccessQueue ALIGNED(8); +u32 __osSiAccessQueueEnabled = 0; + +void __osSiCreateAccessQueue(void) { + __osSiAccessQueueEnabled = 1; + osCreateMesgQueue(&__osSiAccessQueue, siAccessBuf, SI_Q_BUF_LEN); + osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); +} + +void __osSiGetAccess(void) { + OSMesg dummyMesg; + if (!__osSiAccessQueueEnabled) { + __osSiCreateAccessQueue(); + } + osRecvMesg(&__osSiAccessQueue, &dummyMesg, OS_MESG_BLOCK); +} + +void __osSiRelAccess(void) { + osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); +} diff --git a/lib/ultralib/src/io/sigetstat.c b/lib/ultralib/src/io/sigetstat.c new file mode 100644 index 0000000..0225445 --- /dev/null +++ b/lib/ultralib/src/io/sigetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "siint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 __osSiGetStatus() { + return IO_READ(SI_STATUS_REG); +} diff --git a/src/libultra/io/siint.h b/lib/ultralib/src/io/siint.h similarity index 58% rename from src/libultra/io/siint.h rename to lib/ultralib/src/io/siint.h index 45bf56b..636a87f 100644 --- a/src/libultra/io/siint.h +++ b/lib/ultralib/src/io/siint.h @@ -1,10 +1,15 @@ #ifndef _SIINT_H #define _SIINT_H -#include -#include + +#include "PR/os_internal.h" +#include "PR/rcp.h" + +extern s32 __osEepromRead16K; +extern u8 __osPfsInodeCacheBank; void __osSiGetAccess(void); void __osSiRelAccess(void); int __osSiDeviceBusy(void); void __osSiCreateAccessQueue(void); + #endif diff --git a/lib/ultralib/src/io/sirawdma.c b/lib/ultralib/src/io/sirawdma.c new file mode 100644 index 0000000..e73537c --- /dev/null +++ b/lib/ultralib/src/io/sirawdma.c @@ -0,0 +1,85 @@ +#include "PR/os_internal.h" +#include "assert.h" +#include "siint.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// 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) { + assert(((u32)dramAddr & 0x3) == 0); + +#if BUILD_VERSION >= VERSION_I_P + 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); + } + + IO_WRITE(SI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + + if (direction == OS_READ) { + IO_WRITE(SI_PIF_ADDR_RD64B_REG, PIF_RAM_START); + } else { + IO_WRITE(SI_PIF_ADDR_WR64B_REG, PIF_RAM_START); + } + + if (direction == OS_READ) { + osInvalDCache(dramAddr, 64); + } + + return 0; +} diff --git a/lib/ultralib/src/io/sirawread.c b/lib/ultralib/src/io/sirawread.c new file mode 100644 index 0000000..4ce8330 --- /dev/null +++ b/lib/ultralib/src/io/sirawread.c @@ -0,0 +1,62 @@ +#include "PR/os_internal.h" +#include "assert.h" +#include "siint.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// 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) { + assert((devAddr & 0x3) == 0); + assert(data != NULL); + + if (__osSiDeviceBusy()) { + return -1; + } + + *data = IO_READ(devAddr); + return 0; +} diff --git a/src/libultra/io/sirawwrite.c b/lib/ultralib/src/io/sirawwrite.c similarity index 58% rename from src/libultra/io/sirawwrite.c rename to lib/ultralib/src/io/sirawwrite.c index 9967c1d..795d38a 100644 --- a/src/libultra/io/sirawwrite.c +++ b/lib/ultralib/src/io/sirawwrite.c @@ -1,14 +1,61 @@ #include "PR/os_internal.h" #include "siint.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// 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) { + assert((devAddr & 0x3) == 0); + if (__osSiDeviceBusy()) { return -1; } - + IO_WRITE(devAddr, data); return 0; } diff --git a/lib/ultralib/src/io/sp.c b/lib/ultralib/src/io/sp.c new file mode 100644 index 0000000..3ad9076 --- /dev/null +++ b/lib/ultralib/src/io/sp.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "../os/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osSpDeviceBusy() { + register u32 stat = IO_READ(SP_STATUS_REG); + + if (stat & (SP_STATUS_DMA_BUSY | SP_STATUS_DMA_FULL | SP_STATUS_IO_FULL)) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/src/libultra/io/spgetstat.c b/lib/ultralib/src/io/spgetstat.c similarity index 100% rename from src/libultra/io/spgetstat.c rename to lib/ultralib/src/io/spgetstat.c diff --git a/lib/ultralib/src/io/sprawdma.c b/lib/ultralib/src/io/sprawdma.c new file mode 100644 index 0000000..6d95a49 --- /dev/null +++ b/lib/ultralib/src/io/sprawdma.c @@ -0,0 +1,77 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/osint.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 52 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, u32 size) { + assert(((u32)devAddr & 0x7) == 0); + assert(((u32)dramAddr & 0x7) == 0); + assert(((u32)size & 0x7) == 0); + + if (__osSpDeviceBusy()) { + return -1; + } + + IO_WRITE(SP_MEM_ADDR_REG, devAddr); + IO_WRITE(SP_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + + if (direction == OS_READ) { + IO_WRITE(SP_WR_LEN_REG, size - 1); + } else { + IO_WRITE(SP_RD_LEN_REG, size - 1); + } + + return 0; +} diff --git a/lib/ultralib/src/io/sprawread.c b/lib/ultralib/src/io/sprawread.c new file mode 100644 index 0000000..5910a9e --- /dev/null +++ b/lib/ultralib/src/io/sprawread.c @@ -0,0 +1,61 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/osint.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// 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) { + assert((devAddr & 0x3) == 0); + assert(data != NULL); + + if (__osSpDeviceBusy()) { + return -1; + } + + *data = IO_READ(devAddr); + return 0; +} diff --git a/lib/ultralib/src/io/sprawwrite.c b/lib/ultralib/src/io/sprawwrite.c new file mode 100644 index 0000000..9ce3ebf --- /dev/null +++ b/lib/ultralib/src/io/sprawwrite.c @@ -0,0 +1,61 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/osint.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// 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) { + assert((devAddr & 0x3) == 0); + + if (__osSpDeviceBusy()) { + return -1; + } + + IO_WRITE(devAddr, data); + return 0; +} diff --git a/src/libultra/io/spsetpc.c b/lib/ultralib/src/io/spsetpc.c similarity index 100% rename from src/libultra/io/spsetpc.c rename to lib/ultralib/src/io/spsetpc.c diff --git a/src/libultra/io/spsetstat.c b/lib/ultralib/src/io/spsetstat.c similarity index 100% rename from src/libultra/io/spsetstat.c rename to lib/ultralib/src/io/spsetstat.c diff --git a/lib/ultralib/src/io/sptask.c b/lib/ultralib/src/io/sptask.c new file mode 100644 index 0000000..8fbfeb2 --- /dev/null +++ b/lib/ultralib/src/io/sptask.c @@ -0,0 +1,82 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/sptask.h" +#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); \ + } + +static OSTask tmp_task; + +static OSTask* _VirtualToPhysicalTask(OSTask* intp) { + OSTask* tp; + tp = &tmp_task; + bcopy(intp, tp, sizeof(OSTask)); + + _osVirtualToPhysical(tp->t.ucode); + _osVirtualToPhysical(tp->t.ucode_data); + _osVirtualToPhysical(tp->t.dram_stack); + _osVirtualToPhysical(tp->t.output_buff); + _osVirtualToPhysical(tp->t.output_buff_size); + _osVirtualToPhysical(tp->t.data_ptr); + _osVirtualToPhysical(tp->t.yield_data_ptr); + return tp; +} + +void osSpTaskLoad(OSTask* intp) { + OSTask* tp; + +#ifdef _DEBUG + if ((intp->t.dram_stack != 0x0) && ((u32)intp->t.dram_stack & 0xf)) { + __osError(ERR_OSSPTASKLOAD_DRAM, 1, intp->t.dram_stack); + return; + } + if ((intp->t.output_buff != 0x0) && ((u32)intp->t.output_buff & 0xf)) { + __osError(ERR_OSSPTASKLOAD_OUT, 1, intp->t.output_buff); + return; + } + if ((intp->t.output_buff_size != 0x0) && ((u32)intp->t.output_buff_size & 0xf)) { + __osError(ERR_OSSPTASKLOAD_OUTSIZE, 1, intp->t.output_buff_size); + return; + } + if ((intp->t.yield_data_ptr != 0x0) && ((u32)intp->t.yield_data_ptr & 0xf)) { + __osError(ERR_OSSPTASKLOAD_YIELD, 1, intp->t.yield_data_ptr); + return; + } +#endif + + tp = _VirtualToPhysicalTask(intp); + + if (tp->t.flags & OS_TASK_YIELDED) { + tp->t.ucode_data = tp->t.yield_data_ptr; + tp->t.ucode_data_size = tp->t.yield_data_size; + intp->t.flags &= ~OS_TASK_YIELDED; + if (tp->t.flags & OS_TASK_LOADABLE) { + tp->t.ucode = (u64*)IO_READ((u32)intp->t.yield_data_ptr + OS_YIELD_DATA_SIZE - 4); + } + } + + osWritebackDCache(tp, sizeof(OSTask)); + __osSpSetStatus(SP_CLR_YIELD | SP_CLR_YIELDED | SP_CLR_TASKDONE | SP_SET_INTR_BREAK); + + while (__osSpSetPc(SP_IMEM_START) == -1) {} + + while (__osSpRawStartDma(1, (SP_IMEM_START - sizeof(*tp)), tp, sizeof(OSTask)) == -1) {} + + while (__osSpDeviceBusy()) {} + + while (__osSpRawStartDma(1, SP_IMEM_START, tp->t.ucode_boot, tp->t.ucode_boot_size) == -1) {} +} + +void osSpTaskStartGo(OSTask* tp) { + while (__osSpDeviceBusy()) {} + + __osSpSetStatus(SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT); +} diff --git a/lib/ultralib/src/io/sptaskyield.c b/lib/ultralib/src/io/sptaskyield.c new file mode 100644 index 0000000..78bacae --- /dev/null +++ b/lib/ultralib/src/io/sptaskyield.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +void osSpTaskYield(void) { + __osSpSetStatus(SP_SET_YIELD); +} diff --git a/lib/ultralib/src/io/sptaskyielded.c b/lib/ultralib/src/io/sptaskyielded.c new file mode 100644 index 0000000..3ecab55 --- /dev/null +++ b/lib/ultralib/src/io/sptaskyielded.c @@ -0,0 +1,18 @@ +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "PR/rcp.h" + +OSYieldResult osSpTaskYielded(OSTask* tp) { + u32 status; + OSYieldResult result; + + status = __osSpGetStatus(); + result = (status & SP_STATUS_YIELDED) ? OS_TASK_YIELDED : 0; + + if (status & SP_STATUS_YIELD) { + tp->t.flags |= result; + tp->t.flags &= ~(OS_TASK_DP_WAIT); + } + + return result; +} diff --git a/lib/ultralib/src/io/vi.c b/lib/ultralib/src/io/vi.c new file mode 100644 index 0000000..246f01f --- /dev/null +++ b/lib/ultralib/src/io/vi.c @@ -0,0 +1,39 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +static __OSViContext vi[2] ALIGNED(8) = { 0 }; +__OSViContext* __osViCurr = &vi[0]; +__OSViContext* __osViNext = &vi[1]; + +void __osViInit(void) { + bzero(vi, sizeof(vi)); + __osViCurr = &vi[0]; + __osViNext = &vi[1]; + __osViNext->retraceCount = 1; + __osViCurr->retraceCount = 1; + __osViNext->framep = (void*)K0BASE; + __osViCurr->framep = (void*)K0BASE; + + if (osTvType == OS_TV_TYPE_PAL) { + __osViNext->modep = &osViModePalLan1; + } else if (osTvType == OS_TV_TYPE_MPAL) { + __osViNext->modep = &osViModeMpalLan1; + } else { + __osViNext->modep = &osViModeNtscLan1; + } + + __osViNext->state = VI_STATE_BLACK; + __osViNext->control = __osViNext->modep->comRegs.ctrl; + + while (IO_READ(VI_CURRENT_REG) > 10) { // wait for vsync? + } + + IO_WRITE(VI_CONTROL_REG, 0); // pixel size blank (no data, no sync) + __osViSwapContext(); +} diff --git a/src/libultra/io/viblack.c b/lib/ultralib/src/io/viblack.c similarity index 54% rename from src/libultra/io/viblack.c rename to lib/ultralib/src/io/viblack.c index 76cd0b2..30dd85c 100644 --- a/src/libultra/io/viblack.c +++ b/lib/ultralib/src/io/viblack.c @@ -1,11 +1,17 @@ -#include +#include "PR/os_internal.h" #include "viint.h" -void osViBlack(u8 active) -{ + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViBlack(u8 active) { register u32 saveMask = __osDisableInt(); - if (active) + + if (active) { __osViNext->state |= VI_STATE_BLACK; - else + } else { __osViNext->state &= ~VI_STATE_BLACK; + } + __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/io/viextendvstart.c b/lib/ultralib/src/io/viextendvstart.c new file mode 100644 index 0000000..7ee06d3 --- /dev/null +++ b/lib/ultralib/src/io/viextendvstart.c @@ -0,0 +1,19 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "viint.h" + +void osViExtendVStart(u32 value) { +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(134, 0); + return; + } + + if (value > 48) { + __osError(135, 1, value); + return; + } +#endif + __additional_scanline = value; + return; +} diff --git a/lib/ultralib/src/io/vifade.c b/lib/ultralib/src/io/vifade.c new file mode 100644 index 0000000..6766871 --- /dev/null +++ b/lib/ultralib/src/io/vifade.c @@ -0,0 +1,18 @@ +#include "PR/os_internal.h" +#include "viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViFade(u8 active, u16 factor) { + register u32 saveMask = __osDisableInt(); + + if (active) { + __osViNext->y.offset = factor & VI_2_10_FPART_MASK; + __osViNext->state |= VI_STATE_FADE; + } else { + __osViNext->state &= ~VI_STATE_FADE; + } + + __osRestoreInt(saveMask); +} diff --git a/src/libultra/io/vigetcurrcontext.c b/lib/ultralib/src/io/vigetcurrcontext.c similarity index 58% rename from src/libultra/io/vigetcurrcontext.c rename to lib/ultralib/src/io/vigetcurrcontext.c index 729d902..7b1df9b 100644 --- a/src/libultra/io/vigetcurrcontext.c +++ b/lib/ultralib/src/io/vigetcurrcontext.c @@ -1,9 +1,9 @@ -#include +#include "PR/os_internal.h" #include "viint.h" // TODO: this comes from a header #ident "$Revision: 1.17 $" -__OSViContext *__osViGetCurrentContext(void) { +__OSViContext* __osViGetCurrentContext(void) { return __osViCurr; } diff --git a/lib/ultralib/src/io/vigetcurrframebuf.c b/lib/ultralib/src/io/vigetcurrframebuf.c new file mode 100644 index 0000000..de36712 --- /dev/null +++ b/lib/ultralib/src/io/vigetcurrframebuf.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "viint.h" + +void* osViGetCurrentFramebuffer(void) { + register u32 saveMask; + void* framep; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVIGETCURRENTFRAMEBUFFER, 0); + return NULL; + } +#endif + + saveMask = __osDisableInt(); + framep = __osViCurr->framep; + __osRestoreInt(saveMask); + return framep; +} diff --git a/lib/ultralib/src/io/vigetfield.c b/lib/ultralib/src/io/vigetfield.c new file mode 100644 index 0000000..9dcb7fc --- /dev/null +++ b/lib/ultralib/src/io/vigetfield.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +u32 osViGetCurrentField(void) { + return IO_READ(VI_CURRENT_REG) & 1; +} diff --git a/lib/ultralib/src/io/vigetline.c b/lib/ultralib/src/io/vigetline.c new file mode 100644 index 0000000..5667d61 --- /dev/null +++ b/lib/ultralib/src/io/vigetline.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +u32 osViGetCurrentLine(void) { + return IO_READ(VI_CURRENT_REG); +} diff --git a/lib/ultralib/src/io/vigetmode.c b/lib/ultralib/src/io/vigetmode.c new file mode 100644 index 0000000..2507372 --- /dev/null +++ b/lib/ultralib/src/io/vigetmode.c @@ -0,0 +1,21 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "viint.h" + +u32 osViGetCurrentMode(void) { + register u32 saveMask; + register u32 modeType; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVIGETCURRENTMODE, 0); + return -1; + } +#endif + + saveMask = __osDisableInt(); + modeType = (u32)__osViCurr->modep->type; + + __osRestoreInt(saveMask); + return modeType; +} diff --git a/lib/ultralib/src/io/vigetnextcontext.c b/lib/ultralib/src/io/vigetnextcontext.c new file mode 100644 index 0000000..bb6012a --- /dev/null +++ b/lib/ultralib/src/io/vigetnextcontext.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "viint.h" + +__OSViContext* __osViGetNextContext(void) { + return __osViNext; +} diff --git a/lib/ultralib/src/io/vigetnextframebuf.c b/lib/ultralib/src/io/vigetnextframebuf.c new file mode 100644 index 0000000..2985358 --- /dev/null +++ b/lib/ultralib/src/io/vigetnextframebuf.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "viint.h" + +void* osViGetNextFramebuffer(void) { + register u32 saveMask; + void* framep; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVIGETNEXTFRAMEBUFFER, 0); + return NULL; + } +#endif + + saveMask = __osDisableInt(); + framep = __osViNext->framep; + __osRestoreInt(saveMask); + return framep; +} diff --git a/lib/ultralib/src/io/vigetstat.c b/lib/ultralib/src/io/vigetstat.c new file mode 100644 index 0000000..8fc6f38 --- /dev/null +++ b/lib/ultralib/src/io/vigetstat.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +u32 osViGetStatus(void) { + return IO_READ(VI_STATUS_REG); +} diff --git a/src/libultra/io/viint.h b/lib/ultralib/src/io/viint.h similarity index 73% rename from src/libultra/io/viint.h rename to lib/ultralib/src/io/viint.h index 3ae94c8..ffe0927 100644 --- a/src/libultra/io/viint.h +++ b/lib/ultralib/src/io/viint.h @@ -24,17 +24,17 @@ #define VI_SUBPIXEL_SH 0x10 #define BURST(hsync_width, color_width, vsync_width, color_start) \ - (hsync_width | (color_width << 8) | (vsync_width << 16) | (color_start << 20)) -#define WIDTH(v) v -#define VSYNC(v) v -#define HSYNC(duration, leap) (duration | (leap << 16)) -#define LEAP(upper, lower) ((upper << 16) | lower) -#define START(start, end) ((start << 16) | end) + (((u32)(hsync_width) & 0xFF) | (((u32)(color_width) & 0xFF) << 8) | (((u32)(vsync_width) & 0xF) << 16) | (((u32)(color_start) & 0xFFFF) << 20)) +#define WIDTH(v) (v) +#define VSYNC(v) (v) +#define HSYNC(duration, leap) (((u32)(leap) << 16) | ((u32)(duration) & 0xFFFF)) +#define LEAP(upper, lower) (((u32)(upper) << 16) | ((u32)(lower) & 0xFFFF)) +#define START(start, end) (((u32)(start) << 16) | ((u32)(end) & 0xFFFF)) -#define FTOFIX(val, i, f) ((u32)(val * (f32)(1 << f)) & ((1 << (i + f)) - 1)) +#define FTOFIX(val, i, f) ((u32)((val) * (f32)(1 << (f))) & ((1 << ((i) + (f))) - 1)) #define F210(val) FTOFIX(val, 2, 10) -#define SCALE(scaleup, off) (F210((1.0f / (f32)scaleup)) | (F210((f32)off) << 16)) +#define SCALE(scaleup, off) (F210((1.0f / (f32)(scaleup))) | (F210((f32)(off)) << 16)) #define VCURRENT(v) v //seemingly unused #define ORIGIN(v) v @@ -67,4 +67,5 @@ extern __OSViContext *__osViNext; extern u32 __additional_scanline; __OSViContext *__osViGetCurrentContext(void); void __osViInit(void); +extern OSDevMgr __osViDevMgr; #endif diff --git a/lib/ultralib/src/io/vimgr.c b/lib/ultralib/src/io/vimgr.c new file mode 100644 index 0000000..ef40416 --- /dev/null +++ b/lib/ultralib/src/io/vimgr.c @@ -0,0 +1,126 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "viint.h" +#include "../os/osint.h" + +OSDevMgr __osViDevMgr = { 0 }; +#if BUILD_VERSION >= VERSION_I_P +u32 __additional_scanline = 0; +#endif +static OSThread viThread; +static unsigned char viThreadStack[OS_VIM_STACKSIZE] ALIGNED(16); +static OSMesgQueue viEventQueue ALIGNED(8); +static OSMesg viEventBuf[5] ALIGNED(8); +static OSIoMesg viRetraceMsg ALIGNED(8); +static OSIoMesg viCounterMsg ALIGNED(8); + +static void viMgrMain(void* arg); +void osCreateViManager(OSPri pri) { + u32 savedMask; + OSPri oldPri; + OSPri myPri; + +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATEVIMANAGER, 1, pri); + return; + } +#endif + + if (__osViDevMgr.active) { + return; + } + __osTimerServicesInit(); +#if BUILD_VERSION >= VERSION_I_P + __additional_scanline = 0; +#endif + osCreateMesgQueue(&viEventQueue, viEventBuf, ARRLEN(viEventBuf)); + viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE; + viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL; + viRetraceMsg.hdr.retQueue = NULL; + viCounterMsg.hdr.type = OS_MESG_TYPE_COUNTER; + viCounterMsg.hdr.pri = OS_MESG_PRI_NORMAL; + viCounterMsg.hdr.retQueue = NULL; + osSetEventMesg(OS_EVENT_VI, &viEventQueue, &viRetraceMsg); + osSetEventMesg(OS_EVENT_COUNTER, &viEventQueue, &viCounterMsg); + oldPri = -1; + myPri = osGetThreadPri(NULL); + + if (myPri < pri) { + oldPri = myPri; + osSetThreadPri(NULL, pri); + } + + savedMask = __osDisableInt(); + __osViDevMgr.active = TRUE; + __osViDevMgr.thread = &viThread; + __osViDevMgr.cmdQueue = &viEventQueue; + __osViDevMgr.evtQueue = &viEventQueue; + __osViDevMgr.acsQueue = NULL; + __osViDevMgr.dma = NULL; + __osViDevMgr.edma = NULL; + osCreateThread(&viThread, 0, viMgrMain, &__osViDevMgr, &viThreadStack[OS_VIM_STACKSIZE], pri); + __osViInit(); + osStartThread(&viThread); + __osRestoreInt(savedMask); + + if (oldPri != -1) { + osSetThreadPri(NULL, oldPri); + } +} + +static void viMgrMain(void* arg) { + __OSViContext* vc; + OSDevMgr* dm; + OSIoMesg* mb; + static u16 retrace; + s32 first; + u32 count; + + mb = NULL; + first = 0; + vc = __osViGetCurrentContext(); + retrace = vc->retraceCount; + if (retrace == 0) { + retrace = 1; + } + dm = (OSDevMgr*)arg; + + while (TRUE) { + osRecvMesg(dm->evtQueue, (OSMesg)&mb, OS_MESG_BLOCK); + switch (mb->hdr.type) { + case OS_MESG_TYPE_VRETRACE: + __osViSwapContext(); + retrace--; + + if (retrace == 0) { + vc = __osViGetCurrentContext(); + if (vc->msgq != NULL) { + osSendMesg(vc->msgq, vc->msg, OS_MESG_NOBLOCK); + } + retrace = vc->retraceCount; + } + + __osViIntrCount++; + + if (first) { + count = osGetCount(); + __osCurrentTime = count; + first = 0; + } + + count = __osBaseCounter; + __osBaseCounter = osGetCount(); + count = __osBaseCounter - count; + __osCurrentTime = __osCurrentTime + count; + break; + case OS_MESG_TYPE_COUNTER: + __osTimerInterrupt(); + break; + default: + break; + } + } +} diff --git a/lib/ultralib/src/io/virepeatline.c b/lib/ultralib/src/io/virepeatline.c new file mode 100644 index 0000000..1bc4984 --- /dev/null +++ b/lib/ultralib/src/io/virepeatline.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViRepeatLine(u8 active) { + register u32 saveMask = __osDisableInt(); + + if (active) { + __osViNext->state |= VI_STATE_REPEATLINE; + } else { + __osViNext->state &= ~VI_STATE_REPEATLINE; + } + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/io/visetevent.c b/lib/ultralib/src/io/visetevent.c new file mode 100644 index 0000000..f741a0e --- /dev/null +++ b/lib/ultralib/src/io/visetevent.c @@ -0,0 +1,70 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "viint.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetEvent(OSMesgQueue* mq, OSMesg m, u32 retraceCount) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETEVENT, 0); + return; + } + + assert(mq != NULL); +#endif + + saveMask = __osDisableInt(); + + __osViNext->msgq = mq; + __osViNext->msg = m; + __osViNext->retraceCount = retraceCount; + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/io/visetmode.c b/lib/ultralib/src/io/visetmode.c new file mode 100644 index 0000000..5ab2094 --- /dev/null +++ b/lib/ultralib/src/io/visetmode.c @@ -0,0 +1,67 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "viint.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetMode(OSViMode* modep) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETMODE, 0); + return; + } + + assert(modep != NULL); +#endif + + saveMask = __osDisableInt(); + + __osViNext->modep = modep; + __osViNext->state = VI_STATE_MODE_UPDATED; + __osViNext->control = __osViNext->modep->comRegs.ctrl; + __osRestoreInt(saveMask); +} diff --git a/src/libultra/io/visetspecial.c b/lib/ultralib/src/io/visetspecial.c similarity index 57% rename from src/libultra/io/visetspecial.c rename to lib/ultralib/src/io/visetspecial.c index e8f90b8..0a288e5 100644 --- a/src/libultra/io/visetspecial.c +++ b/lib/ultralib/src/io/visetspecial.c @@ -1,12 +1,36 @@ -#include -#include +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" #include "viint.h" // 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 = __osDisableInt(); + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETSPECIAL_VIMGR, 0); + return; + } + + if ((func < OS_VI_GAMMA_ON) || (func > OS_VI_SPECIAL_MAX)) { + __osError(ERR_OSVISETSPECIAL_VALUE, 1, func); + return; + } +#endif + + saveMask = __osDisableInt(); if ((func & OS_VI_GAMMA_ON) != 0) { __osViNext->control |= VI_CTRL_GAMMA_ON; @@ -15,33 +39,33 @@ void osViSetSpecialFeatures(u32 func) { if ((func & OS_VI_GAMMA_OFF) != 0) { __osViNext->control &= ~VI_CTRL_GAMMA_ON; } - + if ((func & OS_VI_GAMMA_DITHER_ON) != 0) { __osViNext->control |= VI_CTRL_GAMMA_DITHER_ON; } - + if ((func & OS_VI_GAMMA_DITHER_OFF) != 0) { __osViNext->control &= ~VI_CTRL_GAMMA_DITHER_ON; } - + if ((func & OS_VI_DIVOT_ON) != 0) { __osViNext->control |= VI_CTRL_DIVOT_ON; } - + if ((func & OS_VI_DIVOT_OFF) != 0) { __osViNext->control &= ~VI_CTRL_DIVOT_ON; } - + if ((func & OS_VI_DITHER_FILTER_ON) != 0) { __osViNext->control |= VI_CTRL_DITHER_FILTER_ON; __osViNext->control &= ~VI_CTRL_ANTIALIAS_MASK; } - + if ((func & OS_VI_DITHER_FILTER_OFF) != 0) { __osViNext->control &= ~VI_CTRL_DITHER_FILTER_ON; __osViNext->control |= __osViNext->modep->comRegs.ctrl & VI_CTRL_ANTIALIAS_MASK; } - + __osViNext->state |= VI_STATE_CTRL_UPDATED; __osRestoreInt(saveMask); diff --git a/lib/ultralib/src/io/visetxscale.c b/lib/ultralib/src/io/visetxscale.c new file mode 100644 index 0000000..6af6535 --- /dev/null +++ b/lib/ultralib/src/io/visetxscale.c @@ -0,0 +1,37 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetXScale(f32 value) { + register u32 nomValue; + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETXSCALE_VIMGR, 0); + return; + } + + if ((value < 0.25f) || (value > 1.0f)) { + __osError(ERR_OSVISETXSCALE_VALUE, 1, OS_LOG_FLOAT(value)); + + if (value < 0.25f) { + value = 0.25f; + } else { + value = 1.0f; + } + } +#endif + + saveMask = __osDisableInt(); + + __osViNext->x.factor = value; + __osViNext->state |= VI_STATE_XSCALE_UPDATED; + nomValue = __osViNext->modep->comRegs.xScale & VI_SCALE_MASK; + __osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & VI_SCALE_MASK; + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/io/visetyscale.c b/lib/ultralib/src/io/visetyscale.c new file mode 100644 index 0000000..c1c96f4 --- /dev/null +++ b/lib/ultralib/src/io/visetyscale.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetYScale(f32 value) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETYSCALE_VIMGR, 0); + return; + } + + if ((value < 0.05f) || (value > 1.0f)) { + __osError(ERR_OSVISETYSCALE_VALUE, 1, OS_LOG_FLOAT(value)); + + if (value < 0.05f) { + value = 0.05f; + } else { + value = 1.0f; + } + } +#endif + + saveMask = __osDisableInt(); + + __osViNext->y.factor = value; + __osViNext->state |= VI_STATE_YSCALE_UPDATED; + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/io/viswapbuf.c b/lib/ultralib/src/io/viswapbuf.c new file mode 100644 index 0000000..aa077cd --- /dev/null +++ b/lib/ultralib/src/io/viswapbuf.c @@ -0,0 +1,75 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "viint.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSwapBuffer(void* frameBufPtr) { + u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISWAPBUFFER_VIMGR, 0); + return; + } + + assert(frameBufPtr != NULL); + + if ((u32)frameBufPtr & 0x3f) { + __osError(ERR_OSVISWAPBUFFER_ADDR, 1, frameBufPtr); + return; + } +#endif + + saveMask = __osDisableInt(); + + __osViNext->framep = frameBufPtr; + __osViNext->state |= VI_STATE_BUFFER_UPDATED; + __osRestoreInt(saveMask); +} diff --git a/src/libultra/io/viswapcontext.c b/lib/ultralib/src/io/viswapcontext.c similarity index 81% rename from src/libultra/io/viswapcontext.c rename to lib/ultralib/src/io/viswapcontext.c index 01edcd4..3baf614 100644 --- a/src/libultra/io/viswapcontext.c +++ b/lib/ultralib/src/io/viswapcontext.c @@ -1,28 +1,28 @@ -#include -#include +#include "PR/os_internal.h" +#include "PR/rcp.h" #include "viint.h" // TODO: this comes from a header #ident "$Revision: 1.17 $" void __osViSwapContext() { - register OSViMode *vm; - register __OSViContext *vc; + register OSViMode* vm; + register __OSViContext* vc; u32 origin; u32 hStart; +#if BUILD_VERSION >= VERSION_I_P u32 vStart; +#endif u32 nomValue; u32 field; - register u32 s2; field = 0; vc = __osViNext; vm = vc->modep; - field = IO_READ(VI_CURRENT_REG) & 1; //field num + field = IO_READ(VI_CURRENT_REG) & 1; // field num - s2 = osVirtualToPhysical(vc->framep); - origin = (vm->fldRegs[field].origin) + s2; + origin = osVirtualToPhysical(vc->framep) + (vm->fldRegs[field].origin); if (vc->state & VI_STATE_XSCALE_UPDATED) { vc->x.scale |= (vm->comRegs.xScale & ~VI_SCALE_MASK); } else { @@ -37,7 +37,9 @@ void __osViSwapContext() { vc->y.scale = vm->fldRegs[field].yScale; } +#if BUILD_VERSION >= VERSION_I_P vStart = (vm->fldRegs[field].vStart - (__additional_scanline << 0x10)) + __additional_scanline; +#endif hStart = vm->comRegs.hStart; if (vc->state & VI_STATE_BLACK) { @@ -61,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_I_P 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 new file mode 100644 index 0000000..476036e --- /dev/null +++ b/lib/ultralib/src/io/vitbl.c @@ -0,0 +1,1740 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeTable[] = { + { OS_VI_NTSC_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + //[0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, +#if BUILD_VERSION >= VERSION_J + { OS_VI_FPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } } +#endif +}; diff --git a/lib/ultralib/src/libc/bcmp.s b/lib/ultralib/src/libc/bcmp.s new file mode 100644 index 0000000..11db46d --- /dev/null +++ b/lib/ultralib/src/libc/bcmp.s @@ -0,0 +1,96 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +#ifdef __sgi +WEAK(bcmp, _bcmp) +#else +#define _bcmp bcmp +#endif +LEAF(_bcmp) + xor v0, a0, a1 + blt a2, 16, bytecmp + + andi v0, v0, 0x3 + negu t8, a0 + bnez v0, unalgncmp + + andi t8, t8, 0x3 + subu a2, a2, t8 + beqz t8, wordcmp + + move v0, v1 + lwl v0, 0(a0) + lwl v1, 0(a1) + addu a0, a0, t8 + addu a1, a1, t8 + bne v0, v1, cmpne + +wordcmp: + and a3, a2, ~3 + subu a2, a2, a3 + beqz a3, bytecmp + + addu a3, a3, a0 +1: + lw v0, 0(a0) + lw v1, 0(a1) + addiu a0, a0, 4 + addiu a1, a1, 4 + bne v0, v1, cmpne + bne a0, a3, 1b + + b bytecmp +unalgncmp: + negu a3, a1 + andi a3, a3, 0x3 + subu a2, a2, a3 + beqz a3, partaligncmp + + addu a3, a3, a0 + +1: + lbu v0, 0(a0) + lbu v1, 0(a1) + addiu a0, a0, 1 + addiu a1, a1, 1 + bne v0, v1, cmpne + bne a0, a3, 1b + +partaligncmp: + and a3, a2, ~3 + subu a2, a2, a3 + beqz a3, bytecmp + + addu a3, a3, a0 + +1: + lwl v0, 0(a0) + lwr v0, 3(a0) + lw v1, 0(a1) + addiu a0, a0, 4 + addiu a1, a1, 4 + bne v0, v1, cmpne + bne a0, a3, 1b + +bytecmp: + addu a3, a2, a0 + blez a2, cmpdone + +1: + lbu v0, 0(a0) + lbu v1, 0(a1) + addiu a0, a0, 1 + addiu a1, a1, 1 + bne v0, v1, cmpne + bne a0, a3, 1b + +cmpdone: + move v0, zero + jr ra +cmpne: + li v0, 1 + jr ra + +.end _bcmp diff --git a/lib/ultralib/src/libc/bcopy.s b/lib/ultralib/src/libc/bcopy.s new file mode 100644 index 0000000..216c378 --- /dev/null +++ b/lib/ultralib/src/libc/bcopy.s @@ -0,0 +1,220 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +#ifdef __sgi +WEAK(bcopy, _bcopy) +#else +#define _bcopy bcopy +#endif +LEAF(_bcopy) + move a3, a1 + beqz a2, ret + beq a0, a1, ret + blt a1, a0, goforwards + + add v0, a0, a2 + bge a1, v0, goforwards + b gobackwards + +goforwards: + + blt a2, 16, forwards_bytecopy + + andi v0, a0, 0x3 + andi v1, a1, 0x3 + beq v0, v1,forwalignable + + +forwards_bytecopy: + beqz a2, ret + addu v1, a0, a2 +99: + lb v0, 0(a0) + addiu a0, a0, 1 + sb v0, 0(a1) + addiu a1, a1, 1 + bne a0, v1, 99b +ret: + move v0, a3 + jr ra + +forwalignable: + beqz v0, forwards + beq v0, 1, forw_copy3 + beq v0, 2, forw_copy2 + + lb v0, 0(a0) + addiu a0, a0, 1 + sb v0, 0(a1) + addiu a1, a1, 1 + addiu a2, a2, -1 + b forwards + +forw_copy2: + lh v0, 0(a0) + addiu a0, a0, 2 + sh v0, 0(a1) + addiu a1, a1, 2 + addiu a2, a2, -2 + b forwards + +forw_copy3: + lb v0, 0(a0) + lh v1, 1(a0) + addiu a0, a0, 3 + sb v0, 0(a1) + sh v1, 1(a1) + addiu a1, a1, 3 + addiu a2, a2, -3 + +forwards: +forwards_32: + blt a2, 32, forwards_16 + lw v0, 0(a0) + lw v1, 4(a0) + lw t0, 8(a0) + lw t1, 12(a0) + lw t2, 16(a0) + lw t3, 20(a0) + lw ta0, 24(a0) + lw ta1, 28(a0) + addiu a0, a0, 32 + sw v0, 0(a1) + sw v1, 4(a1) + sw t0, 8(a1) + sw t1, 12(a1) + sw t2, 16(a1) + sw t3, 20(a1) + sw ta0, 24(a1) + sw ta1, 28(a1) + addiu a1, a1, 32 + addiu a2, a2, -32 + b forwards_32 + +forwards_16: + blt a2, 16, forwards_4 + lw v0, 0(a0) + lw v1, 4(a0) + lw t0, 8(a0) + lw t1, 12(a0) + addiu a0, a0, 16 + sw v0, 0(a1) + sw v1, 4(a1) + sw t0, 8(a1) + sw t1, 12(a1) + addiu a1, a1, 16 + addiu a2, a2, -16 + b forwards_16 + +forwards_4: + blt a2, 4, forwards_bytecopy + + lw v0, 0(a0) + addiu a0, a0, 4 + sw v0, 0(a1) + addiu a1, a1, 4 + addiu a2, a2, -4 + b forwards_4 + +gobackwards: + add a0, a0,a2 + add a1, a1,a2 + blt a2, 16, backwards_bytecopy + + andi v0, a0, 0x3 + andi v1, a1, 0x3 + beq v0, v1,backalignable + +backwards_bytecopy: + beqz a2, ret + addiu a0, a0, -1 + addiu a1, a1, -1 + subu v1, a0,a2 +99: + lb v0, 0(a0) + addiu a0, a0, -1 + sb v0, 0(a1) + addiu a1, a1, -1 + bne a0, v1,99b + + move v0, a3 + jr ra +backalignable: + beqz v0, backwards + beq v0, 3, back_copy3 + beq v0, 2, back_copy2 + lb v0, -1(a0) + addiu a0, a0, -1 + sb v0, -1(a1) + addiu a1, a1, -1 + addiu a2, a2, -1 + b backwards + +back_copy2: + lh v0, -2(a0) + addiu a0, a0, -2 + sh v0, -2(a1) + addiu a1, a1, -2 + addiu a2, a2, -2 + b backwards + +back_copy3: + lb v0, -1(a0) + lh v1, -3(a0) + addiu a0, a0, -3 + sb v0, -1(a1) + sh v1, -3(a1) + addiu a1, a1, -3 + addiu a2, a2, -3 + +backwards: +backwards_32: + blt a2, 32, backwards_16 + lw v0, -4(a0) + lw v1, -8(a0) + lw t0, -12(a0) + lw t1, -16(a0) + lw t2, -20(a0) + lw t3, -24(a0) + lw ta0, -28(a0) + lw ta1, -32(a0) + addiu a0, a0, -32 + sw v0, -4(a1) + sw v1, -8(a1) + sw t0, -12(a1) + sw t1, -16(a1) + sw t2, -20(a1) + sw t3, -24(a1) + sw ta0, -28(a1) + sw ta1, -32(a1) + addiu a1, a1, -32 + addiu a2, a2, -32 + b backwards_32 + +backwards_16: + blt a2, 16, backwards_4 + lw v0, -4(a0) + lw v1, -8(a0) + lw t0, -12(a0) + lw t1, -16(a0) + addiu a0, a0, -16 + sw v0, -4(a1) + sw v1, -8(a1) + sw t0, -12(a1) + sw t1, -16(a1) + addiu a1, a1, -16 + addiu a2, a2, -16 + b backwards_16 + +backwards_4: + blt a2, 4, backwards_bytecopy + lw v0, -4(a0) + addiu a0, a0, -4 + sw v0, -4(a1) + addiu a1, a1, -4 + addiu a2, a2, -4 + b backwards_4 + +.end _bcopy diff --git a/lib/ultralib/src/libc/bzero.s b/lib/ultralib/src/libc/bzero.s new file mode 100644 index 0000000..894c186 --- /dev/null +++ b/lib/ultralib/src/libc/bzero.s @@ -0,0 +1,64 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +#ifdef __sgi +WEAK(bzero, _bzero) +WEAK(blkclr, _blkclr) +#else +#define _bzero bzero +#define _blkclr blkclr +#endif +LEAF(_bzero) +XLEAF(_blkclr) + negu v1, a0 + blt a1, 12, bytezero + + andi v1, v1, 0x3 + subu a1, a1, v1 + + beqz v1, blkzero + swl zero, 0(a0) + addu a0, a0, v1 +blkzero: + and a3, a1, ~31 + subu a1, a1, a3 + beqz a3, wordzero + + addu a3, a3, a0 +1: + sw zero, 0(a0) + sw zero, 4(a0) + sw zero, 8(a0) + sw zero, 12(a0) + addiu a0, a0, 32 + sw zero, -16(a0) + sw zero, -12(a0) + sw zero, -8(a0) + sw zero, -4(a0) + bne a0, a3, 1b + +wordzero: + and a3, a1, ~3 + subu a1, a1, a3 + beqz a3, bytezero + + addu a3, a3, a0 +1: + addiu a0, a0, 4 + sw zero, -4(a0) + bne a0, a3, 1b + +bytezero: + blez a1, zerodone + #nop + addu a1, a1, a0 +1: + addiu a0, a0, 1 + sb zero, -1(a0) + bne a0, a1, 1b +zerodone: + jr ra + +.end _bzero diff --git a/lib/ultralib/src/libc/ldiv.c b/lib/ultralib/src/libc/ldiv.c new file mode 100644 index 0000000..92388d3 --- /dev/null +++ b/lib/ultralib/src/libc/ldiv.c @@ -0,0 +1,34 @@ +#include "os_version.h" +#include "stdlib.h" + +// TODO: these come from headers +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" + +ldiv_t ldiv(long num, long denom) { + ldiv_t ret; + + ret.quot = num / denom; + ret.rem = num - denom * ret.quot; + + if (ret.quot < 0 && ret.rem > 0) { + ret.quot += 1; + ret.rem -= denom; + } + + return ret; +} + +lldiv_t lldiv(long long num, long long denom) { + lldiv_t ret; + + ret.quot = num / denom; + ret.rem = num - denom * ret.quot; + + if (ret.quot < 0 && ret.rem > 0) { + ret.quot += 1; + ret.rem -= denom; + } + + return ret; +} diff --git a/lib/ultralib/src/libc/ll.c b/lib/ultralib/src/libc/ll.c new file mode 100644 index 0000000..4334b03 --- /dev/null +++ b/lib/ultralib/src/libc/ll.c @@ -0,0 +1,48 @@ +#include "PR/os.h" + +unsigned long long __ull_rshift(unsigned long long a0, unsigned long long a1) { + return a0 >> a1; +} + +unsigned long long __ull_rem(unsigned long long a0, unsigned long long a1) { + return a0 % a1; +} + +unsigned long long __ull_div(unsigned long long a0, unsigned long long a1) { + return a0 / a1; +} + +unsigned long long __ll_lshift(unsigned long long a0, unsigned long long a1) { + return a0 << a1; +} + +long long __ll_rem(unsigned long long a0, long long a1) { + return a0 % a1; +} + +long long __ll_div(long long a0, long long a1) { + return a0 / a1; +} + +unsigned long long __ll_mul(unsigned long long a0, unsigned long long a1) { + return a0 * a1; +} + +void __ull_divremi(unsigned long long* div, unsigned long long* rem, unsigned long long a2, unsigned short a3) { + *div = a2 / a3; + *rem = a2 % a3; +} + +long long __ll_mod(long long a0, long long a1) { + long long tmp = a0 % a1; + + if ((tmp < 0 && a1 > 0) || (tmp > 0 && a1 < 0)) { + tmp += a1; + } + + return tmp; +} + +long long __ll_rshift(long long a0, long long a1) { + return a0 >> a1; +} diff --git a/lib/ultralib/src/libc/llbit.c b/lib/ultralib/src/libc/llbit.c new file mode 100644 index 0000000..0680726 --- /dev/null +++ b/lib/ultralib/src/libc/llbit.c @@ -0,0 +1,52 @@ +#include "PR/os.h" +#include "PR/ultratypes.h" + +s64 __ll_bit_extract(u64* addr, unsigned int start_bit, unsigned int length) { + unsigned int words; + unsigned int lbits; + unsigned int rbits; + u64 mask; + + words = start_bit / 64; + lbits = start_bit & (64 - 1); + rbits = 64 - (lbits + length); + + addr += words; + mask = ((u64)1 << length) - 1; + mask = mask << rbits; + return (s64)((*addr & mask) >> rbits); +} + +u64 __ull_bit_extract(u64* addr, unsigned int start_bit, unsigned int length) { + unsigned int words; + unsigned int lbits; + unsigned int rbits; + u64 mask; + + words = start_bit / 64; + lbits = start_bit & (64 - 1); + rbits = 64 - (lbits + length); + addr += words; + mask = ((u64)1 << length) - 1; + mask = mask << rbits; + return (u64)((*addr & mask) >> rbits); +} + +u64 __ll_bit_insert(u64* addr, unsigned int start_bit, unsigned int length, u64 val) { + unsigned int words; + unsigned int lbits; + unsigned int rbits; + unsigned long long llval; + unsigned long long mask; + + words = start_bit / 64; + lbits = start_bit & 0x3f; + rbits = 64 - (lbits + length); + addr += words; + mask = ((u64)1 << length) - 1; + mask <<= rbits; + llval = (val << (64 - length)) >> lbits; + *addr = (*addr & ~mask) | llval; + llval = llval >> rbits; + return llval; +} diff --git a/src/libultra/libc/llcvt.c b/lib/ultralib/src/libc/llcvt.c similarity index 73% rename from src/libultra/libc/llcvt.c rename to lib/ultralib/src/libc/llcvt.c index 2c423dd..74d244b 100644 --- a/src/libultra/libc/llcvt.c +++ b/lib/ultralib/src/libc/llcvt.c @@ -1,31 +1,31 @@ long long __d_to_ll(double d) { - return d; + return d; } long long __f_to_ll(float f) { - return f; + return f; } unsigned long long __d_to_ull(double d) { - return d; + return d; } unsigned long long __f_to_ull(float f) { - return f; + return f; } double __ll_to_d(long long s) { - return s; + return s; } float __ll_to_f(long long s) { - return s; + return s; } double __ull_to_d(unsigned long long u) { - return u; + return u; } float __ull_to_f(unsigned long long u) { - return u; + return u; } diff --git a/lib/ultralib/src/libc/sprintf.c b/lib/ultralib/src/libc/sprintf.c new file mode 100644 index 0000000..fd95523 --- /dev/null +++ b/lib/ultralib/src/libc/sprintf.c @@ -0,0 +1,22 @@ +#include "xstdio.h" +#include "string.h" +#include "os.h" + +// TODO: this comes from a header +#ident "$Revision: 1.23 $" + +static char* proutSprintf(char* dst, const char* src, size_t count); + +int sprintf(char* dst, const char* fmt, ...) { + s32 ans; + va_list ap; + va_start(ap, fmt); + ans = _Printf(proutSprintf, dst, fmt, ap); + if (ans >= 0) { + dst[ans] = 0; + } + return ans; +} +static char* proutSprintf(char* dst, const char* src, size_t count) { + return (char*)memcpy((u8*)dst, (u8*)src, count) + count; +} diff --git a/src/libultra/libc/string.c b/lib/ultralib/src/libc/string.c similarity index 50% rename from src/libultra/libc/string.c rename to lib/ultralib/src/libc/string.c index 5f085f6..0f01d1f 100644 --- a/src/libultra/libc/string.c +++ b/lib/ultralib/src/libc/string.c @@ -1,38 +1,36 @@ +#include "PR/ultratypes.h" #include "string.h" -const char* strchr(const char* s, int c) { - const unsigned char ch = c; +// TODO: this comes from a header +#ident "$Revision: 1.23 $" +char* strchr(const char* s, int c) { + const char ch = c; while (*s != ch) { - if (*s == '\0') { + if (*s == 0) { return NULL; } s++; } - - return s; + return (char*)s; } size_t strlen(const char* s) { const char* sc = s; - - while (*sc != '\0') { + while (*sc != 0) { sc++; } - - return (size_t)(sc - s); + return sc - s; } void* memcpy(void* s1, const void* s2, size_t n) { - unsigned char* su1 = (unsigned char*)s1; - const unsigned char* su2 = (const unsigned char*)s2; - + char* su1 = (char*)s1; + const char* su2 = (const char*)s2; while (n > 0) { *su1 = *su2; su1++; su2++; n--; } - - return s1; + return (void*)s1; } diff --git a/lib/ultralib/src/libc/syncprintf.c b/lib/ultralib/src/libc/syncprintf.c new file mode 100644 index 0000000..572ac73 --- /dev/null +++ b/lib/ultralib/src/libc/syncprintf.c @@ -0,0 +1,154 @@ +#include "stdarg.h" +#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; +#ifndef _FINALROM + if (__printfunc != NULL) { + ans = _Printf(__printfunc, NULL, fmt, args); + } +#endif +} + +void osSyncPrintf(const char* fmt, ...) { + int ans; + va_list ap; + +#ifndef _FINALROM + va_start(ap, fmt); + __osSyncVPrintf(fmt, ap); + va_end(ap); +#endif +} + +void rmonPrintf(const char* fmt, ...) { + int ans; + va_list ap; + +#ifndef _FINALROM + va_start(ap, fmt); + if (__printfunc != NULL) { + ans = _Printf(__printfunc, NULL, fmt, ap); + } + va_end(ap); +#endif +} + +#endif diff --git a/src/libultra/libc/xldtob.c b/lib/ultralib/src/libc/xldtob.c similarity index 82% rename from src/libultra/libc/xldtob.c rename to lib/ultralib/src/libc/xldtob.c index b032e57..1dc1434 100644 --- a/src/libultra/libc/xldtob.c +++ b/lib/ultralib/src/libc/xldtob.c @@ -69,34 +69,36 @@ void _Ldtob(_Pft* px, char code) { nsig = 0; xexp = 0; } else { - int i; - int n; + { + int i; + int n; - if (ldval < 0) { - ldval = -ldval; - } - - // what - if ((xexp = xexp * 30103 / 100000 - 4) < 0) { - n = ALIGN(-xexp, 4), xexp = -n; - - for (i = 0; n > 0; n >>= 1, i++) { - if (n & 1) { - ldval *= pows[i]; - } - } - } else if (xexp > 0) { - f64 factor = 1; - - xexp &= ~3; - - for (n = xexp, i = 0; n > 0; n >>= 1, i++) { - if (n & 1) { - factor *= pows[i]; - } + if (ldval < 0) { + ldval = -ldval; } - ldval /= factor; + // what + if ((xexp = xexp * 30103 / 100000 - 4) < 0) { + n = ALIGN(-xexp, 4), xexp = -n; + + for (i = 0; n > 0; n >>= 1, i++) { + if (n & 1) { + ldval *= pows[i]; + } + } + } else if (xexp > 0) { + f64 factor = 1; + + xexp &= ~3; + + for (n = xexp, i = 0; n > 0; n >>= 1, i++) { + if (n & 1) { + factor *= pows[i]; + } + } + + ldval /= factor; + } } { int gen = px->prec + ((code == 'f') ? 10 + xexp : 6); @@ -107,14 +109,15 @@ void _Ldtob(_Pft* px, char code) { for (*p++ = '0'; gen > 0 && 0 < ldval; p += 8) { int j; - int lo = ldval; + long lo = ldval; if ((gen -= 8) > 0) { ldval = (ldval - lo) * 1e8; } for (p += 8, j = 8; lo > 0 && --j >= 0;) { - ldiv_t qr = ldiv(lo, 10); + ldiv_t qr; + qr = ldiv(lo, 10); *--p = qr.rem + '0', lo = qr.quot; } @@ -136,7 +139,7 @@ void _Ldtob(_Pft* px, char code) { } if (nsig > 0) { - char drop = nsig < gen && '5' <= p[nsig] ? '9' : '0'; + const char drop = nsig < gen && '5' <= p[nsig] ? '9' : '0'; int n; for (n = nsig; p[--n] == drop;) { @@ -158,7 +161,7 @@ void _Ldtob(_Pft* px, char code) { } s16 _Ldunscale(s16* pex, _Pft* px) { - u16* ps = px; + u16* ps = (u16*)px; s16 xchar = (ps[_D0] & _DMASK) >> _DOFF; @@ -182,18 +185,17 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { const unsigned char point = '.'; if (nsig <= 0) { - nsig = 1, p = "0"; // memes + nsig = 1, p = "0"; } if (code == 'f' || (code == 'g' || code == 'G') && xexp >= -4 && xexp < px->prec) { - xexp += 1; + xexp++; if (code != 'f') { if (((px->flags & 8) == 0) && nsig < px->prec) { px->prec = nsig; } - px->prec -= xexp; - if (px->prec < 0) { + if ((px->prec -= xexp) < 0) { px->prec = 0; } } @@ -216,7 +218,7 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { nsig = px->prec; } - memcpy(&px->s[px->n1], p, px->n2 = nsig); // , memes (this one is insane) + memcpy(&px->s[px->n1], p, px->n2 = nsig); px->nz2 = px->prec - nsig; } else if (nsig < xexp) { memcpy(&px->s[px->n1], p, nsig); @@ -224,7 +226,7 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { px->nz1 = xexp - nsig; if (px->prec > 0 || (px->flags & 8)) { px->s[px->n1] = point; - px->n2 += 1; + px->n2++; } px->nz2 = px->prec; @@ -255,11 +257,7 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { px->prec = 0; } - if (code == 'g') { - code = 'e'; - } else { - code = 'E'; - } + code = (code == 'g') ? 'e' : 'E'; } px->s[px->n1++] = *p++; @@ -290,11 +288,11 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { if (xexp >= 100) { if (xexp >= 1000) { - *p++ = (xexp / 1000) + '0', xexp %= 1000; // , memes + *p++ = (xexp / 1000) + '0', xexp %= 1000; } - *p++ = (xexp / 100) + '0', xexp %= 100; // , memes + *p++ = (xexp / 100) + '0', xexp %= 100; } - *p++ = (xexp / 10) + '0', xexp %= 10; // , memes + *p++ = (xexp / 10) + '0', xexp %= 10; *p++ = xexp + '0'; px->n2 = (size_t)p - ((size_t)px->s + px->n1); diff --git a/src/libultra/libc/xlitob.c b/lib/ultralib/src/libc/xlitob.c similarity index 87% rename from src/libultra/libc/xlitob.c rename to lib/ultralib/src/libc/xlitob.c index f297df4..2b27b3a 100644 --- a/src/libultra/libc/xlitob.c +++ b/lib/ultralib/src/libc/xlitob.c @@ -19,11 +19,7 @@ void _Litob(_Pft *args, char type) { s32 i; unsigned long long ullval; - if (type == 'X') { - digs = udigs; - } else { - digs = ldigs; - } + digs = (type == 'X') ? udigs : ldigs; base = (type == 'o') ? 8 : ((type != 'x' && type != 'X') ? 10 : 16); i = BUFF_LEN; @@ -55,9 +51,7 @@ void _Litob(_Pft *args, char type) { } if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { - i = args->width - args->n0 - args->nz0 - args->n1; - - if (i > 0) { + if ((i = args->width - args->n0 - args->nz0 - args->n1) > 0) { args->nz0 += i; } } diff --git a/lib/ultralib/src/libc/xprintf.c b/lib/ultralib/src/libc/xprintf.c new file mode 100644 index 0000000..788f42c --- /dev/null +++ b/lib/ultralib/src/libc/xprintf.c @@ -0,0 +1,257 @@ +#include "macros.h" +#include "string.h" +#include "stdarg.h" +#include "xstdio.h" + +// TODO: these come from headers +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.23 $" + +#define isdigit(x) ((x >= '0' && x <= '9')) +#define LDSIGN(x) (((unsigned short *)&(x))[0] & 0x8000) + +#define ATOI(dst, src) \ + for (dst = 0; isdigit(*src); ++src) \ + { \ + if (dst < 999) \ + dst = dst * 10 + *src - '0'; \ + } + +#define MAX_PAD ((sizeof(spaces) - 1)) +#define PAD(s, n) \ + if (0 < (n)) \ + { \ + int i, j = (n); \ + for (; 0 < j; j -= i) \ + { \ + i = MAX_PAD < (unsigned int)j ? (int)MAX_PAD : j; \ + PUT(s, i); \ + } \ + } +#define PUT(s, n) \ + if (0 < (n)) \ + { \ + if ((arg = (*prout)(arg, s, n)) != NULL) \ + x.nchar += (n); \ + else \ + return x.nchar; \ + } +static char spaces[] = " "; +static char zeroes[] = "00000000000000000000000000000000"; + +static void _Putfld(_Pft *pf, va_list *pap, char code, char *ac); + +int _Printf(outfun prout, char *arg, const char *fmt, va_list args) { + _Pft x; + + x.nchar = 0; + + while (TRUE) { + const char *s; + char c; + const char *t; + static const char fchar[] = {' ', '+', '-', '#', '0', '\0'}; + static const int fbit[] = {FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAGS_ZERO, 0}; + char ac[32]; + s = fmt; + + for (c = *s; c != 0 && c != '%';) { + c = *++s; + } + + PUT(fmt, s - fmt); + + if (c == 0) { + return x.nchar; + } + + fmt = ++s; + + for (x.flags = 0; (t = strchr(fchar, *s)) != NULL; s++) { + x.flags |= fbit[t - fchar]; + } + + if (*s == '*') { + x.width = va_arg(args, int); + + if (x.width < 0) { + x.width = -x.width; + x.flags |= FLAGS_MINUS; + } + s++; + } else + ATOI(x.width, s); + + + if (*s != '.') { + x.prec = -1; + } else if (*++s == '*') { + x.prec = va_arg(args, int); + ++s; + } else + for (x.prec = 0; isdigit(*s); s++) { + if (x.prec < 999) + x.prec = x.prec * 10 + *s - '0'; + } + + + x.qual = strchr("hlL", *s) ? *s++ : '\0'; + + if (x.qual == 'l' && *s == 'l') { + x.qual = 'L'; + ++s; + } + + _Putfld(&x, &args, *s, ac); + x.width -= x.n0 + x.nz0 + x.n1 + x.nz1 + x.n2 + x.nz2; + + { + + if (!(x.flags & FLAGS_MINUS)) { + int i, j; + if (0 < (x.width)) + { + i, j = x.width; + for (; 0 < j; j -= i) + { + i = MAX_PAD < (unsigned int)j ? (int)MAX_PAD : j; + PUT(spaces, i); + } + } + } + + PUT(ac, x.n0); + PAD(zeroes, x.nz0) + + PUT(x.s, x.n1); + PAD(zeroes, x.nz1); + + PUT(x.s + x.n1, x.n2); + PAD(zeroes, x.nz2); + + if (x.flags & FLAGS_MINUS) { + PAD(spaces, x.width); + } + } + fmt = s + 1; + } + return 0; +} + +static void _Putfld(_Pft *x, va_list *args, char type, char *buff) { + x->n0 = x->nz0 = x->n1 = x->nz1 = x->n2 = + x->nz2 = 0; + + switch (type) { + case 'c': + buff[x->n0++] = va_arg(*args, int); + break; + case 'd': + case 'i': + if (x->qual == 'l') { + x->v.ll = va_arg(*args, int); + } else if (x->qual == 'L') { + x->v.ll = va_arg(*args, s64); + } else { + x->v.ll = va_arg(*args, int); + } + + if (x->qual == 'h') { + x->v.ll = (s16)x->v.ll; + } + + if (x->v.ll < 0) { + buff[x->n0++] = '-'; + } else if (x->flags & FLAGS_PLUS) { + buff[x->n0++] = '+'; + } else if (x->flags & FLAGS_SPACE) { + buff[x->n0++] = ' '; + } + + x->s = (char *)&buff[x->n0]; + + _Litob(x, type); + break; + case 'x': + case 'X': + case 'u': + case 'o': + if (x->qual == 'l') { + x->v.ll = va_arg(*args, int); + } else if (x->qual == 'L') { + x->v.ll = va_arg(*args, s64); + } else { + x->v.ll = va_arg(*args, int); + } + + if (x->qual == 'h') { + x->v.ll = (u16)x->v.ll; + } else if (x->qual == 0) { + x->v.ll = (unsigned int)x->v.ll; + } + + if (x->flags & FLAGS_HASH) { + buff[x->n0++] = '0'; + + if (type == 'x' || type == 'X') { + buff[x->n0++] = type; + } + } + + x->s = (char *)&buff[x->n0]; + _Litob(x, type); + break; + case 'e': + case 'f': + case 'g': + case 'E': + case 'G': + //... okay? + x->v.ld = x->qual == 'L' ? va_arg(*args, f64) : va_arg(*args, f64); + + if (LDSIGN(x->v.ld)) + buff[x->n0++] = '-'; + else if (x->flags & FLAGS_PLUS) + buff[x->n0++] = '+'; + else if (x->flags & FLAGS_SPACE) + buff[x->n0++] = ' '; + + x->s = (char *)&buff[x->n0]; + _Ldtob(x, type); + break; + + case 'n': + if (x->qual == 'h') { + *(va_arg(*args, u16 *)) = x->nchar; + } else if (x->qual == 'l') { + *va_arg(*args, unsigned int *) = x->nchar; + } else if (x->qual == 'L') { + *va_arg(*args, u64 *) = x->nchar; + } else { + *va_arg(*args, unsigned int *) = x->nchar; + } + + break; + case 'p': + x->v.ll = (long)va_arg(*args, void *); + x->s = (char *)&buff[x->n0]; + _Litob(x, 'x'); + break; + case 's': + x->s = va_arg(*args, char *); + x->n1 = strlen(x->s); + + if (x->prec >= 0 && x->prec < x->n1) { + x->n1 = x->prec; + } + + break; + case '%': + buff[x->n0++] = '%'; + break; + default: + buff[x->n0++] = type; + break; + } +} diff --git a/lib/ultralib/src/libc/xstdio.h b/lib/ultralib/src/libc/xstdio.h new file mode 100644 index 0000000..bd70de8 --- /dev/null +++ b/lib/ultralib/src/libc/xstdio.h @@ -0,0 +1,37 @@ +#ifndef _XSTDIO_H +#define _XSTDIO_H +#include "PR/ultratypes.h" +#include "stdlib.h" +#include "stdarg.h" + +typedef struct { + /* 0x0 */ union { + /* 0x0 */ long long ll; + /* 0x0 */ double ld; + } v; + /* 0x8 */ unsigned char* s; + /* 0xC */ int n0; + /* 0x10 */ int nz0; + /* 0x14 */ int n1; + /* 0x18 */ int nz1; + /* 0x1C */ int n2; + /* 0x20 */ int nz2; + /* 0x24 */ int prec; + /* 0x28 */ int width; + /* 0x2C */ size_t nchar; + /* 0x30 */ unsigned int flags; + /* 0x34 */ char qual; +} _Pft; + +#define FLAGS_SPACE 1 +#define FLAGS_PLUS 2 +#define FLAGS_MINUS 4 +#define FLAGS_HASH 8 +#define FLAGS_ZERO 16 +typedef char *outfun(char*,const char*,size_t); + +int _Printf(outfun prout, char *arg, const char *fmt, va_list args); +void _Litob(_Pft *args, char type); +void _Ldtob(_Pft* args, char type); + +#endif diff --git a/lib/ultralib/src/log/delay.s b/lib/ultralib/src/log/delay.s new file mode 100644 index 0000000..631781a --- /dev/null +++ b/lib/ultralib/src/log/delay.s @@ -0,0 +1,24 @@ +#include "PR/os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J +#include "sys/asm.h" +#include "sys/regdef.h" + +LEAF(osDelay) + sll t0,a0,2 + addu t0,a0 + sll t0,t0,2 + beqz a0,2f + +1: + subu t0,1 + NOP + NOP + bnez t0,1b + +2: + j ra + +END(osDelay) + +#endif diff --git a/lib/ultralib/src/log/log.c b/lib/ultralib/src/log/log.c new file mode 100644 index 0000000..85129d2 --- /dev/null +++ b/lib/ultralib/src/log/log.c @@ -0,0 +1,124 @@ +#include "stdarg.h" +#include "PR/rdb.h" +#include "PR/os.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "macros.h" + +#ifndef _FINALROM + +static u32 __osLogOKtoWrite = TRUE; +static u32 __osLogInitialized = FALSE; + +static OSMesgQueue __osLogDoneMsgQ ALIGNED(8); +static OSMesg __osLogMsgBuf; + +void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr); + +void osCreateLog(OSLog* log, u32* base, s32 byteLen) { + log->magic = OS_LOG_MAGIC; + log->base = base; + log->len = byteLen; + log->startCount = osGetCount(); + log->writeOffset = 0; +} + +void osLogEvent(OSLog* log, s16 code, s16 numArgs, ...) { + va_list argPtr; + + if (numArgs > 16) { + return; + } + + va_start(argPtr, numArgs); + __osLogWrite(log, code, numArgs, argPtr); + va_end(argPtr); +} + +void osFlushLog(OSLog* log) { + s32 mask; + u32 sent; + u32 count; + u32 subcount; + u8* base; + u8 dCount[3]; + + if (!__osLogInitialized) { + osCreateMesgQueue(&__osLogDoneMsgQ, &__osLogMsgBuf, 1); + osSetEventMesg(OS_EVENT_RDB_LOG_DONE, &__osLogDoneMsgQ, 0); + __osLogInitialized = 1; + } + + mask = __osDisableInt(); + __osLogOKtoWrite = 0; + base = log->base; + count = log->writeOffset * 4; + __osRestoreInt(mask); + + while (count != 0) { + subcount = (count < 0x8000) ? count : 0x8000; + dCount[0] = (subcount & 0xFF0000) >> 0x10; + dCount[1] = (subcount & 0xFF00) >> 8; + dCount[2] = subcount & 0xFF; + + sent = 0; + while (sent < 3) { + sent += __osRdbSend(dCount + sent, 3 - sent, RDB_TYPE_GtoH_LOG_CT); + } + + sent = 0; + while (sent < subcount) { + sent += __osRdbSend(base + sent, subcount - sent, RDB_TYPE_GtoH_LOG); + } + + count -= subcount; + base += subcount; + osRecvMesg(&__osLogDoneMsgQ, NULL, OS_MESG_BLOCK); + } + mask = __osDisableInt(); + log->writeOffset = 0; + __osLogOKtoWrite = 1; + __osRestoreInt(mask); +} + +void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr) { + int i; + u32 saveEnable; + u32 buf[19]; + u32* bufp; + OSLogItem* hdr; + s32* args; + s32* dest; + int numLongs; + + bufp = buf; + hdr = buf; + args = buf + 3; + numLongs = numArgs + 3; + saveEnable = __osDisableInt(); + + hdr->magic = log->magic; + hdr->timeStamp = osGetCount() - log->startCount; + hdr->argCount = numArgs; + hdr->eventID = code; + + for (i = 0; i < numArgs; i++) { + *args++ = va_arg(argPtr, int); + } + + if (__osLogOKtoWrite) { + if ((log->writeOffset + numLongs) < (log->len >> 2)) { + dest = log->base + log->writeOffset; + for (i = 0; i < numLongs; i++) { + *dest++ = *bufp++; + } + log->writeOffset += numLongs; + } else { + __osLogOKtoWrite = FALSE; + } + } + __osRestoreInt(saveEnable); +} + +#endif diff --git a/lib/ultralib/src/log/logfloat.c b/lib/ultralib/src/log/logfloat.c new file mode 100644 index 0000000..17db739 --- /dev/null +++ b/lib/ultralib/src/log/logfloat.c @@ -0,0 +1,11 @@ +#include "os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "ultralog.h" + +u32 osLogFloat(f32 f) { + return OS_LOG_FLOAT(f); +} + +#endif diff --git a/lib/ultralib/src/mgu/Makefile b/lib/ultralib/src/mgu/Makefile new file mode 100644 index 0000000..52c29f6 --- /dev/null +++ b/lib/ultralib/src/mgu/Makefile @@ -0,0 +1,36 @@ +# +# Makefile for the gu subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + +LCINCS = -I. -I../gu -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include +LASINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/include +LCOPTS = -G 0 -g -O + +CFILES = mtxcatl.c \ + mtxxfml.c \ + mtxxfmf.c \ + rotate.c + +ASFILES = mtxident.s \ + mtxidentf.s \ + mtxf2l.s \ + mtxl2f.s \ + mtxcatf.s \ + scale.s \ + scalef.s \ + normalize.s \ + translate.s \ + translatef.s + +OBJECTS = $(CFILES:.c=.o) $(ASFILES:.s=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) + +.s.o: + cpp $(F_ROM) -DLANG_JAPANESE -E -DMIPSEB -DLANGUAGE_ASSEMBLY -D_MIPS_SIM=1 -D_ULTRA64 -I. -I$(LIBDEPTH)\include $*.s $*.ss2 + as -mips3 -G0 -o $*.o $*.ss2 + del $*.ss? diff --git a/lib/ultralib/src/mgu/asm.h b/lib/ultralib/src/mgu/asm.h new file mode 100644 index 0000000..0c417fa --- /dev/null +++ b/lib/ultralib/src/mgu/asm.h @@ -0,0 +1,49 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __ASM_H__ +#define __ASM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define _MIPS_ISA_MIPS1 1 /* R2/3K */ +#define _MIPS_ISA_MIPS2 2 /* R4K/6K */ +#define _MIPS_ISA_MIPS3 3 /* R4K */ +#define _MIPS_ISA_MIPS4 4 /* TFP */ + +#define _MIPS_SIM_ABI32 1 /* MIPS MSIG calling convention */ +#define _MIPS_SIM_NABI32 2 /* MIPS new 32-bit abi */ + /* NABI32 is 64bit calling convention but 32bit type sizes) */ +#define _MIPS_SIM_ABI64 3 /* MIPS 64 calling convention */ + +#define LEAF(x) \ + .globl x; \ + .ent x,0; \ +x:; \ + .frame sp,0,ra + +#define END(proc) \ + .end proc + + +#ifdef __cplusplus +} +#endif + +#endif /* !__ASM_H__ */ diff --git a/lib/ultralib/src/mgu/mtxcatf.s b/lib/ultralib/src/mgu/mtxcatf.s new file mode 100644 index 0000000..4b96124 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxcatf.s @@ -0,0 +1,103 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:37 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include + +/* + * void guMtxCatF(float mf[4][4], float nf[4][4], float res[4][4]) + * res = mf * nf + */ +#define FRAME_SIZE 64 + .text + .align 5 + .globl guMtxCatF + .ent guMtxCatF, 0 +guMtxCatF: + .set reorder + subu sp, FRAME_SIZE + .frame sp, FRAME_SIZE, ra + + addu v0, a0, 64 + addu v1, a1, 16 + move t2, sp +label_loop_i: + move a3, a1 +label_loop_j: + l.s ft0, 0(a0) /* mf[i][0] * nf[0][j] */ + l.s ft1, 0(a3) + mul.s ft2, ft0, ft1 + l.s ft3, 4(a0) /* + mf[i][1] * nf[1][j] */ + l.s ft4, 16(a3) + mul.s ft5, ft3, ft4 + add.s ft2, ft2, ft5 + l.s ft0, 8(a0) /* + mf[i][2] * nf[2][j] */ + l.s ft1, 32(a3) + mul.s ft5, ft0, ft1 + add.s ft2, ft2, ft5 + l.s ft3, 12(a0) /* + mf[i][3] * nf[3][j] */ + l.s ft4, 48(a3) + mul.s ft5, ft3, ft4 + add.s ft2, ft2, ft5 + + s.s ft2, 0(t2) + addu a3, a3, 4 + addu t2, t2, 4 + bne a3, v1, label_loop_j +/* loop_j_end */ + addu a0, a0, 16 + bne a0, v0, label_loop_i +/* loop_i_end */ + s.s ft2, 60(a2) + lw t0, 0(sp) + lw t1, 4(sp) + lw t2, 8(sp) + lw t3, 12(sp) + lw ta0, 16(sp) + lw ta1, 20(sp) + lw ta2, 24(sp) + lw ta3, 28(sp) + lw t8, 32(sp) + lw t9, 36(sp) + lw v0, 40(sp) + lw v1, 44(sp) + lw a0, 48(sp) + lw a1, 52(sp) + lw a3, 56(sp) + + sw t0, 0(a2) + sw t1, 4(a2) + sw t2, 8(a2) + sw t3, 12(a2) + sw ta0, 16(a2) + sw ta1, 20(a2) + sw ta2, 24(a2) + sw ta3, 28(a2) + sw t8, 32(a2) + sw t9, 36(a2) + sw v0, 40(a2) + sw v1, 44(a2) + sw a0, 48(a2) + sw a1, 52(a2) + sw a3, 56(a2) + + addu sp , FRAME_SIZE + j ra + + .end guMtxCatF + +/* end of file */ diff --git a/lib/ultralib/src/mgu/mtxcatl.c b/lib/ultralib/src/mgu/mtxcatl.c new file mode 100644 index 0000000..6054972 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxcatl.c @@ -0,0 +1,44 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:37 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include "../gu/guint.h" +#include "gu.h" + +void guMtxCatL(Mtx *m, Mtx *n, Mtx *res) +{ + float mf[4][4], nf[4][4], resf[4][4]; + + guMtxL2F(mf, m); + guMtxL2F(nf, n); + + guMtxCatF(mf, nf, resf); + + 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/mtxf2l.s b/lib/ultralib/src/mgu/mtxf2l.s new file mode 100644 index 0000000..43bbe7e --- /dev/null +++ b/lib/ultralib/src/mgu/mtxf2l.s @@ -0,0 +1,80 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include + +/* + * void guMtxF2L(float mf[4][4], Mtx *m) + * + * Input + * float mf[4][4] + * Output + * Mtx *m + */ + +#define HALF_SIZE_MTX 32 +#define MASK_LOW 0x0000FFFF +#define MASK_HIGH 0xFFFF0000 +#define MAGNIFICANT 65536.0 /* = 0x10000 */ + +#define ptr_fl a0 /* argument */ +#define ptr_mtx a1 /* argument */ +#define end_mtx t8 +#define mask_hi t9 +#define magni fv0 + + .text + .align 5 +LEAF( guMtxF2L ) + .set reorder + + li.s magni, MAGNIFICANT + li mask_hi, MASK_HIGH + addu end_mtx, ptr_mtx, HALF_SIZE_MTX +label_loop: + l.s ft0, 0(ptr_fl) /* FTOFIX32( ) */ + mul.s ft1, ft0, magni + trunc.w.s ft2, ft1 + + l.s ft3, 4(ptr_fl) /* FTOFIX32( ) */ + mul.s ft4, ft3, magni + trunc.w.s ft5, ft4 + + mfc1 t0, ft2 /* t0 <- FIXED */ + mfc1 t1, ft5 /* t1 <- FIXED */ + + and t2, t0, mask_hi /* integral part */ + srl t3, t1, 16 + or ta0, t2, t3 + sw ta0, 0(ptr_mtx) + + sll ta1, t0, 16 /* decimal part */ + and ta2, t1, MASK_LOW + or ta3, ta1, ta2 + sw ta3, HALF_SIZE_MTX(ptr_mtx) + + addu ptr_mtx, ptr_mtx, 4 + addu ptr_fl, ptr_fl, 8 + + bne ptr_mtx, end_mtx, label_loop +/* loop-end */ + + j ra + END( guMtxF2L ) + +/* End of file */ diff --git a/lib/ultralib/src/mgu/mtxident.s b/lib/ultralib/src/mgu/mtxident.s new file mode 100644 index 0000000..a9ec491 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxident.s @@ -0,0 +1,60 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guMtxIdent( Mtx * matrix ) + * Substitute unit matrix for matrix + * Correspond only when alignment is 4 byte boundary + * Input + * a0 = matrix + * Output + * *matrix unit matrix + */ + +#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ + .text + .align 5 +LEAF(guMtxIdent) + .set reorder + + addi t0, zero, 1 /* t0 = 0x00000001 */ + sll t1, t0, 16 /* t1 = 0x00010000 */ + + sw t1, 0(a0) /* Substitution of integers */ + sw zero, 4(a0) + sw t0, 8(a0) + sw zero, 12(a0) + sw zero, 16(a0) + sw t1, 20(a0) + sw zero, 24(a0) + sw t0, 28(a0) + + sw zero, 32(a0) /* Substitution of fractions */ + sw zero, 36(a0) + sw zero, 40(a0) + sw zero, 44(a0) + sw zero, 48(a0) + sw zero, 52(a0) + sw zero, 56(a0) + sw zero, 60(a0) + j ra + + END(guMtxIdent) + +/* End of file */ diff --git a/lib/ultralib/src/mgu/mtxidentf.s b/lib/ultralib/src/mgu/mtxidentf.s new file mode 100644 index 0000000..a6aa779 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxidentf.s @@ -0,0 +1,60 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * guMtxIdentF( float matrix[4][4] ) + * substitute unit matrix for floating point matrix + * correspond only when alignment is four byte boundary + * Input + * a0 = matrix + * Output + * *matrix unti matix + */ + .text + .align 5 +LEAF( guMtxIdentF ) + .set reorder + + li t0, 0x3f800000 /* t0 = 1.0 */ + + sw t0, 0(a0) + sw zero, 4(a0) /* line 1 */ + sw zero, 8(a0) + sw zero, 12(a0) + + sw zero, 16(a0) /* line 2 */ + sw t0, 20(a0) + sw zero, 24(a0) + sw zero, 28(a0) + + sw zero, 32(a0) /* line 3 */ + sw zero, 36(a0) + sw t0, 40(a0) + sw zero, 44(a0) + + sw zero, 48(a0) /* line 4 */ + sw zero, 52(a0) + sw zero, 56(a0) + sw t0, 60(a0) + + j ra + + END( guMtxIdentF ) + +/* End of file */ \ No newline at end of file diff --git a/lib/ultralib/src/mgu/mtxl2f.s b/lib/ultralib/src/mgu/mtxl2f.s new file mode 100644 index 0000000..897acfb --- /dev/null +++ b/lib/ultralib/src/mgu/mtxl2f.s @@ -0,0 +1,80 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include + +/* + * void guMtxF2L(float mf[4][4], Mtx *m) + * + * Input + * float mf[4][4] + * Output + * Mtx *m + */ + +#define HALF_SIZE_MTX 32 +#define MASK_LOW 0x0000FFFF +#define MASK_HIGH 0xFFFF0000 +#define MAGNIFICANT 1.5258789062500000e-05 /* ~ 1 / 0x10000 */ + +#define ptr_fl a0 /* argument */ +#define ptr_mtx a1 /* argument */ +#define end_mtx t8 +#define mask_hi t9 +#define magni fv0 + + .text + .align 5 +LEAF( guMtxL2F ) + .set reorder + li.s magni, MAGNIFICANT + li mask_hi, MASK_HIGH + addu end_mtx, ptr_mtx, HALF_SIZE_MTX +label_loop: + lw t0, 0(ptr_mtx) + lw t1, 32(ptr_mtx) + + and t2, t0, mask_hi + srl t3, t1, 16 + or ta0, t2, t3 + + sll ta1, t0, 16 + and ta2, t1, MASK_LOW + or ta3, ta1, ta2 + + mtc1 ta0, ft0 /* FIX32TOF( ) */ + cvt.s.w ft1, ft0 + mul.s ft2, ft1, magni + + mtc1 ta3, ft3 /* FIX32TOF( ) */ + cvt.s.w ft4, ft3 + mul.s ft5, ft4, magni + + s.s ft2, 0(ptr_fl) + s.s ft5, 4(ptr_fl) + + addu ptr_mtx, ptr_mtx, 4 + addu ptr_fl, ptr_fl, 8 + + bne ptr_mtx, end_mtx, label_loop +/* loop-end */ + + j ra + END( guMtxL2F ) + +/* End of file */ diff --git a/lib/ultralib/src/mgu/mtxxfmf.c b/lib/ultralib/src/mgu/mtxxfmf.c new file mode 100644 index 0000000..58c6772 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxxfmf.c @@ -0,0 +1,40 @@ +/* + * 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 "../gu/guint.h" + +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/mgu/mtxxfml.c b/lib/ultralib/src/mgu/mtxxfml.c new file mode 100644 index 0000000..1dfa871 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxxfml.c @@ -0,0 +1,41 @@ +/* + * 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: mtxcatl.c + * Creator: hsa@sgi.com + * Create Date: Thu Nov 2 13:03:02 PST 1995 + * + */ + +#include "../gu/guint.h" + +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); +} diff --git a/lib/ultralib/src/mgu/normalize.s b/lib/ultralib/src/mgu/normalize.s new file mode 100644 index 0000000..58b9093 --- /dev/null +++ b/lib/ultralib/src/mgu/normalize.s @@ -0,0 +1,56 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:39 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guNormalize(float *x, float *y, float *z) + */ + .text + .align 5 +LEAF( guNormalize ) + .set noreorder + + l.s ft0, 0(a0) /* ft0 = x */ + l.s ft1, 0(a1) /* ft1 = y */ + l.s ft2, 0(a2) /* ft2 = z */ + + mul.s ft3, ft0, ft0 /* ft3 = x*x */ + lui t0, 0x3f80 /* t0 = 1.0f */ + mul.s ft4, ft1, ft1 /* ft4 = y*y */ + add.s ft5, ft3, ft4 + mul.s ft4, ft2, ft2 /* ft4 = z*z */ + + add.s ft3, ft4, ft5 /* ft3 = x*x + y*y + z*z */ + mtc1 t0, ft5 + sqrt.s ft4, ft3 /* ft4 = sqrt(x*x + y*y + z*z) */ + + div.s ft3, ft5, ft4 /* ft3 = 1/sqrt(x*x + y*y + z*z) */ + + mul.s ft4, ft0, ft3 /* ft4 = x * 1/sqrt(x*x + y*y + z*z) */ + nop + mul.s ft5, ft1, ft3 /* ft5 = y * 1/sqrt(x*x + y*y + z*z) */ + nop + mul.s ft0, ft2, ft3 /* ft0 = z * 1/sqrt(x*x + y*y + z*z) */ + + s.s ft4, 0(a0) /* x = ft4 */ + s.s ft5, 0(a1) /* y = ft5 */ + j ra + s.s ft0, 0(a2) /* z = ft0 */ /* Use delayed slot */ + + END( guNormalize ) +/* end of file */ diff --git a/lib/ultralib/src/mgu/regdef.h b/lib/ultralib/src/mgu/regdef.h new file mode 100644 index 0000000..ac9c109 --- /dev/null +++ b/lib/ultralib/src/mgu/regdef.h @@ -0,0 +1,187 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __REGDEF_H__ +#define __REGDEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef mips + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define ta0 $12 +#define t5 $13 +#define ta1 $13 +#define t6 $14 +#define ta2 $14 +#define t7 $15 +#define ta3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define a4 $8 +#define ta0 $8 +#define a5 $9 +#define ta1 $9 +#define a6 $10 +#define ta2 $10 +#define a7 $11 +#define ta3 $11 +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define fv0 $f0 +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +#define fa0 $f12 +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +#define ft0 $f4 +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +#define fs0 $f20 +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define fv0 $f0 +#define fv1 $f2 +#define fa0 $f12 +#define fa1 $f13 +#define fa2 $f14 +#define fa3 $f15 +#define fa4 $f16 +#define fa5 $f17 +#define fa6 $f18 +#define fa7 $f19 +#define ft0 $f4 +#define ft1 $f5 +#define ft2 $f6 +#define ft3 $f7 +#define ft4 $f8 +#define ft5 $f9 +#define ft6 $f10 +#define ft7 $f11 +#define ft8 $f20 +#define ft9 $f21 +#define ft10 $f22 +#define ft11 $f23 +#define ft12 $f1 +#define ft13 $f3 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 +#endif + +#define fcr31 $31 + +#endif /* mips */ + +#ifdef __cplusplus +} +#endif + +#endif /* !__REGDEF_H__ */ diff --git a/lib/ultralib/src/mgu/rotate.c b/lib/ultralib/src/mgu/rotate.c new file mode 100644 index 0000000..1c09bd8 --- /dev/null +++ b/lib/ultralib/src/mgu/rotate.c @@ -0,0 +1,73 @@ +/************************************************************************** + * * + * 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 "../gu/guint.h" +#include "gu.h" +#include "os_version.h" + +void guRotateF(float mf[4][4], float a, float x, float y, float z) +{ + static float dtor = 3.1415926 / 180.0; + 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; + sine = sinf(a); + cosine = cosf(a); + t = (1-cosine); + ab = x*y*t; + bc = y*z*t; + ca = z*x*t; + + 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); + mf[2][1] = bc-xxsine; + mf[1][2] = bc+xxsine; + + t = y*y; + mf[1][1] = t+cosine*(1-t); + mf[2][0] = ca+yxsine; + mf[0][2] = ca-yxsine; + + t = z*z; + mf[2][2] = t+cosine*(1-t); + mf[1][0] = ab-zxsine; + mf[0][1] = ab+zxsine; +} + +void guRotate(Mtx *m, float a, float x, float y, float z) +{ + Matrix mf; + + guRotateF(mf, a, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/ultralib/src/mgu/scale.s b/lib/ultralib/src/mgu/scale.s new file mode 100644 index 0000000..01bc290 --- /dev/null +++ b/lib/ultralib/src/mgu/scale.s @@ -0,0 +1,85 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:40 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * FTOFIX32 (float to fix32) + * a: input + * t: output + * ft0 : (float)0x00010000 + * ft1, ft2, ft3, t0 : work reg + */ +#define FTOFIX32(a, t) \ + mtc1 a, ft1 ; \ + mul.s ft2, ft1, ft0 ; \ + trunc.w.s ft3, ft2, t0 ; \ + mfc1 t, ft3 ; + +/* + void guScale(Mtx *m, float x, float y, float z) + m: a0 + x: a1 + y: a2 + z a3 + */ +#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ +#define FLOAT_0x10000 6.5536e+04 /* (float)0x00010000) */ + + .text + .align 5 +LEAF( guScale ) + .set reorder + + li.s ft0, FLOAT_0x10000 /* (float)0x00010000 */ + + FTOFIX32(a1, t1) /* t1 = FTOFIX32(x) */ + srl t2, t1, 16 + sll t0, t2, 16 + sw t0, 0(a0) /* t0 = x integral part */ + sll t2, t1, 16 + sw t2, 32(a0) /* t2 = x decimal part */ + + FTOFIX32(a2, t1) /* t1 = FTOFIX32(y) */ + srl t0, t1, 16 + sw t0, 8(a0) /* t0 = y integral part */ + andi t2, t1, 0xffff + sw t2, 40(a0) /* t2 = y decimal part */ + + FTOFIX32(a3, t1) /* t1 = FTOFIX32(z) */ + srl t2, t1, 16 + sll t0, t2, 16 + sw t0, 20(a0) /* t0 = z integral part */ + sll t2, t1, 16 + sw t2, 52(a0) /* t2 = z decimal part */ + + li t0, 1 /* t0 = 1.0 integral part */ + sw t0, 28(a0) + + sw zero, 4(a0) + sw zero, 12(a0) + sw zero, 16(a0) + sw zero, 24(a0) + sw zero, 36(a0) + sw zero, 44(a0) + sw zero, 48(a0) + sw zero, 56(a0) + sw zero, 60(a0) + j ra + + END( guScale ) +/* end of file */ diff --git a/lib/ultralib/src/mgu/scalef.s b/lib/ultralib/src/mgu/scalef.s new file mode 100644 index 0000000..b27d1e3 --- /dev/null +++ b/lib/ultralib/src/mgu/scalef.s @@ -0,0 +1,57 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:40 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guScaleF(float m[4][4], float x, float y, float z) + * m: a0 + * x: a1 + * y: a2 + * z: a3 + */ + .text + .align 5 +LEAF( guScaleF ) + .set reorder + + sw a1, 0(a0) + sw zero, 4(a0) /* line 1 */ + sw zero, 8(a0) + sw zero, 12(a0) + + sw zero, 16(a0) /* line 2 */ + sw a2, 20(a0) + sw zero, 24(a0) + sw zero, 28(a0) + + sw zero, 32(a0) /* line 3 */ + sw zero, 36(a0) + sw a3, 40(a0) + sw zero, 44(a0) + + li t0, 0x3f800000 /* t0 = 1.0 */ + sw zero, 48(a0) /* line 4 */ + sw zero, 52(a0) + sw zero, 56(a0) + sw t0, 60(a0) + + j ra + + END( guScaleF ) + +/* End of file */ diff --git a/lib/ultralib/src/mgu/translate.s b/lib/ultralib/src/mgu/translate.s new file mode 100644 index 0000000..472fd8c --- /dev/null +++ b/lib/ultralib/src/mgu/translate.s @@ -0,0 +1,101 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:40 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + void guTranslate(Mtx *m, float x, float y, float z) + m: a0 + x: a1 + y: a2 + z a3 + */ + +#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ +#define FLOAT_0x10000 6.5536e+04 /* (float)0x00010000) */ + + .text + .align 5 +LEAF( guTranslate ) + .set reorder + + li.s ft0, FLOAT_0x10000 /* (float)0x00010000 */ + + mtc1 a1, ft1 + mul.s ft2, ft1, ft0 + trunc.w.s ft3, ft2 + mfc1 t1, ft3 /* t1 = FTOFIX32(x) */ + + mtc1 a2, ft1 + mul.s ft2, ft1, ft0 + trunc.w.s ft3, ft2 + mfc1 t3, ft3 /* t3 = FTOFIX32(y) */ + + /* Save t1 and t3 values until fraction process is finished! */ + + srl t2, t1, 16 /* x integeral part for t0 interger */ + sll t0, t2, 16 + srl t2, t3, 16 /* y integral part for t2 fraction */ + or t0, t0, t2 /* Compose in t0 */ + sw t0, 24(a0) + + sll t0,t1,16 /* x fraction part for t0 interger */ + sll t2,t3,16 + srl t2,t2,16 /* y fraction part for t2 fraction */ + or t0,t0,t2 /* Compose in t0 */ + sw t0,24+32(a0) + + + mtc1 a3, ft1 + mul.s ft2, ft1, ft0 + trunc.w.s ft3, ft2 + mfc1 t1, ft3 /* t1 = FTOFIX32(z) */ + + srl t2,t1,16 + sll t0,t2,16 /* z integral part for t0 integer */ + addiu t0,t0,1 /* enter 0x0001 in t0 fraction */ + sw t0,28(a0) + + sll t2,t1,16 /* z fraction part for t2 integer */ + sw t2,28+32(a0) + + sw zero, 0(a0) + sw zero, 4(a0) + sw zero, 8(a0) + sw zero, 12(a0) + sw zero, 16(a0) + sw zero, 20(a0) + sw zero, 0+32(a0) + sw zero, 4+32(a0) + sw zero, 8+32(a0) + sw zero, 12+32(a0) + sw zero, 16+32(a0) + sw zero, 20+32(a0) + + lui t0,0x0001 + ori t0,0x0000 + sw t0,0(a0) + sw t0,20(a0) + + lui t0,0x0000 + ori t0,0x0001 + sw t0,8(a0) + + j ra + + END( guTranslate ) +/* end of file */ diff --git a/lib/ultralib/src/mgu/translatef.s b/lib/ultralib/src/mgu/translatef.s new file mode 100644 index 0000000..47d14bd --- /dev/null +++ b/lib/ultralib/src/mgu/translatef.s @@ -0,0 +1,58 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:41 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guTranslateF(float m[4][4], float x, float y, float z) + * m: a0 + * x: a1 + * y: a2 + * z: a3 + */ + .text + .align 5 +LEAF( guTranslateF ) + .set reorder + + li t0,0x3f800000 /* t0 = 1.0 */ + + sw t0, 0(a0) + sw zero, 4(a0) /* line 1 */ + sw zero, 8(a0) + sw zero, 12(a0) + + sw zero, 16(a0) /* line 2 */ + sw t0, 20(a0) + sw zero, 24(a0) + sw zero, 28(a0) + + sw zero, 32(a0) /* line 3 */ + sw zero, 36(a0) + sw t0, 40(a0) + sw zero, 44(a0) + + sw a1, 48(a0) /* line 4 */ + sw a2, 52(a0) + sw a3, 56(a0) + sw t0, 60(a0) + + j ra + + END( guTranslateF ) + +/* End of file */ diff --git a/lib/ultralib/src/monutil.s b/lib/ultralib/src/monutil.s new file mode 100644 index 0000000..e5974bd --- /dev/null +++ b/lib/ultralib/src/monutil.s @@ -0,0 +1,188 @@ +#ifndef _FINALROM +#include "asm.h" +#include "sgidefs.h" +#include "regdef.h" +#include "sgidefs.h" +#include "PR/R4300.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#define EXC(code) (EXC_##code >> CAUSE_EXCSHIFT) + +.text + +LEAF(__isExpJP); .set noreorder + j __isExp + nop + sw k0, -0x10(sp) + la k0, __isExp + jr k0 + nop +.set reorder +END(__isExpJP) + +LEAF(__isExp); .set noreorder + sw k0, -0x10(sp) + sw k1, -8(sp) + + mfc0 k0, C0_CAUSE + nop + andi k0, k0, CAUSE_EXCMASK + bnez k0, non_stop + + nop + mfc0 k0, C0_CAUSE + nop + andi k0, k0, CAUSE_IP7 + beqz k0, throw_os_exception + nop + j go_monitor + nop +non_stop: + sra k0, k0, CAUSE_EXCSHIFT + li k1, EXC(BREAK) + bne k0, k1, non_bp + nop + j go_monitor + nop + +non_bp: + li k1, EXC(RADE) + bne k0, k1, non_adrs_store_exp + nop + j go_monitor + nop +non_adrs_store_exp: + li k1, EXC(WADE) + bne k0, k1, non_adrs_load_exp + nop + j go_monitor + nop +non_adrs_load_exp: + li k1, EXC(IBE) + bne k0, k1, non_bus_code_exp + nop + j go_monitor + nop +non_bus_code_exp: + li k1, EXC(DBE) + bne k0, k1, non_bus_data_exp + nop + j go_monitor + nop +non_bus_data_exp: + li k1, EXC(MOD) + bne k0, k1, non_tlb_mod + nop + j go_monitor + nop +non_tlb_mod: + li k1, EXC(RMISS) + bne k0, k1, non_tlb_load + nop + j go_monitor + nop +non_tlb_load: + li k1, EXC(WMISS) + bne k0, k1, non_tlb_store + nop + j go_monitor + nop +non_tlb_store: + li k1, EXC(II) + bne k0, k1, non_resv + nop + j go_monitor + nop + +non_resv: + lw k1, -8(sp) + +throw_os_exception: + j ramOldVector + nop + + + + + + + + + +go_monitor: + move k0, sp + addiu sp, sp, -0x200 + sw k0, 0x78(sp) + lw k1, -8(k0) + sw k1, 0x70(sp) + lw k1, -0x10(k0) + sw k1, 0x6c(sp) + nop +w: + lui k0, (0xA4600010 >> 16) + lw k0, (0xA4600010 & 0xFFFF)(k0) /* PI_STATUS_REG */ + nop + andi k0, k0, 3 /* (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY) */ + bnez k0, w + nop + la k0, 0xBFF00050 + jr k0 + nop +.set reorder +END(__isExp) + + +LEAF(MonitorInitBreak); .set noreorder + nop + nop +INIT_BREAK_POSITION: + break 4 + nop + nop + nop + jr ra + nop +.set reorder +END(MonitorInitBreak) + +#endif diff --git a/lib/ultralib/src/os/ackramromread.c b/lib/ultralib/src/os/ackramromread.c new file mode 100644 index 0000000..3de1f6f --- /dev/null +++ b/lib/ultralib/src/os/ackramromread.c @@ -0,0 +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 new file mode 100644 index 0000000..a99e951 --- /dev/null +++ b/lib/ultralib/src/os/ackramromwrite.c @@ -0,0 +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/afterprenmi.c b/lib/ultralib/src/os/afterprenmi.c new file mode 100644 index 0000000..03b5b24 --- /dev/null +++ b/lib/ultralib/src/os/afterprenmi.c @@ -0,0 +1,5 @@ +#include "PR/os_internal.h" + +s32 osAfterPreNMI() { + return __osSpSetPc(0); +} diff --git a/lib/ultralib/src/os/atomic.c b/lib/ultralib/src/os/atomic.c new file mode 100644 index 0000000..a0bd8fe --- /dev/null +++ b/lib/ultralib/src/os/atomic.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" + +int __osAtomicDec(unsigned int* p) { + u32 mask; + int result; + + mask = __osDisableInt(); + if (*p) { + (*p)--; + result = 1; + } else { + result = 0; + } + __osRestoreInt(mask); + return result; +} diff --git a/lib/ultralib/src/os/createmesgqueue.c b/lib/ultralib/src/os/createmesgqueue.c new file mode 100644 index 0000000..5c92f04 --- /dev/null +++ b/lib/ultralib/src/os/createmesgqueue.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +void osCreateMesgQueue(OSMesgQueue* mq, OSMesg* msg, s32 msgCount) { + +#ifdef _DEBUG + if (msgCount <= 0) { + __osError(ERR_OSCREATEMESGQUEUE, 1, msgCount); + return; + } +#endif + + mq->mtqueue = (OSThread*)&__osThreadTail.next; + mq->fullqueue = (OSThread*)&__osThreadTail.next; + mq->validCount = 0; + mq->first = 0; + mq->msgCount = msgCount; + mq->msg = msg; +} diff --git a/lib/ultralib/src/os/createthread.c b/lib/ultralib/src/os/createthread.c new file mode 100644 index 0000000..7c17834 --- /dev/null +++ b/lib/ultralib/src/os/createthread.c @@ -0,0 +1,54 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/ultraerror.h" +#include "osint.h" + +extern __OSThreadprofile_s thprof[]; + +void osCreateThread(OSThread* t, OSId id, void (*entry)(void*), void* arg, void* sp, OSPri p) { + register u32 saveMask; + OSIntMask mask; + +#ifdef _DEBUG + if ((u32)sp & 0x7) { + __osError(ERR_OSCREATETHREAD_SP, 1, sp); + return; + } + + if ((p < OS_PRIORITY_IDLE) || (p > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATETHREAD_PRI, 1, p); + return; + } +#endif + + t->id = id; + t->priority = p; + t->next = NULL; + t->queue = NULL; + t->context.pc = (u32)entry; + t->context.a0 = (s64)(s32)arg; // Double cast gets rid of compiler warning + t->context.sp = (s64)(s32)sp - 16; + t->context.ra = (u64)__osCleanupThread; + mask = OS_IM_ALL; + t->context.sr = (mask & (SR_IMASK | SR_IE)) | SR_EXL; + t->context.rcp = (mask & RCP_IMASK) >> RCP_IMASKSHIFT; + t->context.fpcsr = (u32)(FPCSR_FS | FPCSR_EV); + t->fp = 0; + t->state = OS_STATE_STOPPED; + t->flags = 0; + +#if BUILD_VERSION >= VERSION_K +#ifndef _FINALROM + if (id < THPROF_IDMAX) { + t->thprof = &thprof[id]; + } else { + t->thprof = &thprof[THPROF_IDMAX - 1]; + } +#endif +#endif + + saveMask = __osDisableInt(); + t->tlnext = __osActiveQueue; + __osActiveQueue = t; + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/destroythread.c b/lib/ultralib/src/os/destroythread.c new file mode 100644 index 0000000..c668869 --- /dev/null +++ b/lib/ultralib/src/os/destroythread.c @@ -0,0 +1,49 @@ +#include "PR/os_internal.h" +#include "osint.h" + +void osDestroyThread(OSThread* t) { + register u32 saveMask; + register OSThread* pred; + register OSThread* succ; + + saveMask = __osDisableInt(); + + if (t == NULL) { + t = __osRunningThread; + } else if (t->state != OS_STATE_STOPPED) { + __osDequeueThread(t->queue, t); + } + + if (__osActiveQueue == t) { + __osActiveQueue = __osActiveQueue->tlnext; + } else { +#if BUILD_VERSION >= VERSION_J || !defined(__GNUC__) + pred = __osActiveQueue; + while (pred->priority != -1) { + succ = pred->tlnext; + if (succ == t) { + pred->tlnext = t->tlnext; + break; + } + 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) { + __osDispatchThread(); + } + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/exceptasm.h b/lib/ultralib/src/os/exceptasm.h new file mode 100644 index 0000000..0e7845d --- /dev/null +++ b/lib/ultralib/src/os/exceptasm.h @@ -0,0 +1,29 @@ +#ifndef _EXCEPTASM_H +#define _EXCEPTASM_H + +#include "PR/os_version.h" + +#define MESG(type) (type << 3) + +#define MQ_MTQUEUE 0 +#define MQ_FULLQUEUE 4 +#define MQ_VALIDCOUNT 8 +#define MQ_FIRST 12 +#define MQ_MSGCOUNT 16 +#define MQ_MSG 20 + +#define OS_EVENTSTATE_MESSAGE_QUEUE 0 +#define OS_EVENTSTATE_MESSAGE 4 + +/* __osHwInt struct member offsets */ +#define HWINTR_CALLBACK 0x00 +#define HWINTR_SP 0x04 + +/* __osHwInt struct size */ +#if BUILD_VERSION >= VERSION_I_P +#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 new file mode 100644 index 0000000..7f51554 --- /dev/null +++ b/lib/ultralib/src/os/exceptasm.s @@ -0,0 +1,1069 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/os.h" +#include "PR/rcp.h" +#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 + +.rdata + +#define REDISPATCH 0x00 +#define SW1 0x04 +#define SW2 0x08 +#define RCP 0x0c +#define CART 0x10 +#define PRENMI 0x14 +#define IP6_HDLR 0x18 +#define IP7_HDLR 0x1c +#define COUNTER 0x20 + +__osIntOffTable: + .byte REDISPATCH + .byte PRENMI + .byte IP6_HDLR + .byte IP6_HDLR + .byte IP7_HDLR + .byte IP7_HDLR + .byte IP7_HDLR + .byte IP7_HDLR + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte REDISPATCH + .byte SW1 + .byte SW2 + .byte SW2 + .byte RCP + .byte RCP + .byte RCP + .byte RCP + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + +__osIntTable: + .word redispatch, sw1, sw2, rcp, cart, prenmi, IP6_Hdlr, IP7_Hdlr, counter + +#ifndef _FINALROM +EXPORT(__osCauseTable_pt) + .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 + .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 +#endif + +.data + +#if BUILD_VERSION >= VERSION_I_P +EXPORT(__osHwIntTable) + .word 0, 0 + .word 0, 0 + .word 0, 0 + .word 0, 0 + .word 0, 0 + +EXPORT(__osPiIntTable) + .word 0, 0 +#else +EXPORT(__osHwIntTable) + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 +#endif + +#ifndef _FINALROM +__osRdb_DbgRead_Ct: + .word 0 + +__osRdb_Mesg: + .word 0 + +__os_Kdebug_Pkt: + .word 0 + +#if BUILD_VERSION >= VERSION_K +__osPreviousThread: + .word 0 +#endif +#endif + +.text + +LEAF(__osExceptionPreamble) + la k0, __osException + jr k0 +END(__osExceptionPreamble) + +#ifndef _FINALROM +LEAF(__ptExceptionPreamble) +.set noreorder + sw k0, -0x10(sp) + b pt_next + lui k0, %hi(__ptException) + nop + nop +pt_next: + addiu k0, k0, %lo(__ptException) + jr k0 + nop +.set reorder +END(__ptExceptionPreamble) + +LEAF(__ptException) +.set noreorder + mfc0 k0, C0_CAUSE + andi k0, k0, 0x7c + bnez k0, pt_not_Int + srl k0, k0, 2 + mfc0 k0, C0_CAUSE + nop + andi k0, k0, CAUSE_IP7 + beqz k0, __osException + nop + j pt_break + nop +pt_not_Int: + sw k1, -8(sp) + /* determine if the pt exception handler should deal with this cause */ + la k1, __osCauseTable_pt + add k1, k1, k0 + lbu k0, (k1) + beqz k0, __osException + nop +pt_break: +pi_ok_loop: + lw k0, PHYS_TO_K1(PI_STATUS_REG) + nop + andi k0, k0, (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY) + bnez k0, pi_ok_loop + nop + lw k0, KMC_STAT + nop + andi k0, k0, 8 + bnez k0, pt_prof + li k0, KMC_CODE_ENTRY + lw k1, -8(sp) + jr k0 + addiu sp, sp, -0x60 +pt_prof: + mfc0 k0, C0_EPC + /* the following two ways is a (necessarily) messy way to write "sw k0, KMC_WPORT" without using at */ + lui k1, (KMC_WPORT >> 16 + 1) + sw k0, -(KMC_WPORT & 0xFFFF)(k1) + lw k1, -8(sp) + lw k0, -0x10(sp) + eret + nop +.set reorder +END(__ptException) +#endif + +LEAF(__osException) + la k0, __osThreadSave + /* save AT */ +.set noat + sd $1, THREAD_GP1(k0); +.set at + /* save sr */ +STAY2(mfc0 k1, C0_SR) + sw k1, THREAD_SR(k0) + /* clear interrupts */ + and k1, k1, -4 +STAY2(mtc0 k1, C0_SR) + /* save other regs */ + sd $8, THREAD_GP8(k0) + sd $9, THREAD_GP9(k0) + sd $10, THREAD_GP10(k0) + /* say fp has not been used */ + sw zero, THREAD_FP(k0) + /* this instruction is useless, leftover because of bad placement of an ifdef for the debug version */ +STAY2(mfc0 t0, C0_CAUSE) +#ifndef _FINALROM + lw t2, __kmc_pt_mode + bnez t2, skip_kmc_mode + andi t1, t0, 0x7c + li t2, 0 + bne t1, t2, savecontext + and t1, k1, t0 + andi t2, t1, CAUSE_IP7 + beqz t2, notIP7 + /* clear rdb write interrupt */ + la t1, RDB_WRITE_INTR_REG + sw zero, (t1) +IP7check: +STAY2(mfc0 t0, C0_CAUSE) + andi t0, t0, CAUSE_IP7 + bne zero, t0, IP7check + la t2, RDB_BASE_REG + lw t0, (t2) + srl t1, t0, 0x1a + andi t1, t1, 0x3f + li t2, RDB_TYPE_HtoG_DATA + beq t1, t2, HandData + li t2, RDB_TYPE_HtoG_DEBUG + beq t1, t2, HandDbg + li t2, RDB_TYPE_HtoG_KDEBUG + beq t1, t2, HandKDebug + li t2, RDB_TYPE_HtoG_DEBUG_CT + beq t1, t2, DbgCnt + li t2, RDB_TYPE_HtoG_DATA_DONE + beq t1, t2, DataRead + li t2, RDB_TYPE_HtoG_LOG_DONE + beq t1, t2, LogRead + li t2, RDB_TYPE_HtoG_REQ_RAMROM + beq t1, t2, ReqRamrom + li t2, RDB_TYPE_HtoG_FREE_RAMROM + beq t1, t2, FreeRamrom + li t2, RDB_TYPE_HtoG_PROF_SIGNAL + beq t1, t2, SignalProf + b rdbout +SignalProf: + li t2, 1 + srl t1, t0, 0x10 + andi t1, t1, 0xff + beq t1, t2, AckProf + li t2, 0xa8 + sw t2, __osRdb_Mesg + b savecontext +AckProf: + li t2, 0xb0 + sw t2, __osRdb_Mesg + b savecontext +HandKDebug: + sw t0, __os_Kdebug_Pkt + b savecontext +DbgCnt: + li t2, 0xffffff + and t1, t0, t2 + sw t1, __osRdb_DbgRead_Ct + b rdbout +DataRead: + li t2, 0x88 + sw t2, __osRdb_Mesg + b savecontext +LogRead: + li t2, 0x80 + sw t2, __osRdb_Mesg + b savecontext +ReqRamrom: + li t2, 0x90 + sw t2, __osRdb_Mesg + b savecontext +FreeRamrom: + li t2, 0x98 + sw t2, __osRdb_Mesg + b savecontext +HandData: + srl t1, t0, 0x18 + andi t1, t1, 3 + beq zero, t1, rdbout + lw t2, __osRdb_Read_Data_Ct + subu t2, t2, t1 + sw t2, __osRdb_Read_Data_Ct + sd t3, THREAD_GP11(k0) + lw t3, __osRdb_Read_Data_Buf + srl t2, t0, 0x10 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneData + srl t2, t0, 8 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneData + andi t0, t0, 0xff + sb t0, (t3) + addi t3, t3, 1 +doneData: + sw t3, __osRdb_Read_Data_Buf + ld t3, THREAD_GP11(k0) + lw t2, __osRdb_Read_Data_Ct + bne zero, t2, rdbout + li t2, 0x78 + sw t2, __osRdb_Mesg + b savecontext +HandDbg: + srl t1, t0, 0x18 + andi t1, t1, 3 + beq zero, t1, rdbout + lw t2, __osRdb_DbgRead_Ct + subu t2, t2, t1 + sw t2, __osRdb_DbgRead_Ct + sd t3, THREAD_GP11(k0) + lw t3, __osRdb_DbgRead_Buf + bne zero, t3, 1f + ld t3, THREAD_GP11(k0) + b rdbout +1: + srl t2, t0, 0x10 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneDbg + srl t2, t0, 8 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneDbg + andi t0, t0, 0xff + sb t0, (t3) + addi t3, t3, 1 +doneDbg: + sw t3, __osRdb_DbgRead_Buf + ld t3, THREAD_GP11(k0) + lw t2, __osRdb_DbgRead_Ct + bne zero, t2, rdbout + li t2, 0xa0 + sw t2, __osRdb_Mesg + b savecontext +notIP7: + andi t2, t1, CAUSE_IP6 + beqz t2, savecontext + /* clear rdb read interrupt */ + la t1, RDB_READ_INTR_REG + sw zero, (t1) + lw t2, __osRdb_IP6_Ct + bnez t2, 2f + li t2, 1 + sw t2, __osRdb_IP6_Empty + b rdbout +2: + addi t2, t2, -1 + sw t2, __osRdb_IP6_Ct + lw t0, __osRdb_IP6_Data + lw t1, __osRdb_IP6_CurSend + sll t2, t1, 2 + add t0, t2, t0 + lw t2, (t0) + addi t1, t1, 1 + lw t0, __osRdb_IP6_Size + sub t0, t0, t1 + bgtz t0, 5f + li t1, 0 +5: + sw t1, __osRdb_IP6_CurSend +checkIP6: +STAY2(mfc0 t0, C0_CAUSE) + andi t0, t0, CAUSE_IP6 + bne zero, t0, checkIP6 + la t0, RDB_BASE_REG + sw t2, (t0) +rdbout: + ld t0, THREAD_GP8(k0) + ld t1, THREAD_GP9(k0) + ld t2, THREAD_GP10(k0) +.set noat + ld $1, THREAD_GP1(k0) +.set at + lw k1, THREAD_SR(k0) +STAY2(mtc0 k1, C0_SR) +.set noreorder + nop + nop + nop + nop + eret +.set reorder + +skip_kmc_mode: +#endif + +savecontext: + move t0, k0 + lw k0, __osRunningThread +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + sw k0, __osPreviousThread +#endif + ld t1, THREAD_GP1(t0) + sd t1, THREAD_GP1(k0) + ld t1, THREAD_SR(t0) + sd t1, THREAD_SR(k0) + ld t1, THREAD_GP8(t0) + sd t1, THREAD_GP8(k0) + ld t1, THREAD_GP9(t0) + sd t1, THREAD_GP9(k0) + ld t1, THREAD_GP10(t0) + sd t1, THREAD_GP10(k0) +3: + sd $2, THREAD_GP2(k0) + sd $3, THREAD_GP3(k0) + sd $4, THREAD_GP4(k0) + sd $5, THREAD_GP5(k0) + sd $6, THREAD_GP6(k0) + sd $7, THREAD_GP7(k0) + sd $11, THREAD_GP11(k0) + sd $12, THREAD_GP12(k0) + sd $13, THREAD_GP13(k0) + sd $14, THREAD_GP14(k0) + sd $15, THREAD_GP15(k0) + sd $16, THREAD_GP16(k0) + sd $17, THREAD_GP17(k0) + sd $18, THREAD_GP18(k0) + sd $19, THREAD_GP19(k0) + sd $20, THREAD_GP20(k0) + sd $21, THREAD_GP21(k0) + sd $22, THREAD_GP22(k0) + sd $23, THREAD_GP23(k0) + sd $24, THREAD_GP24(k0) + sd $25, THREAD_GP25(k0) + sd $28, THREAD_GP28(k0) + sd $29, THREAD_GP29(k0) + sd $30, THREAD_GP30(k0) + sd $31, THREAD_GP31(k0) + + mflo t0 + sd t0, THREAD_LO(k0) + mfhi t0 + sd t0, THREAD_HI(k0) + + lw k1, THREAD_SR(k0) + andi t1, k1, SR_IMASK + beqz t1, savercp + +/*if any interrupts are enabled*/ + la t0, __OSGlobalIntMask + lw t0, 0(t0) + xor t2, t0, ~0 /* not except not using not */ + andi t2, t2, SR_IMASK + or ta0, t1, t2 + and t3, k1, ~SR_IMASK + or t3, t3, ta0 + sw t3, THREAD_SR(k0) + andi t0, t0, SR_IMASK + and t1, t1, t0 + and k1, k1, ~SR_IMASK + or k1, k1, t1 +savercp: + + lw t1, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz t1, endrcp + + la t0, __OSGlobalIntMask + lw t0, 0(t0) + + srl t0, t0, 0x10 + xor t0, t0, ~0 + andi t0, t0, 0x3f + lw ta0, THREAD_RCP(k0) + and t0, t0, ta0 + or t1, t1, t0 +endrcp: + sw t1, THREAD_RCP(k0) +STAY2(mfc0 t0, C0_EPC) + sw t0, THREAD_PC(k0) + lw t0, THREAD_FP(k0) + beqz t0, 1f +STAY2(cfc1 t0, fcr31) + NOP + sw t0, THREAD_FPCSR(k0) + sdc1 $f0, THREAD_FP0(k0) + sdc1 $f2, THREAD_FP2(k0) + sdc1 $f4, THREAD_FP4(k0) + sdc1 $f6, THREAD_FP6(k0) + sdc1 $f8, THREAD_FP8(k0) + sdc1 $f10, THREAD_FP10(k0) + sdc1 $f12, THREAD_FP12(k0) + sdc1 $f14, THREAD_FP14(k0) + sdc1 $f16, THREAD_FP16(k0) + sdc1 $f18, THREAD_FP18(k0) + sdc1 $f20, THREAD_FP20(k0) + sdc1 $f22, THREAD_FP22(k0) + sdc1 $f24, THREAD_FP24(k0) + sdc1 $f26, THREAD_FP26(k0) + sdc1 $f28, THREAD_FP28(k0) + sdc1 $f30, THREAD_FP30(k0) +1: +STAY2(mfc0 t0, C0_CAUSE) + sw t0, THREAD_CAUSE(k0) + +.set noreorder + li t1, OS_STATE_RUNNABLE + sh t1, THREAD_STATE(k0) +.set reorder + +#ifndef _FINALROM + lw a0, __os_Kdebug_Pkt + beqz a0, no_kdebug + sw zero, __os_Kdebug_Pkt + jal kdebugserver + b __osDispatchThreadSave +no_kdebug: + lw a0, __osRdb_Mesg + beqz a0, no_rdb_mesg + sw zero, __osRdb_Mesg + jal send_mesg + lw t0, 0x120(k0) +no_rdb_mesg: +#endif + + andi t1, t0, CAUSE_EXCMASK + li t2, EXC_BREAK + beq t1, t2, handle_break + + li t2, EXC_CPU + beq t1, t2, handle_CpU + + li t2, EXC_INT + bne t1, t2, panic +handle_interrupt: + and s0, k1, t0 +next_interrupt: + andi t1, s0, SR_IMASK + srl t2, t1, 0xc + bnez t2, 1f + + srl t2, t1, SR_IMASKSHIFT + addi t2, t2, 16 +1: + + lbu t2, __osIntOffTable(t2) + + lw t2, __osIntTable(t2) + jr t2 + +IP6_Hdlr: + and s0, s0, ~CAUSE_IP6 + b next_interrupt + +IP7_Hdlr: + and s0, s0, ~CAUSE_IP7 + b next_interrupt + +counter: +STAY2(mfc0 t1, C0_COMPARE) +STAY2(mtc0 t1, C0_COMPARE) + li a0, MESG(OS_EVENT_COUNTER) + jal send_mesg + and s0, s0, ~CAUSE_IP8 + b next_interrupt + +cart: +#if BUILD_VERSION >= VERSION_I_P + and s0, s0, ~CAUSE_IP4 + la t1, __osHwIntTable + add t1, HWINTR_SIZE + lw t2, HWINTR_CALLBACK(t1) + + beqz t2, 1f + + lw sp, HWINTR_SP(t1) + jalr t2 + + beqz v0, 1f + b redispatch + +1: + 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) + la t0, __OSGlobalIntMask + lw t0, (t0) + + srl t0, t0, 0x10 + and s1, s1, t0 + andi t1, s1, MI_INTR_SP + beqz t1, vi + + andi s1, s1, 0x3e + lw ta0, PHYS_TO_K1(SP_STATUS_REG) + li t1, (SP_CLR_INTR | SP_CLR_SIG3) + + sw t1, PHYS_TO_K1(SP_STATUS_REG) + andi ta0, ta0, 0x300 + beqz ta0, sp_other_break + + li a0, MESG(OS_EVENT_SP) + jal send_mesg + + beqz s1, NoMoreRcpInts + + b vi + +sp_other_break: + li a0, MESG(OS_EVENT_SP_BREAK) + jal send_mesg + + beqz s1, NoMoreRcpInts + +vi: + andi t1, s1, 0x8 + beqz t1, ai + + andi s1, s1, 0x37 + + sw zero, PHYS_TO_K1(VI_CURRENT_REG) + li a0, MESG(OS_EVENT_VI) + jal send_mesg + beqz s1, NoMoreRcpInts + +ai: + andi t1, s1, 0x4 + beqz t1, si + + andi s1, s1, 0x3b + + li t1, 1 + sw t1, PHYS_TO_K1(AI_STATUS_REG) + + li a0, MESG(OS_EVENT_AI) + jal send_mesg + beqz s1, NoMoreRcpInts + +si: + andi t1, s1, 0x2 + beqz t1, pi + + andi s1, s1, 0x3d + /* any write clears interrupts */ + sw zero, PHYS_TO_K1(SI_STATUS_REG) + li a0, MESG(OS_EVENT_SI) + jal send_mesg + beqz s1, NoMoreRcpInts + +pi: + andi t1, s1, 0x10 + beqz t1, dp + + andi s1, s1, 0x2f + + 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 + + lw sp, 4(t1) + move a0, v0 + jalr t2 + + 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: + andi t1, s1, 0x20 + beqz t1, NoMoreRcpInts + + andi s1, s1, 0x1f + + li t1, MI_CLR_DP_INTR + sw t1, PHYS_TO_K1(MI_INIT_MODE_REG) + + li a0, MESG(OS_EVENT_DP) + jal send_mesg + +NoMoreRcpInts: + and s0, s0, ~CAUSE_IP3 + b next_interrupt + +prenmi: + lw k1, THREAD_SR(k0) + + and k1, k1, ~CAUSE_IP5 + sw k1, THREAD_SR(k0) + la t1, __osShutdown + lw t2, 0(t1) + beqz t2, firstnmi + + and s0, s0, ~CAUSE_IP5 + b redispatch + +firstnmi: + li t2, 1 + sw t2, 0(t1) /* __osShutdown */ + li a0, MESG(OS_EVENT_PRENMI) + jal send_mesg + + and s0, s0, ~CAUSE_IP5 + lw t2, __osRunQueue + lw k1, THREAD_SR(t2) + and k1, k1, ~CAUSE_IP5 + sw k1, THREAD_SR(t2) + b redispatch + +sw2: + and t0, t0, ~CAUSE_SW2 +STAY2(mtc0 t0, C0_CAUSE) + + li a0, MESG(OS_EVENT_SW2) + jal send_mesg + + and s0, s0, ~CAUSE_SW2 + b next_interrupt + +sw1: + and t0, t0, ~CAUSE_SW1 +STAY2(mtc0 t0, C0_CAUSE) + + li a0, MESG(OS_EVENT_SW1) + jal send_mesg + + and s0, s0, ~CAUSE_SW1 + b next_interrupt + +handle_break: + li t1, OS_FLAG_CPU_BREAK + sh t1, THREAD_FLAGS(k0) + li a0, MESG(OS_EVENT_CPU_BREAK) + jal send_mesg + b redispatch + +redispatch: + lw t1, THREAD_PRI(k0) + lw t2, __osRunQueue + lw t3, THREAD_PRI(t2) + + bge t1, t3, enqueueRunning + + move a1, k0 + la a0, __osRunQueue + + jal __osEnqueueThread + + j __osDispatchThread + +enqueueRunning: + la t1, __osRunQueue + lw t2, MQ_MTQUEUE(t1) + sw t2, THREAD_NEXT(k0) + sw k0, MQ_MTQUEUE(t1) + j __osDispatchThread +panic: + sw k0, __osFaultedThread + li t1, OS_STATE_STOPPED + sh t1, THREAD_STATE(k0) + li t1, OS_FLAG_FAULT + sh t1, THREAD_FLAGS(k0) + +STAY2(mfc0 t2, C0_BADVADDR) + + sw t2, THREAD_BADVADDR(k0) + + li a0, MESG(OS_EVENT_FAULT) + jal send_mesg + j __osDispatchThread +END(__osException) + +LEAF(send_mesg) + move s2, ra + la t2, __osEventStateTab + addu t2, t2, a0 + lw t1, OS_EVENTSTATE_MESSAGE_QUEUE(t2) + beqz t1, send_done + + lw t3, MQ_VALIDCOUNT(t1) + lw ta0, MQ_MSGCOUNT(t1) + + bge t3, ta0, send_done + + lw ta1, MQ_FIRST(t1) + addu ta1, ta1, t3 + + rem ta1, ta1, ta0 + lw ta0, MQ_MSG(t1) + mul ta1, ta1, 4 + addu ta0, ta0, ta1 + lw ta1, OS_EVENTSTATE_MESSAGE(t2) + sw ta1, 0(ta0) /* msg[ta1] = */ + addiu t2, t3, 1 + sw t2, MQ_VALIDCOUNT(t1) + lw t2, MQ_MTQUEUE(t1) + lw t3, THREAD_NEXT(t2) + beqz t3, send_done + + move a0, t1 + jal __osPopThread + + move t2, v0 + + move a1, t2 + la a0, __osRunQueue + jal __osEnqueueThread +send_done: + jr s2 +END(send_mesg) + +LEAF(handle_CpU) /* coprocessor error */ + and t1, t0, CAUSE_CEMASK + srl t1, t1, CAUSE_CESHIFT + li t2, 1 /* cp1 error */ + bne t1, t2, panic + + /* enable cp1 (fpu) for this thread */ + li t1, 1 + sw t1, THREAD_FP(k0) + lw k1, THREAD_SR(k0) + or k1, k1, SR_CU1 + sw k1, THREAD_SR(k0) + b enqueueRunning +END(handle_CpU) + +LEAF(__osEnqueueAndYield) + lw a1, __osRunningThread +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + sw a1, __osPreviousThread +#endif +STAY2(mfc0 t0, C0_SR) + ori t0, t0, SR_EXL + sw t0, THREAD_SR(a1) + sd s0, THREAD_GP16(a1) + sd s1, THREAD_GP17(a1) + sd s2, THREAD_GP18(a1) + sd s3, THREAD_GP19(a1) + sd s4, THREAD_GP20(a1) + sd s5, THREAD_GP21(a1) + sd s6, THREAD_GP22(a1) + sd s7, THREAD_GP23(a1) + sd gp, THREAD_GP28(a1) + sd sp, THREAD_GP29(a1) + sd s8, THREAD_GP30(a1) + sd ra, THREAD_GP31(a1) + sw ra, THREAD_PC(a1) + lw k1, THREAD_FP(a1) + beqz k1, 1f + cfc1 k1, fcr31 + sw k1, THREAD_FPCSR(a1) + sdc1 $f20, THREAD_FP20(a1) + sdc1 $f22, THREAD_FP22(a1) + sdc1 $f24, THREAD_FP24(a1) + sdc1 $f26, THREAD_FP26(a1) + sdc1 $f28, THREAD_FP28(a1) + sdc1 $f30, THREAD_FP30(a1) +1: + lw k1, THREAD_SR(a1) + andi t1, k1, SR_IMASK + beqz t1, 2f + + la t0, __OSGlobalIntMask + lw t0, 0(t0) + xor t0, t0, ~0 + andi t0, t0, SR_IMASK + or t1, t1, t0 + and k1, k1, ~SR_IMASK + or k1, k1, t1 + sw k1, THREAD_SR(a1) +2: + lw k1, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz k1, 3f + + la k0, __OSGlobalIntMask + lw k0, 0(k0) + + srl k0, k0, 0x10 + xor k0, k0, ~0 + andi k0, k0, 0x3f + lw t0, THREAD_RCP(a1) + and k0, k0, t0 + or k1, k1, k0 +3: + sw k1, THREAD_RCP(a1) + beqz a0, noEnqueue + jal __osEnqueueThread +noEnqueue: + j __osDispatchThread +END(__osEnqueueAndYield) + +/*__osEnqueueThread(OSThread **, OSThread *)*/ +LEAF(__osEnqueueThread) + move t9, a0 + lw t8, 0(a0) + lw ta3, THREAD_PRI(a1) + lw ta2, THREAD_PRI(t8) + blt ta2, ta3, 2f +1: + move t9, t8 + lw t8, THREAD_NEXT(t8) + lw ta2, THREAD_PRI(t8) + bge ta2, ta3, 1b +2: + lw t8, THREAD_NEXT(t9) + sw t8, THREAD_NEXT(a1) + sw a1, THREAD_NEXT(t9) + sw a0, THREAD_QUEUE(a1) + jr ra +END(__osEnqueueThread) + +LEAF(__osPopThread) + lw v0, 0(a0) /* a0 is OSThread** */ + lw t9, THREAD_NEXT(v0) + 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 + sw v0, __osRunningThread + li t0, OS_STATE_RUNNING + sh t0, THREAD_STATE(v0) + move k0, v0 + +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + la t0, __osThprofFunc + lw t0, (t0) + beqz t0, __osDispatchThreadSave +1: + lw a0, __osPreviousThread + lw sp, __osThprofStack + 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 + lw t0, 0(t0) + andi t0, t0, SR_IMASK + andi t1, k1, SR_IMASK + and t1, t1, t0 + and k1, k1, ~SR_IMASK + or k1, k1, t1 +STAY2(mtc0 k1, C0_SR) +.set noat + ld $1, THREAD_GP1(k0) +.set at + ld $2, THREAD_GP2(k0) + ld $3, THREAD_GP3(k0) + ld $4, THREAD_GP4(k0) + ld $5, THREAD_GP5(k0) + ld $6, THREAD_GP6(k0) + ld $7, THREAD_GP7(k0) + ld $8, THREAD_GP8(k0) + ld $9, THREAD_GP9(k0) + ld $10, THREAD_GP10(k0) + ld $11, THREAD_GP11(k0) + ld $12, THREAD_GP12(k0) + ld $13, THREAD_GP13(k0) + ld $14, THREAD_GP14(k0) + ld $15, THREAD_GP15(k0) + ld $16, THREAD_GP16(k0) + ld $17, THREAD_GP17(k0) + ld $18, THREAD_GP18(k0) + ld $19, THREAD_GP19(k0) + ld $20, THREAD_GP20(k0) + ld $21, THREAD_GP21(k0) + ld $22, THREAD_GP22(k0) + ld $23, THREAD_GP23(k0) + ld $24, THREAD_GP24(k0) + ld $25, THREAD_GP25(k0) + ld $28, THREAD_GP28(k0) + ld $29, THREAD_GP29(k0) + ld $30, THREAD_GP30(k0) + ld $31, THREAD_GP31(k0) + ld k1, THREAD_LO(k0) + mtlo k1 + ld k1, THREAD_HI(k0) + mthi k1 + lw k1, THREAD_PC(k0) +STAY2(mtc0 k1, C0_EPC) + lw k1, THREAD_FP(k0) + beqz k1, 1f + + lw k1, THREAD_FPCSR(k0) +STAY2(ctc1 k1, fcr31) + ldc1 $f0, THREAD_FP0(k0) + ldc1 $f2, THREAD_FP2(k0) + ldc1 $f4, THREAD_FP4(k0) + ldc1 $f6, THREAD_FP6(k0) + ldc1 $f8, THREAD_FP8(k0) + ldc1 $f10, THREAD_FP10(k0) + ldc1 $f12, THREAD_FP12(k0) + ldc1 $f14, THREAD_FP14(k0) + ldc1 $f16, THREAD_FP16(k0) + ldc1 $f18, THREAD_FP18(k0) + ldc1 $f20, THREAD_FP20(k0) + ldc1 $f22, THREAD_FP22(k0) + ldc1 $f24, THREAD_FP24(k0) + ldc1 $f26, THREAD_FP26(k0) + ldc1 $f28, THREAD_FP28(k0) + ldc1 $f30, THREAD_FP30(k0) + +1: +.set noreorder + lw k1, THREAD_RCP(k0) + la k0, __OSGlobalIntMask + lw k0, 0(k0) + srl k0, k0, 0x10 + and k1, k1, k0 + sll k1, k1, 0x1 + la k0, __osRcpImTable + addu k1, k1, k0 + lhu k1, 0(k1) + la k0, PHYS_TO_K1(MI_INTR_MASK_REG) + sw k1, 0(k0) + + nop + nop + nop + nop + eret +.set reorder +END(__osDispatchThread) + +LEAF(__osCleanupThread) + move a0, zero +#if !defined(BBPLAYER) && !defined(__sgi) + nop +#endif + jal osDestroyThread +END(__osCleanupThread) diff --git a/lib/ultralib/src/os/exit.c b/lib/ultralib/src/os/exit.c new file mode 100644 index 0000000..24a873f --- /dev/null +++ b/lib/ultralib/src/os/exit.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" + +void osExit() { + __osGIOInterrupt(16); + + for (;;) { + ; + } +} diff --git a/src/libultra/os/getactivequeue.c b/lib/ultralib/src/os/getactivequeue.c similarity index 67% rename from src/libultra/os/getactivequeue.c rename to lib/ultralib/src/os/getactivequeue.c index 4175e7d..1fefc88 100644 --- a/src/libultra/os/getactivequeue.c +++ b/lib/ultralib/src/os/getactivequeue.c @@ -1,6 +1,6 @@ #include "PR/os_internal.h" #include "osint.h" -OSThread *__osGetActiveQueue(void) { +OSThread* __osGetActiveQueue(void) { return __osActiveQueue; } diff --git a/lib/ultralib/src/os/getcause.s b/lib/ultralib/src/os/getcause.s new file mode 100644 index 0000000..873464f --- /dev/null +++ b/lib/ultralib/src/os/getcause.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetCause) + STAY2(mfc0 v0, C0_CAUSE) + jr ra +END(__osGetCause) diff --git a/lib/ultralib/src/os/getcompare.s b/lib/ultralib/src/os/getcompare.s new file mode 100644 index 0000000..99c1758 --- /dev/null +++ b/lib/ultralib/src/os/getcompare.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetCompare) + STAY2(mfc0 v0, C0_COMPARE) + jr ra +END(__osGetCompare) diff --git a/lib/ultralib/src/os/getconfig.s b/lib/ultralib/src/os/getconfig.s new file mode 100644 index 0000000..8165178 --- /dev/null +++ b/lib/ultralib/src/os/getconfig.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetConfig) + STAY2(mfc0 v0, C0_CONFIG) + jr ra +END(__osGetConfig) diff --git a/lib/ultralib/src/os/getcount.s b/lib/ultralib/src/os/getcount.s new file mode 100644 index 0000000..28d5a79 --- /dev/null +++ b/lib/ultralib/src/os/getcount.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osGetCount) + STAY2(mfc0 v0, C0_COUNT) + jr ra +END(osGetCount) diff --git a/lib/ultralib/src/os/getcurrfaultthread.c b/lib/ultralib/src/os/getcurrfaultthread.c new file mode 100644 index 0000000..d7668c2 --- /dev/null +++ b/lib/ultralib/src/os/getcurrfaultthread.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSThread* __osGetCurrFaultedThread() { + return __osFaultedThread; +} diff --git a/lib/ultralib/src/os/getfpccsr.s b/lib/ultralib/src/os/getfpccsr.s new file mode 100644 index 0000000..56837a5 --- /dev/null +++ b/lib/ultralib/src/os/getfpccsr.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetFpcCsr) + STAY2(cfc1 v0, fcr31) + jr ra +END(__osGetSR) # @bug: Should be __osGetFpcCsr diff --git a/lib/ultralib/src/os/gethwinterrupt.c b/lib/ultralib/src/os/gethwinterrupt.c new file mode 100644 index 0000000..c2c8b21 --- /dev/null +++ b/lib/ultralib/src/os/gethwinterrupt.c @@ -0,0 +1,21 @@ +#include "PR/os_internal.h" + +struct __osHwInt { + s32 (*handler)(void); +#if BUILD_VERSION >= VERSION_J + void* stackEnd; +#endif +}; + +extern struct __osHwInt __osHwIntTable[]; + +#if BUILD_VERSION >= VERSION_I_P +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/getintmask.s b/lib/ultralib/src/os/getintmask.s new file mode 100644 index 0000000..573eed1 --- /dev/null +++ b/lib/ultralib/src/os/getintmask.s @@ -0,0 +1,33 @@ +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "PR/os.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osGetIntMask) + mfc0 v0, C0_SR + andi v0, v0, OS_IM_CPU + la t0, __OSGlobalIntMask + lw t1, 0(t0) + xor t0, t1, -1 + andi t0, t0, SR_IMASK + or v0, v0, t0 + + lw t1, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz t1, 1f + + la t0, __OSGlobalIntMask # this is intentionally a macro in the branch delay slot + + lw t0, 0(t0) + srl t0, t0, 0x10 + xor t0, t0, -1 + andi t0, t0, 0x3f + or t1, t1, t0 +1: + sll t2, t1, 0x10 + or v0, v0, t2 + jr ra + nop +END(osGetIntMask) diff --git a/lib/ultralib/src/os/getmemsize.c b/lib/ultralib/src/os/getmemsize.c new file mode 100644 index 0000000..824ad4d --- /dev/null +++ b/lib/ultralib/src/os/getmemsize.c @@ -0,0 +1,53 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/R4300.h" + +#define STEP 0x100000 +#define SIZE_4MB 0x400000 +#define SIZE_8MB 0x800000 + +#if BUILD_VERSION >= VERSION_I_P + +u32 osGetMemSize(void) { + vu32* ptr; + u32 size = SIZE_4MB; + u32 data0; + u32 data1; + + while (size < SIZE_8MB) { + ptr = (vu32*)(K1BASE + size); + + data0 = *ptr; + data1 = ptr[STEP / 4 - 1]; + + *ptr ^= ~0; + ptr[STEP / 4 - 1] ^= ~0; + + if ((*ptr != (data0 ^ ~0)) || (ptr[STEP / 4 - 1] != (data1 ^ ~0))) { + return size; + } + + *ptr = data0; + ptr[STEP / 4 - 1] = data1; + + size += STEP; + } + + 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/getnextfaultthread.c b/lib/ultralib/src/os/getnextfaultthread.c new file mode 100644 index 0000000..44d723a --- /dev/null +++ b/lib/ultralib/src/os/getnextfaultthread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSThread* __osGetNextFaultedThread(OSThread* lastFault) { + register int saveMask = __osDisableInt(); + register OSThread* fault; + + fault = lastFault == NULL ? __osActiveQueue : lastFault; + + while (fault->priority != -1) { + if ((fault->flags & OS_FLAG_FAULT) != 0 && fault != lastFault) { + break; + } + fault = fault->tlnext; + } + + if (fault->priority == -1) { + fault = NULL; + } + + __osRestoreInt(saveMask); + return fault; +} diff --git a/lib/ultralib/src/os/getsr.s b/lib/ultralib/src/os/getsr.s new file mode 100644 index 0000000..bc9c767 --- /dev/null +++ b/lib/ultralib/src/os/getsr.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetSR) + STAY2(mfc0 v0, C0_SR) + jr ra +END(__osGetSR) diff --git a/lib/ultralib/src/os/getthreadid.c b/lib/ultralib/src/os/getthreadid.c new file mode 100644 index 0000000..8bbc9f6 --- /dev/null +++ b/lib/ultralib/src/os/getthreadid.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSId osGetThreadId(OSThread* thread) { + if (thread == NULL) { + thread = __osRunningThread; + } + + return thread->id; +} diff --git a/lib/ultralib/src/os/getthreadpri.c b/lib/ultralib/src/os/getthreadpri.c new file mode 100644 index 0000000..149f3f7 --- /dev/null +++ b/lib/ultralib/src/os/getthreadpri.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSPri osGetThreadPri(OSThread* thread) { + if (thread == NULL) { + thread = __osRunningThread; + } + + return thread->priority; +} diff --git a/lib/ultralib/src/os/gettime.c b/lib/ultralib/src/os/gettime.c new file mode 100644 index 0000000..aab4133 --- /dev/null +++ b/lib/ultralib/src/os/gettime.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +OSTime osGetTime() { + u32 tmptime; + u32 elapseCount; + OSTime currentCount; + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSGETTIME, 0); + return 0; + } +#endif + + saveMask = __osDisableInt(); + tmptime = osGetCount(); + elapseCount = tmptime - __osBaseCounter; + currentCount = __osCurrentTime; + __osRestoreInt(saveMask); + return currentCount + elapseCount; +} diff --git a/lib/ultralib/src/os/gettlbasid.s b/lib/ultralib/src/os/gettlbasid.s new file mode 100644 index 0000000..a0702ea --- /dev/null +++ b/lib/ultralib/src/os/gettlbasid.s @@ -0,0 +1,11 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBASID) + mfc0 v0, C0_ENTRYHI + jr ra + nop +END(__osGetTLBASID) diff --git a/lib/ultralib/src/os/gettlbhi.s b/lib/ultralib/src/os/gettlbhi.s new file mode 100644 index 0000000..04c03e9 --- /dev/null +++ b/lib/ultralib/src/os/gettlbhi.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBHi) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_ENTRYHI + jr ra + nop +END(__osGetTLBHi) diff --git a/lib/ultralib/src/os/gettlblo0.s b/lib/ultralib/src/os/gettlblo0.s new file mode 100644 index 0000000..3b2c2ec --- /dev/null +++ b/lib/ultralib/src/os/gettlblo0.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBLo0) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_ENTRYLO0 + jr ra + nop +END(__osGetTLBLo0) diff --git a/lib/ultralib/src/os/gettlblo1.s b/lib/ultralib/src/os/gettlblo1.s new file mode 100644 index 0000000..a24baef --- /dev/null +++ b/lib/ultralib/src/os/gettlblo1.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBLo1) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_ENTRYLO1 + jr ra + nop +END(__osGetTLBLo1) diff --git a/lib/ultralib/src/os/gettlbpagemask.s b/lib/ultralib/src/os/gettlbpagemask.s new file mode 100644 index 0000000..de9954a --- /dev/null +++ b/lib/ultralib/src/os/gettlbpagemask.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBPageMask) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_PAGEMASK + jr ra + nop +END(__osGetTLBPageMask) diff --git a/lib/ultralib/src/os/getwatchlo.s b/lib/ultralib/src/os/getwatchlo.s new file mode 100644 index 0000000..4eee9ee --- /dev/null +++ b/lib/ultralib/src/os/getwatchlo.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetWatchLo) + STAY2(mfc0 v0, C0_WATCHLO) + jr ra +END(__osGetWatchLo) diff --git a/lib/ultralib/src/os/initialize.c b/lib/ultralib/src/os/initialize.c new file mode 100644 index 0000000..f31c817 --- /dev/null +++ b/lib/ultralib/src/os/initialize.c @@ -0,0 +1,247 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/os_version.h" +#include "../io/piint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; +extern __osExceptionVector __osExceptionPreamble[]; + +extern OSPiHandle __Dom1SpeedParam; +extern OSPiHandle __Dom2SpeedParam; + +OSTime osClockRate = OS_CLOCK_RATE; +s32 osViClock = VI_NTSC_CLOCK; +u32 __osShutdown = 0; +u32 __OSGlobalIntMask = OS_IM_ALL; +#ifdef _FINALROM +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_I_P +extern OSPiHandle CartRomHandle; +extern OSPiHandle LeoDiskHandle; +static OSPiHandle* __osCartRomInit(void); +#elif BUILD_VERSION >= VERSION_J +static void ptstart(void); +static void SPEED_PARAM_FUNC(void); +#endif +extern __osExceptionVector __ptExceptionPreamble[]; + +#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); + __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 + +void INITIALIZE_FUNC() { + u32 pifdata; +#if BUILD_VERSION < VERSION_K + u32 clock = 0; +#endif + +#ifdef _FINALROM + __osFinalrom = TRUE; +#endif + + __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 + ; + } + while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8)) { + ; // todo: magic contant + } + *(__osExceptionVector*)UT_VEC = *__osExceptionPreamble; + *(__osExceptionVector*)XUT_VEC = *__osExceptionPreamble; + *(__osExceptionVector*)ECC_VEC = *__osExceptionPreamble; + *(__osExceptionVector*)E_VEC = *__osExceptionPreamble; + osWritebackDCache((void*)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); + osInvalICache((void*)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); + +#ifdef BUILD_VERSION == VERSION_I_P + __osCartRomInit(); + osUnmapTLBAll(); + osMapTLBRdb(); +#elif 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 + bzero(osAppNMIBuffer, OS_APP_NMI_BUFSIZE); + } + + if (osTvType == OS_TV_PAL) { + osViClock = VI_PAL_CLOCK; + } else if (osTvType == OS_TV_MPAL) { + osViClock = VI_MPAL_CLOCK; + } else { + osViClock = VI_NTSC_CLOCK; + } + +#if BUILD_VERSION >= VERSION_I_P + // Wait until there are no RCP interrupts + if (__osGetCause() & CAUSE_IP5) { + while (TRUE) { + ; + } + } + + 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()) { + __osInitialize_msp(); + } else if (__checkHardware_kmc()) { + __osInitialize_kmc(); + } else if (__checkHardware_isv()) { + __osInitialize_isv(); + } else { + __osInitialize_emu(); + } +#endif +} +#elif BUILD_VERSION == VERSION_I_P +static OSPiHandle *__osCartRomInit(void) { + CartRomHandle.type = DEVICE_TYPE_INIT; + CartRomHandle.latency = IO_READ(PI_BSD_DOM1_LAT_REG); + CartRomHandle.pulse = IO_READ(PI_BSD_DOM1_PWD_REG); + CartRomHandle.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); + CartRomHandle.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); + + LeoDiskHandle.type = DEVICE_TYPE_INIT; + LeoDiskHandle.latency = IO_READ(PI_BSD_DOM2_LAT_REG); + LeoDiskHandle.pulse = IO_READ(PI_BSD_DOM2_PWD_REG); + LeoDiskHandle.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG); + LeoDiskHandle.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG); +} +#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_emu.c b/lib/ultralib/src/os/initialize_emu.c new file mode 100644 index 0000000..7f7dd85 --- /dev/null +++ b/lib/ultralib/src/os/initialize_emu.c @@ -0,0 +1,27 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "osint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +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; +} + +void __osInitialize_emu(void) { + __printfunc = proutSyncPrintf; +} + +#endif diff --git a/lib/ultralib/src/os/initialize_isv.c b/lib/ultralib/src/os/initialize_isv.c new file mode 100644 index 0000000..50f6379 --- /dev/null +++ b/lib/ultralib/src/os/initialize_isv.c @@ -0,0 +1,175 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "osint.h" + +#include "macros.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __isExpJP; + +void MonitorInitBreak(void); + +#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; +u32 gISVDbgPrnAdrs; +u32 leoComuBuffAdd; + +static OSPiHandle* is_Handle; + +void isPrintfInit(void) { + is_Handle = osCartRomInit(); + + 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) { + u32 data; + s32 p; + s32 start; + s32 end; + + if (gISVDbgPrnAdrs == 0) { + return 0; + } + + osEPiReadIo(is_Handle, ISV_MAGIC_ADDR, &data); + if (data != IS64_MAGIC) { + return 1; + } + osEPiReadIo(is_Handle, ISV_GET_ADDR, &data); + p = data; + osEPiReadIo(is_Handle, ISV_PUT_ADDR, &data); + + start = data; + end = start + count; + + if (end >= ISV_BUFFER_LEN) { + end -= ISV_BUFFER_LEN; + if (p < end || start < p) { + return 1; + } + } else { + if (start < p && p < end) { + return 1; + } + } + while (count) { + if (*str != '\0') { + s32 shift = start & 3; + u32 addr = ISV_BUFFER + (start & 0xFFFFFFC); + + shift = (3 - shift) * 8; + + osEPiReadIo(is_Handle, addr, &data); + osEPiWriteIo(is_Handle, addr, (data & ~(0xff << shift)) | (*str << shift)); + + start++; + if (start >= ISV_BUFFER_LEN) { + start -= ISV_BUFFER_LEN; + } + } + count--; + str++; + } + osEPiWriteIo(is_Handle, ISV_PUT_ADDR, start); + + return 1; +} + +int __checkHardware_isv(void) { + u32 i = 0; + u32 data; + u32 save[4]; + OSPiHandle* hnd = osCartRomInit(); + + gISVDbgPrnAdrs = 0; + leoComuBuffAdd = 0; + gISVFlag = IS64_MAGIC; + gISVChk = 0; + + for (i = 0; i < 4; i++) { + osEPiReadIo(hnd, 0xB0000100 + i * 4, &save[i]); + } + +#ifndef __GNU__ // BUG: data is used uninitialized for GCC + data = 0; +#endif + osEPiWriteIo(hnd, 0xB000010C, data); + data = IS64_MAGIC; + osEPiWriteIo(hnd, 0xB0000100, IS64_MAGIC); + + for (i = 0; i < 0x20000; i++) { + osEPiReadIo(hnd, 0xB000010C, &data); + if (data == IS64_MAGIC) { + data = 0; + osEPiWriteIo(hnd, 0xB0000100, data); + gISVChk |= 1; + osEPiReadIo(hnd, 0xB0000104, &gISVDbgPrnAdrs); + osEPiReadIo(hnd, 0xB0000108, &leoComuBuffAdd); + break; + } + } + + for (i = 0; i < 4; i++) { + osEPiWriteIo(hnd, 0xB0000100 + i * 4, save[i]); + } + + osEPiReadIo(hnd, 0xBFF00000, &data); + + gISVChk |= ((data == IS64_MAGIC) ? 2 : 0); + + return (gISVChk != 0) ? TRUE : FALSE; +} + +void __osInitialize_isv(void) { + void (*fn)(void); + OSPiHandle* hnd; + s32 pad; + s32 pad2; + + if (gISVFlag == IS64_MAGIC || __checkHardware_isv()) { + if (gISVDbgPrnAdrs != 0) { + __printfunc = is_proutSyncPrintf; + isPrintfInit(); + } + if (gISVChk & 2) { + hnd = osCartRomInit(); + + ramOldVector = *(__osExceptionVector*)E_VEC; + *(__osExceptionVector*)E_VEC = __isExpJP; + + osWritebackDCache(&ramOldVector, 0x10); + osInvalICache(&ramOldVector, 0x10); + osWritebackDCache(0x80000000, 0x190); + osInvalICache(0x80000000, 0x190); + osEPiReadIo(hnd, 0xBFF00010, (u32*)&fn); + fn(); + } + if (gISVChk & 2) { + MonitorInitBreak(); + } + } +} + +#endif diff --git a/lib/ultralib/src/os/initialize_kmc.c b/lib/ultralib/src/os/initialize_kmc.c new file mode 100644 index 0000000..4952a0d --- /dev/null +++ b/lib/ultralib/src/os/initialize_kmc.c @@ -0,0 +1,152 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "osint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __ptExceptionPreamble[]; + +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 (TRUE) { + osPiReadIo(stat, &data); + if (data & 4) { + osPiWriteIo(wport, c); + break; + } + } +} + +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; +} + +extern u32 __kmc_pt_mode; + +void __osInitialize_kmc(void) { + if (!__kmc_pt_mode) { + int (*fnc)(); + 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); + } + __printfunc = kmc_proutSyncPrintf; + } +} + +int __checkHardware_kmc(void) { + volatile unsigned int* mon = (unsigned*)0xBFF00000; + + if (*mon == 0x4B4D4300) { + mon = (unsigned*)0xBFF00010; + + if (*mon == 0xB0FFB000) { + return TRUE; + } else { + return FALSE; + } + } else { + return FALSE; + } +} + +#endif diff --git a/lib/ultralib/src/os/initialize_msp.c b/lib/ultralib/src/os/initialize_msp.c new file mode 100644 index 0000000..1f120e1 --- /dev/null +++ b/lib/ultralib/src/os/initialize_msp.c @@ -0,0 +1,152 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "osint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __ptExceptionPreamble[]; + +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 (TRUE) { + osPiReadIo(stat, &data); + if (data & 4) { + osPiWriteIo(wport, c); + break; + } + } +} + +static void* msp_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; +} + +extern u32 __kmc_pt_mode; + +void __osInitialize_msp(void) { + if (!__kmc_pt_mode) { + int (*fnc)(); + 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); + } + __printfunc = msp_proutSyncPrintf; + } +} + +int __checkHardware_msp(void) { + volatile unsigned int* mon = (unsigned*)0xBFF00000; + + if (*mon == 0x4B4D4300) { + mon = (unsigned*)0xBFF00010; + + if (*mon == 0) { + return TRUE; + } else { + return FALSE; + } + } else { + return FALSE; + } +} + +#endif diff --git a/lib/ultralib/src/os/initrdb.c b/lib/ultralib/src/os/initrdb.c new file mode 100644 index 0000000..5537eb1 --- /dev/null +++ b/lib/ultralib/src/os/initrdb.c @@ -0,0 +1,31 @@ +#ifndef _FINALROM +#include "PR/rdb.h" +#include "PR/os_internal.h" + +rdbPacket* __osRdb_IP6_Data; +u32 __osRdb_IP6_Size; +u32 __osRdb_IP6_Ct; +u32 __osRdb_IP6_CurWrite; +u32 __osRdb_IP6_CurSend; + +void osInitRdb(u8* sendBuf, u32 sendSize) { + u32 mask; + + sendSize /= 4; + + if (((u32)sendBuf & 3) != 0) { + sendBuf = ((u32)sendBuf & 3) + 4; + sendSize--; + } + mask = __osDisableInt(); + + __osRdb_IP6_Data = sendBuf; + __osRdb_IP6_Size = sendSize; + __osRdb_IP6_Ct = 0; + __osRdb_IP6_CurWrite = 0; + __osRdb_IP6_CurSend = 0; + + __osRestoreInt(mask); +} + +#endif diff --git a/lib/ultralib/src/os/interrupt.s b/lib/ultralib/src/os/interrupt.s new file mode 100644 index 0000000..361198a --- /dev/null +++ b/lib/ultralib/src/os/interrupt.s @@ -0,0 +1,52 @@ +#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_I_P + la t2, __OSGlobalIntMask + lw t3, (t2) + andi t3, 0xFF00 + mfc0 t0, C0_SR + and t1, t0, ~SR_IE + mtc0 t1, C0_SR + andi v0, t0, SR_IE + lw t0, (t2) + andi t0, 0xFF00 + beq t0, t3, No_Change_Global_Int + la t2, __osRunningThread # this is intentionally a macro in the branch delay slot + lw t1, 280(t2) + andi t2, t1, 0xFF00 + and t2, t0 + and t1, 0xFFFF00FF + or t1, t2 + and t1, -2 + mtc0 t1, $12 + nop + nop +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) + mfc0 t0, C0_SR + or t0, t0, a0 + mtc0 t0, C0_SR + nop + nop + jr ra + nop +END(__osRestoreInt) diff --git a/lib/ultralib/src/os/invaldcache.s b/lib/ultralib/src/os/invaldcache.s new file mode 100644 index 0000000..ea6a657 --- /dev/null +++ b/lib/ultralib/src/os/invaldcache.s @@ -0,0 +1,58 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osInvalDCache) + blez a1, 3f + li t3, DCACHE_SIZE + bgeu a1, t3, 4f + + + move t0, a0 + addu t1, a0, a1 + bgeu t0, t1, 3f + + + addiu t1, t1, -DCACHE_LINESIZE + andi t2, t0, DCACHE_LINEMASK + beqz t2, 1f + + + subu t0, t0, t2 + CACHE((C_HWBINV|CACH_PD), (t0)) + bgeu t0, t1, 3f + + + addiu t0, t0, DCACHE_LINESIZE +1: + andi t2, t1, DCACHE_LINEMASK + beqz t2, 2f + + subu t1, t1, t2 + CACHE((C_HWBINV|CACH_PD), 0x10(t1)) + bltu t1, t0, 3f + +2: + CACHE((C_HINV|CACH_PD), (t0)) + .set noreorder + bltu t0, t1, 2b + addiu t0, t0, DCACHE_LINESIZE + .set reorder +3: + jr ra + +4: + li t0, KUSIZE + addu t1, t0, t3 + addiu t1, t1, -DCACHE_LINESIZE +5: + CACHE((C_IINV|CACH_PD), (t0)) + .set noreorder + bltu t0, t1, 5b + addiu t0, t0, DCACHE_LINESIZE + .set reorder + + jr ra + +END(osInvalDCache) diff --git a/lib/ultralib/src/os/invalicache.s b/lib/ultralib/src/os/invalicache.s new file mode 100644 index 0000000..f5ceb58 --- /dev/null +++ b/lib/ultralib/src/os/invalicache.s @@ -0,0 +1,41 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osInvalICache) + blez a1, 2f + + li t3, ICACHE_SIZE + bgeu a1, t3, 3f + + move t0, a0 + addu t1, a0, a1 + bgeu t0, t1, 2f + + addiu t1, t1, -ICACHE_LINESIZE + andi t2, t0, ICACHE_LINEMASK + subu t0, t0, t2 +1: + CACHE((C_HINV|CACH_PI), (t0)) + .set noreorder + bltu t0, t1, 1b + addiu t0, t0, ICACHE_LINESIZE + .set reorder +2: + jr ra + +3: + li t0, KUSIZE + addu t1, t0, t3 + addiu t1, t1, -ICACHE_LINESIZE +4: + CACHE((C_IINV|CACH_PI), (t0)) + .set noreorder + bltu t0, t1, 4b + addiu t0, t0, ICACHE_LINESIZE + .set reorder + + jr ra + +END(osInvalICache) diff --git a/lib/ultralib/src/os/jammesg.c b/lib/ultralib/src/os/jammesg.c new file mode 100644 index 0000000..cef68da --- /dev/null +++ b/lib/ultralib/src/os/jammesg.c @@ -0,0 +1,37 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +s32 osJamMesg(OSMesgQueue* mq, OSMesg msg, s32 flag) { + register u32 saveMask; + +#ifdef _DEBUG + if ((flag != OS_MESG_NOBLOCK) && (flag != OS_MESG_BLOCK)) { + __osError(ERR_OSJAMMESG, 1, flag); + return -1; + } +#endif + + saveMask = __osDisableInt(); + + while (mq->validCount >= mq->msgCount) { + if (flag == OS_MESG_BLOCK) { + __osRunningThread->state = OS_STATE_WAITING; + __osEnqueueAndYield(&mq->fullqueue); + } else { + __osRestoreInt(saveMask); + return -1; + } + } + + mq->first = (mq->first + mq->msgCount - 1) % mq->msgCount; + mq->msg[mq->first] = msg; + mq->validCount++; + + if (mq->mtqueue->next != NULL) { + osStartThread(__osPopThread(&mq->mtqueue)); + } + + __osRestoreInt(saveMask); + return 0; +} diff --git a/lib/ultralib/src/os/maptlb.s b/lib/ultralib/src/os/maptlb.s new file mode 100644 index 0000000..20125b6 --- /dev/null +++ b/lib/ultralib/src/os/maptlb.s @@ -0,0 +1,111 @@ +#include "PR/ultraerror.h" +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +#define index a0 +#define pm a1 +#define vaddr a2 +#define evenpaddr a3 +#define oddpaddr 16(sp) +#define asid 20(sp) +.text +.set noreorder +LEAF(osMapTLB) +#if defined (_DEBUG) && defined (__sgi) + bgez index, 1f + nop + b 2f + nop +1: + li t0, 0x1F +.set noat + slt AT, index, t0 + bnez AT, 3f + nop +.set at +2: + move a2, a0 + li a0, ERR_OSMAPTLB_INDEX + li a1, 1 + j __osError + nop + +3: + lw t0, asid + li t1, -1 +.set noat + slt AT, t0, t1 + beqz AT, 4f + nop +.set at + b 5f + nop +4: + li t1, 0xFF +.set noat + slt AT, t1, t0 + beqz AT, 6f + nop +.set at +5: + move a2, t0 + li a0, ERR_OSMAPTLB_ASID + li a1, 1 + j __osError + nop +6: +.set reorder +#endif + STAY2(mfc0 t0, C0_ENTRYHI) + STAY2(mtc0 index, C0_INX) + STAY2(mtc0 pm, C0_PAGEMASK) +.set noreorder + lw t1, asid + beq t1, -1, 7f + li ta0, TLBLO_G + li t2, TLBLO_NONCOHRNT | TLBLO_D | TLBLO_V + b 8f + or vaddr, vaddr, t1 +.set reorder + +7: + li t2, TLBLO_NONCOHRNT | TLBLO_D | TLBLO_V | TLBLO_G +8: + STAY2(mtc0 vaddr, C0_ENTRYHI) + beq evenpaddr, -1, 9f + #nop + srl t3, evenpaddr, TLBLO_PFNSHIFT + or t3, t3, t2 + STAY2(mtc0 t3, C0_ENTRYLO0) + b 10f + #nop +9: + STAY2(mtc0 ta0, C0_ENTRYLO0) +10: + lw t3, oddpaddr + beq t3, -1, 11f + #nop + srl t3, t3, TLBLO_PFNSHIFT + or t3, t3, t2 + STAY2(mtc0 t3, C0_ENTRYLO1) + b 12f + #nop +11: + STAY2(mtc0 ta0, C0_ENTRYLO1) + bne evenpaddr, -1, 12f + #nop + li t3, K0BASE + STAY2(mtc0 t3, C0_ENTRYHI) +12: + .set noreorder + nop + tlbwi + nop + nop + nop + nop + STAY2(mtc0 t0, C0_ENTRYHI) + jr ra + #nop +END(osMapTLB) diff --git a/lib/ultralib/src/os/maptlbrdb.s b/lib/ultralib/src/os/maptlbrdb.s new file mode 100644 index 0000000..c004362 --- /dev/null +++ b/lib/ultralib/src/os/maptlbrdb.s @@ -0,0 +1,30 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osMapTLBRdb) + mfc0 t0, C0_ENTRYHI + li t1, 31 + mtc0 t1, C0_INX + mtc0 zero, C0_PAGEMASK /*4k*/ + li t2, TLBLO_UNCACHED | TLBLO_D | TLBLO_V | TLBLO_G + li t1, K2BASE + mtc0 t1, C0_ENTRYHI + li t1, KUSIZE + srl t3, t1,TLBLO_PFNSHIFT + or t3, t3,t2 + mtc0 t3, C0_ENTRYLO0 + li t1, TLBLO_G + mtc0 t1, C0_ENTRYLO1 + nop + tlbwi + nop + nop + nop + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osMapTLBRdb) diff --git a/src/libultra/os/osint.h b/lib/ultralib/src/os/osint.h similarity index 87% rename from src/libultra/os/osint.h rename to lib/ultralib/src/os/osint.h index 7a4c0cd..b73b609 100644 --- a/src/libultra/os/osint.h +++ b/lib/ultralib/src/os/osint.h @@ -39,11 +39,14 @@ extern u32 __osViIntrCount; extern u32 __osTimerCounter; extern u32 __osShutdown; -extern __OSEventState __osEventStateTab[OS_NUM_EVENTS]; +extern OSMesgQueue __osProfTimerQ; +extern OSProf *__osProfileList; +extern OSProf *__osProfileListEnd; +extern u32 __osProfileOverflowBin; + +extern __OSEventState __osEventStateTab[]; -//not sure if this should be here -extern s32 osViClock; extern void __osTimerServicesInit(void); extern s32 __osAiDeviceBusy(void); extern int __osDpDeviceBusy(void); diff --git a/lib/ultralib/src/os/parameters.s b/lib/ultralib/src/os/parameters.s new file mode 100644 index 0000000..450af31 --- /dev/null +++ b/lib/ultralib/src/os/parameters.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +ABS(leoBootID, 0x800001a0) +ABS(osTvType, 0x80000300) +ABS(osRomType, 0x80000304) +ABS(osRomBase, 0x80000308) +ABS(osResetType, 0x8000030c) +ABS(osCicId, 0x80000310) +ABS(osVersion, 0x80000314) +ABS(osMemSize, 0x80000318) +ABS(osAppNMIBuffer, 0x8000031c) + +.space 0x60 +/* padded to 0x60 in the object file */ diff --git a/lib/ultralib/src/os/physicaltovirtual.c b/lib/ultralib/src/os/physicaltovirtual.c new file mode 100644 index 0000000..6fbb9c3 --- /dev/null +++ b/lib/ultralib/src/os/physicaltovirtual.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" + +void* osPhysicalToVirtual(u32 addr) { + return (void*)PHYS_TO_K0(addr); +} diff --git a/lib/ultralib/src/os/probetlb.s b/lib/ultralib/src/os/probetlb.s new file mode 100644 index 0000000..237db23 --- /dev/null +++ b/lib/ultralib/src/os/probetlb.s @@ -0,0 +1,54 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(__osProbeTLB) + mfc0 t0, C0_ENTRYHI + andi t1, t0, TLBHI_PIDMASK + and t2, a0, -8192 # This also works: (TLBHI_VPN2MASK << 32) >> 32 + or t1, t1, t2 + mtc0 t1, C0_ENTRYHI + nop + nop + nop + tlbp + nop + nop + mfc0 t3, C0_INX + and t3, t3, TLBINX_PROBE + bnez t3, 3f + nop + tlbr + nop + nop + nop + mfc0 t3, C0_PAGEMASK + addi t3, t3, DCACHE_SIZE + srl t3, t3, 0x1 + and ta0, t3, a0 + bnez ta0, 1f + addi t3, t3,-1 + mfc0 v0, C0_ENTRYLO0 + b 2f + nop +1: + mfc0 v0, C0_ENTRYLO1 +2: + andi ta1, v0,TLBLO_V + beqz ta1, 3f + nop + and v0, v0, TLBLO_PFNMASK + sll v0, v0, TLBLO_PFNSHIFT + and ta1, a0, t3 + add v0, v0, ta1 + b 4f + nop +3: + li v0, -1 +4: + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(__osProbeTLB) diff --git a/lib/ultralib/src/os/rdbsend.c b/lib/ultralib/src/os/rdbsend.c new file mode 100644 index 0000000..0dc111e --- /dev/null +++ b/lib/ultralib/src/os/rdbsend.c @@ -0,0 +1,76 @@ +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/R4300.h" + +#ifndef _FINALROM +extern rdbPacket* __osRdb_IP6_Data; +extern u32 __osRdb_IP6_Size; +extern u32 __osRdb_IP6_Ct; +extern u32 __osRdb_IP6_CurWrite; + +u32 __osRdb_IP6_Empty = 1; + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +u32 __osRdbSend(u8* buf, u32 size, u32 type) { + rdbPacket* pPtr; + rdbPacket pkt; + u32 len; + u32 c; + u32 inCt = 0; + u32 needFirst = 0; + u32 mask; + u32 sent = 0; + + mask = __osDisableInt(); + + if (__osRdb_IP6_Empty != 0) { + __osRdb_IP6_Empty = 0; + pkt.type = type; + + len = MIN(size, sizeof(pkt.buf)); + + pkt.length = len; + + c = 0; + while (c < len) { + pkt.buf[c++] = buf[inCt++]; + } + + size -= len; + sent = len; + needFirst = 1; + } + + while (size != 0 && __osRdb_IP6_Ct < __osRdb_IP6_Size) { + len = MIN(size, sizeof(pPtr->buf)); + + pPtr = &__osRdb_IP6_Data[__osRdb_IP6_CurWrite]; + + pPtr->type = type; + pPtr->length = len; + + c = 0; + while (c < len) { + pPtr->buf[c++] = buf[inCt++]; + } + + __osRdb_IP6_CurWrite++; + if (__osRdb_IP6_CurWrite >= __osRdb_IP6_Size) { + __osRdb_IP6_CurWrite = 0; + } + + __osRdb_IP6_Ct++; + size -= len; + sent += len; + } + + if (needFirst) { + *(u32*)RDB_BASE_REG = *(u32*)&pkt; + } + __osRestoreInt(mask); + + return sent; +} + +#endif diff --git a/lib/ultralib/src/os/recvmesg.c b/lib/ultralib/src/os/recvmesg.c new file mode 100644 index 0000000..043ed21 --- /dev/null +++ b/lib/ultralib/src/os/recvmesg.c @@ -0,0 +1,40 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flags) { + register u32 saveMask; + +#ifdef _DEBUG + if ((flags != OS_MESG_NOBLOCK) && (flags != OS_MESG_BLOCK)) { + __osError(ERR_OSRECVMESG, 1, flags); + return -1; + } +#endif + + saveMask = __osDisableInt(); + + while (MQ_IS_EMPTY(mq)) { + if (flags == OS_MESG_NOBLOCK) { + __osRestoreInt(saveMask); + return -1; + } else { + __osRunningThread->state = OS_STATE_WAITING; + __osEnqueueAndYield(&mq->mtqueue); + } + } + + if (msg != NULL) { + *msg = mq->msg[mq->first]; + } + + mq->first = (mq->first + 1) % mq->msgCount; + mq->validCount--; + + if (mq->fullqueue->next != NULL) { + osStartThread(__osPopThread(&mq->fullqueue)); + } + + __osRestoreInt(saveMask); + return 0; +} diff --git a/src/libultra/os/resetglobalintmask.c b/lib/ultralib/src/os/resetglobalintmask.c similarity index 60% rename from src/libultra/os/resetglobalintmask.c rename to lib/ultralib/src/os/resetglobalintmask.c index 9ca3140..780da7c 100644 --- a/src/libultra/os/resetglobalintmask.c +++ b/lib/ultralib/src/os/resetglobalintmask.c @@ -1,12 +1,9 @@ -#include #include "PR/os_internal.h" -extern u32 __osGlobalIntMask; - void __osResetGlobalIntMask(OSHWIntr mask) { register u32 saveMask = __osDisableInt(); - __osGlobalIntMask &= ~(mask & ~OS_IM_RCP); + __OSGlobalIntMask &= ~(mask & ~OS_IM_RCP); __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/os/sendmesg.c b/lib/ultralib/src/os/sendmesg.c new file mode 100644 index 0000000..19cf3de --- /dev/null +++ b/lib/ultralib/src/os/sendmesg.c @@ -0,0 +1,38 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +s32 osSendMesg(OSMesgQueue* mq, OSMesg msg, s32 flags) { + register u32 saveMask; + register s32 last; + +#ifdef _DEBUG + if ((flags != OS_MESG_NOBLOCK) && (flags != OS_MESG_BLOCK)) { + __osError(ERR_OSSENDMESG, 1, flags); + return -1; + } +#endif + + saveMask = __osDisableInt(); + + while (MQ_IS_FULL(mq)) { + if (flags == OS_MESG_BLOCK) { + __osRunningThread->state = OS_STATE_WAITING; + __osEnqueueAndYield(&mq->fullqueue); + } else { + __osRestoreInt(saveMask); + return -1; + } + } + + last = (mq->first + mq->validCount) % mq->msgCount; + mq->msg[last] = msg; + mq->validCount++; + + if (mq->mtqueue->next != NULL) { + osStartThread(__osPopThread(&mq->mtqueue)); + } + + __osRestoreInt(saveMask); + return 0; +} diff --git a/lib/ultralib/src/os/setcause.s b/lib/ultralib/src/os/setcause.s new file mode 100644 index 0000000..52e4950 --- /dev/null +++ b/lib/ultralib/src/os/setcause.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCause) + STAY2(mtc0 a0, C0_CAUSE) + jr ra +END(__osSetCause) diff --git a/lib/ultralib/src/os/setcompare.s b/lib/ultralib/src/os/setcompare.s new file mode 100644 index 0000000..dec29a2 --- /dev/null +++ b/lib/ultralib/src/os/setcompare.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCompare) + STAY2(mtc0 a0, C0_COMPARE) + jr ra +END(__osSetCompare) diff --git a/lib/ultralib/src/os/setconfig.s b/lib/ultralib/src/os/setconfig.s new file mode 100644 index 0000000..4f062bd --- /dev/null +++ b/lib/ultralib/src/os/setconfig.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetConfig) + STAY2(mtc0 a0, C0_CONFIG) + jr ra +END(__osSetConfig) diff --git a/lib/ultralib/src/os/setcount.s b/lib/ultralib/src/os/setcount.s new file mode 100644 index 0000000..f94f1d2 --- /dev/null +++ b/lib/ultralib/src/os/setcount.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCount) + STAY2(mtc0 a0, C0_COUNT) + jr ra +END(__osSetCount) diff --git a/lib/ultralib/src/os/seterrorhandler.c b/lib/ultralib/src/os/seterrorhandler.c new file mode 100644 index 0000000..4e839e8 --- /dev/null +++ b/lib/ultralib/src/os/seterrorhandler.c @@ -0,0 +1,10 @@ +#include "PR/ultraerror.h" + +extern OSErrorHandler __osErrorHandler; + +OSErrorHandler osSetErrorHandler(OSErrorHandler handler) { + OSErrorHandler oldHandler = __osErrorHandler; + + __osErrorHandler = handler; + return oldHandler; +} diff --git a/lib/ultralib/src/os/seteventmesg.c b/lib/ultralib/src/os/seteventmesg.c new file mode 100644 index 0000000..6f8cc9d --- /dev/null +++ b/lib/ultralib/src/os/seteventmesg.c @@ -0,0 +1,39 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +__OSEventState __osEventStateTab[OS_NUM_EVENTS] ALIGNED(8); +#if BUILD_VERSION >= VERSION_I_P +u32 __osPreNMI = FALSE; +#endif + +void osSetEventMesg(OSEvent event, OSMesgQueue* mq, OSMesg msg) { + register u32 saveMask; + __OSEventState* es; + +#ifdef _DEBUG + if (event >= OS_NUM_EVENTS) { + __osError(ERR_OSSETEVENTMESG, 1, event); + return; + } +#endif + + saveMask = __osDisableInt(); + + es = &__osEventStateTab[event]; + + es->messageQueue = mq; + es->message = msg; + +#if BUILD_VERSION >= VERSION_I_P + 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 new file mode 100644 index 0000000..caeccaf --- /dev/null +++ b/lib/ultralib/src/os/setfpccsr.s @@ -0,0 +1,10 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetFpcCsr) + STAY2(cfc1 v0, fcr31) + STAY2(ctc1 a0, fcr31) + jr ra +END(__osSetSR) # @bug: Should be __osSetFpcCsr diff --git a/src/libultra/os/setglobalintmask.c b/lib/ultralib/src/os/setglobalintmask.c similarity index 69% rename from src/libultra/os/setglobalintmask.c rename to lib/ultralib/src/os/setglobalintmask.c index 18ebd5a..a718980 100644 --- a/src/libultra/os/setglobalintmask.c +++ b/lib/ultralib/src/os/setglobalintmask.c @@ -1,11 +1,9 @@ #include "PR/os_internal.h" -extern u32 __osGlobalIntMask; - void __osSetGlobalIntMask(OSHWIntr mask) { register u32 saveMask = __osDisableInt(); - __osGlobalIntMask |= mask; - + __OSGlobalIntMask |= mask; + __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/os/sethwinterrupt.c b/lib/ultralib/src/os/sethwinterrupt.c new file mode 100644 index 0000000..02128cb --- /dev/null +++ b/lib/ultralib/src/os/sethwinterrupt.c @@ -0,0 +1,32 @@ +#include "PR/os_internal.h" + +// A stack frame was added to hardware interrupt handlers in 2.0J +#if BUILD_VERSION >= VERSION_I_P + +struct __osHwInt { + s32 (*handler)(void); + void* stackEnd; +}; + +extern struct __osHwInt __osHwIntTable[]; + +void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void* stackEnd) { + register u32 saveMask = __osDisableInt(); + + __osHwIntTable[interrupt].handler = handler; + __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/setintmask.s b/lib/ultralib/src/os/setintmask.s new file mode 100644 index 0000000..f19ed17 --- /dev/null +++ b/lib/ultralib/src/os/setintmask.s @@ -0,0 +1,124 @@ +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "PR/os.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +#define MI_INTR_MASK ((1 << 6) - 1) + +.globl __osRcpImTable + +.text +.set noreorder +LEAF(osSetIntMask) + mfc0 ta0, C0_SR + + andi v0, ta0, OS_IM_CPU + + la t0, __OSGlobalIntMask + lw t3, 0(t0) + + xor t0, t3,-1 + andi t0, t0,(SR_IMASK) + or v0, v0,t0 + + lw t2, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz t2, 1f + srl t1, t3,0x10 + + xor t1, t1,-1 + andi t1, t1, MI_INTR_MASK + or t2, t2,t1 +1: + sll t2, t2,0x10 + or v0, v0,t2 + + and t0, a0, MI_INTR_MASK<<0x10 + and t0, t0,t3 + srl t0, t0,0xf + lhu t2, __osRcpImTable(t0) + sw t2, PHYS_TO_K1(MI_INTR_MASK_REG) + + andi t0, a0, OS_IM_CPU + andi t1, t3, SR_IMASK + and t0, t0,t1 + + and ta0, ta0, ~SR_IMASK + or ta0, ta0,t0 + + mtc0 ta0, C0_SR + nop + nop + jr ra + nop +END(osSetIntMask) + +.rdata +EXPORT(__osRcpImTable) +/* LUT to convert between MI_INTR and MI_INTR_MASK */ +/* MI_INTR is status for each interrupt whereas */ +/* MI_INTR_MASK has seperate bits for set/clr */ +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP diff --git a/lib/ultralib/src/os/setpiinterrupt.c b/lib/ultralib/src/os/setpiinterrupt.c new file mode 100644 index 0000000..1af72b5 --- /dev/null +++ b/lib/ultralib/src/os/setpiinterrupt.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" + +struct __osHwInt { + s32 (*handler)(void); + void* stackEnd; +}; + +extern struct __osHwInt __osPiIntTable; + +void __osSetPIIntrRoutine(struct __osHwInt* ir) { + register u32 saveMask = __osDisableInt(); + + __osPiIntTable.handler = ir->handler; + __osPiIntTable.stackEnd = ir->stackEnd; + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/setsr.s b/lib/ultralib/src/os/setsr.s new file mode 100644 index 0000000..d7d98fa --- /dev/null +++ b/lib/ultralib/src/os/setsr.s @@ -0,0 +1,10 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetSR) + STAY2(mtc0 a0, C0_SR) + NOP + jr ra +END(__osSetSR) diff --git a/src/libultra/os/setthreadpri.c b/lib/ultralib/src/os/setthreadpri.c similarity index 52% rename from src/libultra/os/setthreadpri.c rename to lib/ultralib/src/os/setthreadpri.c index 870c1b3..d836323 100644 --- a/src/libultra/os/setthreadpri.c +++ b/lib/ultralib/src/os/setthreadpri.c @@ -1,26 +1,36 @@ -#include +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" -extern OSThread* __osRunningThread; -extern OSThread* __osRunQueue; +void osSetThreadPri(OSThread* t, OSPri pri) { + register u32 saveMask; -void osSetThreadPri(OSThread *t, OSPri pri) -{ - register u32 saveMask = __osDisableInt(); - if (t == NULL) +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSSETTHREADPRI, 1, pri); + return; + } +#endif + + saveMask = __osDisableInt(); + + if (t == NULL) { t = __osRunningThread; - if (t->priority != pri) - { + } + + if (t->priority != pri) { t->priority = pri; - if (t != __osRunningThread && t->state != OS_STATE_STOPPED) - { + + if (t != __osRunningThread && t->state != OS_STATE_STOPPED) { __osDequeueThread(t->queue, t); __osEnqueueThread(t->queue, t); } - if (__osRunningThread->priority < __osRunQueue->priority) - { + + if (__osRunningThread->priority < __osRunQueue->priority) { __osRunningThread->state = OS_STATE_RUNNABLE; __osEnqueueAndYield(&__osRunQueue); } } + __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/os/settime.c b/lib/ultralib/src/os/settime.c new file mode 100644 index 0000000..b7d14e3 --- /dev/null +++ b/lib/ultralib/src/os/settime.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +void osSetTime(OSTime time) { + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSETTIME, 0); + return; + } +#endif + + __osCurrentTime = time; +} diff --git a/lib/ultralib/src/os/settimer.c b/lib/ultralib/src/os/settimer.c new file mode 100644 index 0000000..252f63c --- /dev/null +++ b/lib/ultralib/src/os/settimer.c @@ -0,0 +1,56 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +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) { + __osError(ERR_OSSETTIMER, 0); + return 0; + } +#endif + + t->next = NULL; + t->prev = NULL; + t->interval = interval; + t->value = (countdown != 0) ? countdown : interval; + t->mq = mq; + t->msg = msg; + +#if BUILD_VERSION >= VERSION_K + saveMask = __osDisableInt(); + if (__osTimerList->next == __osTimerList) { + + } else { + next = __osTimerList->next; + count = osGetCount(); + value = count - __osTimerCounter; + + if (value < next->value) { + next->value -= value; + } else { + next->value = 1; + } + } + + 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/settlbasid.s b/lib/ultralib/src/os/settlbasid.s new file mode 100644 index 0000000..13a17e8 --- /dev/null +++ b/lib/ultralib/src/os/settlbasid.s @@ -0,0 +1,32 @@ +#include "PR/ultraerror.h" +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osSetTLBASID) +#if defined (_DEBUG) && defined (__sgi) +.set noreorder + bgez a0, 1f + nop + b 2f + nop +1: + li t1, 0xFF +.set noat + slt AT, t1, a0 + beqz AT, 3f + nop +.set at +2: + move a2, a0 + li a0, ERR_OSSETTLBASID + li a1, 1 + j __osError + nop +3: +.set reorder +#endif + STAY2(mtc0 a0, C0_ENTRYHI) + jr ra +END(osSetTLBASID) diff --git a/lib/ultralib/src/os/setwatchlo.s b/lib/ultralib/src/os/setwatchlo.s new file mode 100644 index 0000000..91cc58e --- /dev/null +++ b/lib/ultralib/src/os/setwatchlo.s @@ -0,0 +1,10 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetWatchLo) + STAY2(mtc0 a0, C0_WATCHLO) + NOP + jr ra +END(__osSetWatchLo) diff --git a/lib/ultralib/src/os/startthread.c b/lib/ultralib/src/os/startthread.c new file mode 100644 index 0000000..2ce1546 --- /dev/null +++ b/lib/ultralib/src/os/startthread.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +void osStartThread(OSThread* t) { + register u32 saveMask = __osDisableInt(); + + switch (t->state) { + case OS_STATE_WAITING: + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__osRunQueue, t); + break; + case OS_STATE_STOPPED: + if (t->queue == NULL || t->queue == &__osRunQueue) { + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__osRunQueue, t); + } else { + t->state = OS_STATE_WAITING; + __osEnqueueThread(t->queue, t); + __osEnqueueThread(&__osRunQueue, __osPopThread(t->queue)); + } + break; +#ifdef _DEBUG + default: + __osError(ERR_OSSTARTTHREAD, 0); + __osRestoreInt(saveMask); + return; +#endif + } + + if (__osRunningThread == NULL) { + __osDispatchThread(); + } else if (__osRunningThread->priority < __osRunQueue->priority) { + __osRunningThread->state = OS_STATE_RUNNABLE; + __osEnqueueAndYield(&__osRunQueue); + } + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/stopthread.c b/lib/ultralib/src/os/stopthread.c new file mode 100644 index 0000000..9a51652 --- /dev/null +++ b/lib/ultralib/src/os/stopthread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "osint.h" + +void osStopThread(OSThread* t) { + register u32 saveMask = __osDisableInt(); + register u16 state; + + state = (t == NULL) ? OS_STATE_RUNNING: t->state; + + switch (state) { + case OS_STATE_RUNNING: + __osRunningThread->state = OS_STATE_STOPPED; + __osEnqueueAndYield(NULL); + break; + case OS_STATE_RUNNABLE: + case OS_STATE_WAITING: + t->state = OS_STATE_STOPPED; + __osDequeueThread(t->queue, t); + break; + } + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/stoptimer.c b/lib/ultralib/src/os/stoptimer.c new file mode 100644 index 0000000..b6db1c1 --- /dev/null +++ b/lib/ultralib/src/os/stoptimer.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +int osStopTimer(OSTimer* t) { + register u32 savedMask; + OSTimer* timep; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSTOPTIMER, 0); + return 0; + } +#endif + + if (t->next == NULL) { + return -1; + } + + savedMask = __osDisableInt(); + timep = t->next; + + if (timep != __osTimerList) { + timep->value += t->value; + } + + t->prev->next = t->next; + t->next->prev = t->prev; + t->next = NULL; + t->prev = NULL; + + if (__osTimerList->next == __osTimerList) { + __osSetCompare(0); + } + + __osRestoreInt(savedMask); + return 0; +} diff --git a/lib/ultralib/src/os/syncputchars.c b/lib/ultralib/src/os/syncputchars.c new file mode 100644 index 0000000..d2d5332 --- /dev/null +++ b/lib/ultralib/src/os/syncputchars.c @@ -0,0 +1,35 @@ +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/rcp.h" +#include "PR/R4300.h" + +unsigned int __osRdbSendMessage = 0; +unsigned int __osRdbWriteOK = 1; + +void __osSyncPutChars(int type, int length, const char* buf) { + rdbPacket packet; + int i; + u32 mask; + + packet.type = type; + packet.length = length; + + for (i = 0; i < length; i++) { + packet.buf[i] = buf[i]; + } + + while (!__osAtomicDec(&__osRdbWriteOK)) { + ; + } + + mask = __osDisableInt(); + *(vu32*)RDB_BASE_REG = *(vu32*)&packet; + + while (!(__osGetCause() & CAUSE_IP6)) { + ; + } + + *(vu32*)RDB_READ_INTR_REG = 0; + __osRdbWriteOK++; + __osRestoreInt(mask); +} diff --git a/lib/ultralib/src/os/testhost.c b/lib/ultralib/src/os/testhost.c new file mode 100644 index 0000000..c134317 --- /dev/null +++ b/lib/ultralib/src/os/testhost.c @@ -0,0 +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/thread.c b/lib/ultralib/src/os/thread.c new file mode 100644 index 0000000..9a4a141 --- /dev/null +++ b/lib/ultralib/src/os/thread.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "osint.h" + +struct __osThreadTail __osThreadTail = { NULL, -1 }; +OSThread* __osRunQueue = (OSThread*)&__osThreadTail; +OSThread* __osActiveQueue = (OSThread*)&__osThreadTail; +OSThread* __osRunningThread = { 0 }; +OSThread* __osFaultedThread = { 0 }; + +void __osDequeueThread(register OSThread** queue, register OSThread* t) { + register OSThread* pred; + register OSThread* succ; + + pred = (OSThread*)queue; + succ = pred->next; + + while (succ != NULL) { + if (succ == t) { + pred->next = t->next; +#ifdef _DEBUG + t->next = NULL; +#endif + return; + } + pred = succ; + succ = pred->next; + } +} diff --git a/lib/ultralib/src/os/threadasm.h b/lib/ultralib/src/os/threadasm.h new file mode 100644 index 0000000..dfd91b6 --- /dev/null +++ b/lib/ultralib/src/os/threadasm.h @@ -0,0 +1,68 @@ +#ifndef _THREADASM_H_ +#define _THREADASM_H_ + +/* Offsets of members in the OSThread struct */ +#define THREAD_NEXT 0 +#define THREAD_PRI 4 +#define THREAD_QUEUE 8 +#define THREAD_TLNEXT 12 +#define THREAD_STATE 16 +#define THREAD_FLAGS 18 +#define THREAD_ID 20 +#define THREAD_FP 24 +#define THREAD_GP1 32 +#define THREAD_GP2 40 +#define THREAD_GP3 48 +#define THREAD_GP4 56 +#define THREAD_GP5 64 +#define THREAD_GP6 72 +#define THREAD_GP7 80 +#define THREAD_GP8 88 +#define THREAD_GP9 96 +#define THREAD_GP10 104 +#define THREAD_GP11 112 +#define THREAD_GP12 120 +#define THREAD_GP13 128 +#define THREAD_GP14 136 +#define THREAD_GP15 144 +#define THREAD_GP16 152 +#define THREAD_GP17 160 +#define THREAD_GP18 168 +#define THREAD_GP19 176 +#define THREAD_GP20 184 +#define THREAD_GP21 192 +#define THREAD_GP22 200 +#define THREAD_GP23 208 +#define THREAD_GP24 216 +#define THREAD_GP25 224 +/* k0 and k1 are reserved for the kernel */ +#define THREAD_GP28 232 +#define THREAD_GP29 240 +#define THREAD_GP30 248 +#define THREAD_GP31 256 +#define THREAD_LO 264 +#define THREAD_HI 272 +#define THREAD_SR 280 +#define THREAD_PC 284 +#define THREAD_CAUSE 288 +#define THREAD_BADVADDR 292 +#define THREAD_RCP 296 +#define THREAD_FPCSR 300 +#define THREAD_FP0 304 +#define THREAD_FP2 312 +#define THREAD_FP4 320 +#define THREAD_FP6 328 +#define THREAD_FP8 336 +#define THREAD_FP10 344 +#define THREAD_FP12 352 +#define THREAD_FP14 360 +#define THREAD_FP16 368 +#define THREAD_FP18 376 +#define THREAD_FP20 384 +#define THREAD_FP22 392 +#define THREAD_FP24 400 +#define THREAD_FP26 408 +#define THREAD_FP28 416 +#define THREAD_FP30 424 + +#endif diff --git a/lib/ultralib/src/os/timerintr.c b/lib/ultralib/src/os/timerintr.c new file mode 100644 index 0000000..10dae50 --- /dev/null +++ b/lib/ultralib/src/os/timerintr.c @@ -0,0 +1,141 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "osint.h" + +OSTime __osCurrentTime; +u32 __osBaseCounter; +u32 __osViIntrCount; +u32 __osTimerCounter; +OSTimer __osBaseTimer; +OSTimer* __osTimerList = &__osBaseTimer; + +#ifndef _FINALROM +OSMesgQueue __osProfTimerQ ALIGNED(8); +OSProf* __osProfileList; +OSProf* __osProfileListEnd; +u32 __osProfileOverflowBin; +#endif + +void __osTimerServicesInit(void) { + __osCurrentTime = 0; + __osBaseCounter = 0; + __osViIntrCount = 0; + __osTimerList->next = __osTimerList->prev = __osTimerList; + __osTimerList->interval = __osTimerList->value = 0; + __osTimerList->mq = NULL; + __osTimerList->msg = 0; +} + +void __osTimerInterrupt(void) { + OSTimer* t; + u32 count; + u32 elapsed_cycles; + +#ifndef _FINALROM + u32 pc; + s32 offset; + OSProf* prof = __osProfileList; +#endif + + if (__osTimerList->next == __osTimerList) { + return; + } + for (;;) { + t = __osTimerList->next; + + if (t == __osTimerList) { + __osSetCompare(0); + __osTimerCounter = 0; + break; + } + + count = osGetCount(); + elapsed_cycles = count - __osTimerCounter; + __osTimerCounter = count; + + if (elapsed_cycles < t->value) { + t->value -= elapsed_cycles; + __osSetTimerIntr(t->value); + break; + } + + t->prev->next = t->next; + t->next->prev = t->prev; + t->next = NULL; + t->prev = NULL; + + if (t->mq != NULL) { +#ifdef _FINALROM + osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK); + } +#else + if (t->mq != &__osProfTimerQ) { + osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK); + } else { + pc = __osRunQueue->context.pc; + for (prof = __osProfileList; prof < __osProfileListEnd; prof++) { + offset = pc - (u32)prof->text_start; + + if (offset >= 0) { + if ((s32)prof->text_end - (s32)pc > 0) { + (*(u16*)(u32)((offset >> 2) + prof->histo_base))++; + goto __ProfDone; + } + } + } + + __osProfileOverflowBin++; + } + } +#endif + + __ProfDone: + + if (t->interval != 0) { + t->value = t->interval; + __osInsertTimer(t); + } + } +} + +void __osSetTimerIntr(OSTime tim) { + OSTime NewTime; + u32 savedMask; + +#if BUILD_VERSION >= VERSION_K + if (tim < 468) { + tim = 468; + } +#endif + + savedMask = __osDisableInt(); + __osTimerCounter = osGetCount(); + NewTime = __osTimerCounter + tim; + __osSetCompare(NewTime); + __osRestoreInt(savedMask); +} + +OSTime __osInsertTimer(OSTimer* t) { + OSTimer* timep; + OSTime tim; + u32 savedMask = __osDisableInt(); + + timep = __osTimerList->next; + tim = t->value; + for (; timep != __osTimerList && tim > timep->value; timep = timep->next) { + tim -= timep->value; + } + + t->value = tim; + + if (timep != __osTimerList) { + timep->value -= tim; + } + + t->next = timep; + t->prev = timep->prev; + timep->prev->next = t; + timep->prev = t; + __osRestoreInt(savedMask); + return tim; +} diff --git a/lib/ultralib/src/os/unmaptlb.s b/lib/ultralib/src/os/unmaptlb.s new file mode 100644 index 0000000..362fd1e --- /dev/null +++ b/lib/ultralib/src/os/unmaptlb.s @@ -0,0 +1,45 @@ +#include "PR/ultraerror.h" +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osUnmapTLB) +#if defined (_DEBUG) && defined (__sgi) + bgez a0, 1f + nop + b 2f + nop +1: + li t0, 0x1F +.set noat + slt AT, a0, t0 + bnez AT, 3f + nop +.set at +2: + move a2, a0 + li a0, ERR_OSUNMAPTLB + li a1, 1 + j __osError + nop +3: +#endif + mfc0 t0, C0_ENTRYHI + mtc0 a0, C0_INX + li t1, K0BASE + mtc0 t1, C0_ENTRYHI + mtc0 zero, C0_ENTRYLO0 + mtc0 zero, C0_ENTRYLO1 + nop + tlbwi + nop + nop + nop + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osUnmapTLB) + diff --git a/lib/ultralib/src/os/unmaptlball.s b/lib/ultralib/src/os/unmaptlball.s new file mode 100644 index 0000000..6d4b264 --- /dev/null +++ b/lib/ultralib/src/os/unmaptlball.s @@ -0,0 +1,26 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osUnmapTLBAll) + mfc0 t0, C0_ENTRYHI + li t1, NTLBENTRIES-1 /* last reserved for rdb */ + li t2, KUSIZE + mtc0 t2, C0_ENTRYHI + mtc0 zero, C0_ENTRYLO0 + mtc0 zero, C0_ENTRYLO1 +1: + mtc0 t1, C0_INX + nop + tlbwi + nop + nop + addi t1, t1,-1 + bgez t1, 1b + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osUnmapTLBAll) diff --git a/lib/ultralib/src/os/virtualtophysical.c b/lib/ultralib/src/os/virtualtophysical.c new file mode 100644 index 0000000..553fe68 --- /dev/null +++ b/lib/ultralib/src/os/virtualtophysical.c @@ -0,0 +1,13 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "osint.h" + +u32 osVirtualToPhysical(void* addr) { + if (IS_KSEG0(addr)) { + return K0_TO_PHYS(addr); + } else if (IS_KSEG1(addr)) { + return K1_TO_PHYS(addr); + } else { + return __osProbeTLB(addr); + } +} diff --git a/lib/ultralib/src/os/writebackdcache.s b/lib/ultralib/src/os/writebackdcache.s new file mode 100644 index 0000000..5f5b485 --- /dev/null +++ b/lib/ultralib/src/os/writebackdcache.s @@ -0,0 +1,35 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osWritebackDCache) + blez a1, 2f + li t3, DCACHE_SIZE + bgeu a1,t3, 3f + move t0, a0 + addu t1, a0,a1 + bgeu t0, t1, 2f + addiu t1, t1, -DCACHE_LINESIZE + andi t2, t0, DCACHE_LINEMASK + subu t0, t0,t2 +1: + .set noreorder + cache (C_HWB|CACH_PD), (t0) + bltu t0, t1, 1b + addiu t0, t0, DCACHE_LINESIZE + .set reorder +2: + jr ra +3: + li t0, KUSIZE + addu t1, t0,t3 + addiu t1, t1, -DCACHE_LINESIZE +4: + .set noreorder + cache (C_IWBINV|CACH_PD), (t0) + bltu t0, t1, 4b + addiu t0, t0, DCACHE_LINESIZE + .set reorder + jr ra +END(osWritebackDCache) diff --git a/lib/ultralib/src/os/writebackdcacheall.s b/lib/ultralib/src/os/writebackdcacheall.s new file mode 100644 index 0000000..ee8df88 --- /dev/null +++ b/lib/ultralib/src/os/writebackdcacheall.s @@ -0,0 +1,18 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osWritebackDCacheAll) + li t0, KUSIZE + li t2, DCACHE_SIZE + addu t1, t0,t2 + addiu t1, t1, -DCACHE_LINESIZE +1: + .set noreorder + cache (C_IWBINV | CACH_PD), (t0) + bltu t0, t1, 1b + addiu t0, t0, DCACHE_LINESIZE + .set reorder + jr ra +END(osWritebackDCacheAll) diff --git a/src/libultra/os/yieldthread.c b/lib/ultralib/src/os/yieldthread.c similarity index 97% rename from src/libultra/os/yieldthread.c rename to lib/ultralib/src/os/yieldthread.c index f4ed7c5..9a4dafb 100644 --- a/src/libultra/os/yieldthread.c +++ b/lib/ultralib/src/os/yieldthread.c @@ -3,7 +3,7 @@ void osYieldThread(void) { register u32 saveMask = __osDisableInt(); - + __osRunningThread->state = OS_STATE_RUNNABLE; __osEnqueueAndYield(&__osRunQueue); __osRestoreInt(saveMask); diff --git a/lib/ultralib/src/rg/free.c b/lib/ultralib/src/rg/free.c new file mode 100644 index 0000000..c426000 --- /dev/null +++ b/lib/ultralib/src/rg/free.c @@ -0,0 +1,73 @@ +#include "PR/region.h" +#include "PR/R4300.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osFree(void* region, void* addr) { + register OSRegion* rp = region; + int i; + +#ifdef _DEBUG + assert((region != NULL) && (addr != NULL)); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSFREE_REGION, 1, region); + return; + } +#endif + + i = ((u8*)addr - rp->r_startBufferAddress) / rp->r_bufferSize; + +#ifdef _DEBUG + if ((i < 0) || (i >= rp->r_bufferCount)) { + __osError(ERR_OSFREE_ADDR, 2, addr, region); + return; + } + + if (((unsigned char*)addr - rp->r_startBufferAddress) % (rp->r_bufferSize) != 0) { + __osError(ERR_OSFREE_ADDR, 2, addr, region); + return; + } +#endif + *(u16*)(&rp->r_startBufferAddress[i * rp->r_bufferSize]) = rp->r_freeList; + rp->r_freeList = i; +} diff --git a/lib/ultralib/src/rg/getbufcount.c b/lib/ultralib/src/rg/getbufcount.c new file mode 100644 index 0000000..d4deeba --- /dev/null +++ b/lib/ultralib/src/rg/getbufcount.c @@ -0,0 +1,57 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osGetRegionBufCount(void* region) { + register OSRegion* rp = region; + +#ifdef _DEBUG + assert(rp != NULL); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSGETREGIONBUFCOUNT, 1, region); + return 0; + } +#endif + return rp->r_bufferCount; +} diff --git a/lib/ultralib/src/rg/getsize.c b/lib/ultralib/src/rg/getsize.c new file mode 100644 index 0000000..2b1fb90 --- /dev/null +++ b/lib/ultralib/src/rg/getsize.c @@ -0,0 +1,57 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osGetRegionBufSize(void* region) { + register OSRegion* rp = region; + +#ifdef _DEBUG + assert(rp != NULL); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSGETREGIONBUFSIZE, 1, region); + return 0; + } +#endif + + return rp->r_bufferSize; +} diff --git a/lib/ultralib/src/rg/malloc.c b/lib/ultralib/src/rg/malloc.c new file mode 100644 index 0000000..59c0399 --- /dev/null +++ b/lib/ultralib/src/rg/malloc.c @@ -0,0 +1,70 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void* osMalloc(void* region) { + register OSRegion* rp = region; + char* addr; + +#ifdef _DEBUG + assert(rp != NULL); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSMALLOC, 1, region); + return NULL; + } +#endif + + if (rp->r_freeList == MAX_BUFCOUNT) { + return NULL; + } + + addr = &rp->r_startBufferAddress[rp->r_freeList * rp->r_bufferSize]; + rp->r_freeList = *(u16*)addr; + return addr; +} diff --git a/lib/ultralib/src/rg/printregion.c b/lib/ultralib/src/rg/printregion.c new file mode 100644 index 0000000..6db8f18 --- /dev/null +++ b/lib/ultralib/src/rg/printregion.c @@ -0,0 +1,27 @@ +#include "os_version.h" +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "../os/osint.h" +#include "PR/rmon.h" +#include "PR/region.h" + +void __osPrintRegion(void* region) { + register OSRegion* rp = region; + int i; + + rmonPrintf("Region = 0x%x\n", rp); + rmonPrintf("\tstartBufferAddress = 0x%x\n", RP(startBufferAddress)); + rmonPrintf("\tendAddress = 0x%x\n", RP(endAddress)); + rmonPrintf("\tbufferSize = %d\n", RP(bufferSize)); + rmonPrintf("\tbufferCount = %d\n", RP(bufferCount)); + rmonPrintf("\tfreeList = %d\n", RP(freeList)); + rmonPrintf("\talignSize = %d\n", RP(alignSize)); + rmonPrintf("\tMemory Header Layout:\n"); + + for (i = 0; i < RP(bufferCount); i++) { + rmonPrintf("\tBuf[%d]:\tAddress: 0x%x Value: 0x%x\n", i, RP(startBufferAddress) + i * RP(bufferSize), + *(u16*)(RP(startBufferAddress) + i * RP(bufferSize))); + } +} + +#endif diff --git a/lib/ultralib/src/rg/region.c b/lib/ultralib/src/rg/region.c new file mode 100644 index 0000000..377ec9e --- /dev/null +++ b/lib/ultralib/src/rg/region.c @@ -0,0 +1,232 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "os_internal_error.h" +#include "assert.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void* osCreateRegion(void* startAddress, u32 length, u32 bufferSize, u32 alignSize) { + register OSRegion* rp; + register int i; + register char* addr; + + assert(startAddress != NULL); + +#ifdef _DEBUG + if ((alignSize != 0) && (alignSize != OS_RG_ALIGN_2B) && (alignSize != OS_RG_ALIGN_4B) && + (alignSize != OS_RG_ALIGN_8B) && (alignSize != OS_RG_ALIGN_16B)) { + __osError(ERR_OSCREATEREGION_ALIGN, 1, alignSize); + return 0; + } +#endif + + if (alignSize == 0) { + alignSize = OS_RG_ALIGN_DEFAULT; + } + + rp = (OSRegion*)ALIGN(startAddress, alignSize); + length = length - ((s32)rp - (s32)startAddress); + rp->r_bufferSize = ALIGN(bufferSize, alignSize); + rp->r_bufferCount = (s32)(length - ALIGN(sizeof(OSRegion), alignSize)) / rp->r_bufferSize; + +#ifdef _DEBUG + if (rp->r_bufferCount <= 0) { + __osError(ERR_OSCREATEREGION_SIZE, 2, length, bufferSize); + return 0; + } +#endif + + if (rp->r_bufferCount > MAX_BUFCOUNT) { + rp->r_bufferCount = MAX_BUFCOUNT; + } + + rp->r_startBufferAddress = (u8*)rp + ALIGN(sizeof(OSRegion), alignSize); + rp->r_endAddress = (u8*)rp + length; + addr = rp->r_startBufferAddress; + + for (i = 0; i < rp->r_bufferCount - 1; i++) { + *((s16*)(&addr[i * rp->r_bufferSize])) = i + 1; + } + + *((u16*)(&addr[i * rp->r_bufferSize])) = BUF_FREE_WO_NEXT; + rp->r_alignSize = alignSize; + rp->r_freeList = 0; + return rp; +} diff --git a/lib/ultralib/src/rmon/rmonbrk.c b/lib/ultralib/src/rmon/rmonbrk.c new file mode 100644 index 0000000..0eb3242 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonbrk.c @@ -0,0 +1,432 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "dbgproto.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "rmonint.h" + +#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 + +typedef struct { + TVushort type; + TVushort response; + TVid threadID; + void* pc; +} TVExceptionReplyMsg; + +typedef struct { + u32* breakAddress; + u32 oldInstruction; +} BREAKINFO; + +/* first breakpoint is reserved for implementing single-stepping */ +static BREAKINFO breakpoints[NUM_BREAKPOINTS] ALIGNED(8); +/* breakpoint for alternate branch target */ +static BREAKINFO altBreak; + +static BREAKINFO RCPbreakpoints[NUM_BREAKPOINTS] ALIGNED(8); + +u8 __rmonRcpAtBreak; + +static void rmonFindFaultedThreads(void); + +static void SetTempBreakpoint(u32* addr1, u32* addr2) { + STUBBED_PRINTF(("Set temp BP at %08x", addr1)); + if (addr2 != NULL) { + STUBBED_PRINTF((" and %08x", addr2)); + } + STUBBED_PRINTF(("\n")); + + /* Save the word at the target address to be restored later */ + breakpoints[TMP_BP].oldInstruction = *addr1; + /* Install a break instruction at the target address */ + *addr1 = MIPS_BREAK(16); + osWritebackDCache(addr1, sizeof(*addr1)); + osInvalICache(addr1, sizeof(*addr1)); + breakpoints[TMP_BP].breakAddress = addr1; + + /* Also do so for an alt address if required */ + if (addr2 != NULL) { + altBreak.oldInstruction = *addr2; + *addr2 = MIPS_BREAK(16); + osWritebackDCache(addr2, sizeof(*addr2)); + osInvalICache(addr2, sizeof(*addr2)); + altBreak.breakAddress = addr2; + } +} + +static void ClearTempBreakpoint(void) { + u32 inst; + + if (breakpoints[TMP_BP].breakAddress != NULL) { + inst = *breakpoints[TMP_BP].breakAddress; + + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + STUBBED_PRINTF(("ClearTempBreak @ %08x\n", breakpoints[TMP_BP].breakAddress)); + + /* After confirming that there is a break instruction with code at the target + address, restore the original contents of the word at the target address */ + *breakpoints[TMP_BP].breakAddress = breakpoints[TMP_BP].oldInstruction; + osWritebackDCache(breakpoints[TMP_BP].breakAddress, sizeof(*breakpoints[TMP_BP].breakAddress)); + osInvalICache(breakpoints[TMP_BP].breakAddress, sizeof(*breakpoints[TMP_BP].breakAddress)); + } + breakpoints[TMP_BP].breakAddress = NULL; + } + + /* Same as above for the alt breakpoint */ + if (altBreak.breakAddress != NULL) { + inst = *altBreak.breakAddress; + + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + STUBBED_PRINTF(("ClearTempBreak @ %08x\n", altBreak.breakAddress)); + + *altBreak.breakAddress = altBreak.oldInstruction; + osWritebackDCache(altBreak.breakAddress, sizeof(*altBreak.breakAddress)); + osInvalICache(altBreak.breakAddress, sizeof(*altBreak.breakAddress)); + } + altBreak.breakAddress = NULL; + } +} + +int __rmonSetBreak(KKHeader* req) { + register KKSetBkptRequest* request = (KKSetBkptRequest*)req; + register BREAKINFO* breakBase; + register BREAKINFO* whichBreak; + register BREAKINFO* lastBreak; + KKBkptEvent reply; + + STUBBED_PRINTF(("SetBreak at %08x, method %d\n", request->addr, req->method)); + + /* Select breakpoint list */ + if (req->method == RMON_RSP) { + breakBase = RCPbreakpoints; + whichBreak = &RCPbreakpoints[1]; + lastBreak = &RCPbreakpoints[NUM_BREAKPOINTS]; + } else { + breakBase = breakpoints; + whichBreak = &breakpoints[1]; + lastBreak = &breakpoints[NUM_BREAKPOINTS]; + } + + /* Find breakpoint slot */ + for (; whichBreak < lastBreak; whichBreak++) { + if (whichBreak->breakAddress != NULL) { + if (whichBreak->breakAddress == (u32*)request->addr) { + /* Breakpoint already set here */ + break; + } + continue; + } else { + /* Empty slot */ + break; + } + } + + /* No breakpoints available */ + if (whichBreak == lastBreak) { + return TV_ERROR_NO_MORE_IDS; + } + + /* Set breakpoint if not already set */ + if (whichBreak->breakAddress == NULL) { + if (req->method == RMON_RSP) { + whichBreak->oldInstruction = __rmonReadWordAt((u32*)request->addr); + __rmonWriteWordTo((u32*)request->addr, MIPS_BREAK((whichBreak - breakBase) + NUM_BREAKPOINTS)); + } else { + whichBreak->oldInstruction = *(u32*)request->addr; + *(u32*)request->addr = MIPS_BREAK((whichBreak - breakBase) + NUM_BREAKPOINTS); + osWritebackDCache((void*)request->addr, sizeof(whichBreak->oldInstruction)); + osInvalICache((void*)request->addr, sizeof(whichBreak->oldInstruction)); + } + whichBreak->breakAddress = (u32*)request->addr; + STUBBED_PRINTF(("* (%08x) = %08x (was %08x)\n", whichBreak->breakAddress, *whichBreak->breakAddress, + whichBreak->oldInstruction)); + } + + /* Send reply */ + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->object; + reply.bp = whichBreak - breakBase; + reply.instruction = whichBreak->oldInstruction; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonListBreak(KKHeader* request UNUSED) { + STUBBED_PRINTF(("ListBreak\n")); + + return TV_ERROR_ILLEGAL_CALL; +} + +int __rmonClearBreak(KKHeader* req) { + register KKClrBkptRequest* request = (KKClrBkptRequest*)req; + register BREAKINFO* whichBreak; + KKBkptEvent reply; + u32 inst; + + STUBBED_PRINTF(("ClearBreak\n")); + + /* Check valid breakpoint index */ + if (request->bp >= NUM_BREAKPOINTS) { + return TV_ERROR_INVALID_ID; + } + + /* Clear the breakpoint, restore whatever was there before */ + if (req->method == RMON_RSP) { + whichBreak = &RCPbreakpoints[request->bp]; + + if (whichBreak->breakAddress == NULL) { + return TV_ERROR_INVALID_ID; + } + + inst = __rmonReadWordAt(whichBreak->breakAddress); + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + __rmonWriteWordTo(whichBreak->breakAddress, whichBreak->oldInstruction); + } + } else { + whichBreak = &breakpoints[request->bp]; + + if (whichBreak->breakAddress == NULL) { + return TV_ERROR_INVALID_ID; + } + + inst = *whichBreak->breakAddress; + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + *whichBreak->breakAddress = whichBreak->oldInstruction; + osWritebackDCache(whichBreak->breakAddress, sizeof(*whichBreak->breakAddress)); + osInvalICache(whichBreak->breakAddress, sizeof(*whichBreak->breakAddress)); + } + } + whichBreak->breakAddress = NULL; + + /* Send reply */ + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->object; + reply.bp = request->bp; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +u32 __rmonGetBranchTarget(int method, int thread, char* addr) { + int inst; + + if (method == RMON_RSP) { + inst = __rmonReadWordAt((u32*)addr); + } else { + inst = *(u32*)addr; + } + + switch ((inst >> 26) & 0x3F) { + case 0: /* SPECIAL */ + if (((inst >> 5) & 0x7FFF) == 0 && (inst & 0x3F) == 8) { + /* JR */ + return __rmonGetRegisterContents(method, thread, (inst >> 21) & 0x1F); + } + if (((inst >> 16) & 0x1F) == 0 && (inst & 0x7FF) == 9) { + /* JALR */ + return __rmonGetRegisterContents(method, thread, (inst >> 21) & 0x1F); + } + break; + case 1: /* REGIMM */ + switch ((inst >> 16) & 0x1F) { + case 0: /* BLTZ */ + case 1: /* BGEZ */ + case 2: /* BLTZL */ + case 3: /* BGEZL */ + case 16: /* BLTZAL */ + case 17: /* BGEZAL */ + case 18: /* BLTZALL */ + case 19: /* BGEZALL */ + return (((inst << 0x10) >> 0xE) + addr + 4); + } + break; + case 2: /* J */ + case 3: /* JAL */ + return (((u32)inst << 6) >> 4) + (((s32)((u32)addr + 4) >> 0x1C) << 0x1C); + case 4: /* BEQ */ + case 5: /* BNE */ + case 20: /* BEQL */ + case 21: /* BNEL */ + return (((inst << 0x10) >> 0xE) + addr + 4); + case 6: /* BLEZ */ + case 7: /* BGTZ */ + case 22: /* BLEZL */ + case 23: /* BGTZL */ + if (((inst >> 16) & 0x1F) == 0) { + return (((inst << 0x10) >> 0xE) + addr + 4); + } + break; + case 16: /* COP0 */ + case 17: /* COP1 */ + case 18: /* COP2 */ + case 19: /* COP3 */ + if (((inst >> 21) & 0x1F) == 8) { + switch ((inst >> 16) & 0x1F) { + case 0: /* BCzF */ + case 1: /* BCzT */ + case 2: /* BCzFL */ + case 3: /* BCzTL */ + return (((inst << 0x10) >> 0xE) + addr + 4); + } + } + break; + } + return -1; +} + +static int IsJump(u32 inst) { + switch ((inst >> 26) & 0x3F) { + case 0: /* SPECIAL */ + if (((inst >> 5) & 0x7FFF) == 0 && (inst & 0x3F) == 8) { + /* JR */ + return TRUE; + } + if (((inst >> 16) & 0x1F) == 0 && (inst & 0x7FF) == 9) { + /* JALR */ + return TRUE; + } + break; + case 2: /* J */ + case 3: /* JAL */ + return TRUE; + } + return FALSE; +} + +int __rmonSetSingleStep(int thread, u32* instptr) { + u32 branchTarget = __rmonGetBranchTarget(RMON_CPU, thread, (void*)instptr); + + STUBBED_PRINTF(("SingleStep\n")); + + if ((branchTarget & 3) != 0) { + /* no branch target, set breakpoint at next pc */ + SetTempBreakpoint(instptr + 1, NULL); + } else if (branchTarget == (u32)instptr) { + /* branch target is this instruction, can't single step here */ + return FALSE; + } else if (IsJump(*instptr) || branchTarget == (u32)(instptr + 2)) { + /* unconditional branch, set at branch target */ + SetTempBreakpoint((u32*)branchTarget, NULL); + } else { + /* set two breakpoints for handling conditional branches */ + SetTempBreakpoint((u32*)branchTarget, instptr + 2); + } + return TRUE; +} + +void __rmonGetExceptionStatus(KKStatusEvent* reply) { + reply->status.flags = OS_STATE_STOPPED; + reply->status.why = 2; + reply->status.what = 0; + reply->status.rv = 0; + reply->status.info.major = 2; + reply->status.info.minor = 4; + reply->header.code = KK_CODE_THREAD_STATUS; + reply->header.error = TV_ERROR_NO_ERROR; + reply->header.length = sizeof(*reply); +} + +#define FAULT_BREAKNUM (NUM_BREAKPOINTS - 1) + +static void rmonSendBreakMessage(s32 whichThread, int breakNumber) { + KKStatusEvent reply; + + STUBBED_PRINTF(("Break %d in thread %d\n", breakNumber, whichThread)); + + /* Build thread exception status */ + __rmonGetThreadStatus(RMON_CPU, (whichThread != 0) ? whichThread : RMON_TID_NOTHREAD, &reply); + __rmonGetExceptionStatus(&reply); + + if (breakNumber == FAULT_BREAKNUM) { + /* Hit fault */ + reply.status.info.major = 1; + reply.status.info.minor = 2; + } + if (breakNumber < NUM_BREAKPOINTS) { + breakNumber = 0; + } else { + breakNumber -= NUM_BREAKPOINTS; + } + if (breakNumber != 0) { + /* Break not set by debugger, or set during single-step */ + reply.status.instr = MIPS_BREAK_OPCODE; + } + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_EXCEPTION); +} + +void __rmonHitBreak(void) { + STUBBED_PRINTF(("HitBreak\n")); + + /* Stop all user threads and report faulted threads */ + ClearTempBreakpoint(); + __rmonStopUserThreads(0); + rmonFindFaultedThreads(); +} + +void __rmonHitSpBreak(void) { + KKStatusEvent exceptionReply; + + STUBBED_PRINTF(("Hit SP Break\n")); + + /* Rewind RSP PC by one instruction to return to the location of the break instruction */ + __rmonWriteWordTo((u32*)SP_PC_REG, __rmonReadWordAt((u32*)SP_PC_REG) - 4); + + /* Report RSP break event */ + __rmonGetThreadStatus(RMON_RSP, RMON_TID_RSP, &exceptionReply); + __rmonGetExceptionStatus(&exceptionReply); + __rmonSendReply(&exceptionReply.header, sizeof(exceptionReply), KK_TYPE_EXCEPTION); + __rmonRcpAtBreak = TRUE; +} + +void __rmonHitCpuFault(void) { + STUBBED_PRINTF(("HitCpuFault\n")); + + /* Stop all user threads and report faulted threads */ + __rmonMaskIdleThreadInts(); + __rmonStopUserThreads(0); + rmonFindFaultedThreads(); +} + +static void rmonFindFaultedThreads(void) { + register OSThread* tptr = __osGetActiveQueue(); + + while (tptr->priority != -1) { + if (tptr->priority > OS_PRIORITY_IDLE && tptr->priority <= OS_PRIORITY_APPMAX) { + if (tptr->flags & OS_FLAG_CPU_BREAK) { + int inst = *(u32*)tptr->context.pc; + + STUBBED_PRINTF(("Brk in thread %d @ %08x, inst %08x\r\n", tptr->id, tptr->context.pc, inst)); + + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + rmonSendBreakMessage(tptr->id, inst >> 6); + } else { + rmonSendBreakMessage(tptr->id, 0); + } + } + if (tptr->flags & OS_FLAG_FAULT) { + __rmonSendFault(tptr); + rmonSendBreakMessage(tptr->id, FAULT_BREAKNUM); + } + } + tptr = tptr->tlnext; + } +} + +#endif diff --git a/lib/ultralib/src/rmon/rmoncmds.c b/lib/ultralib/src/rmon/rmoncmds.c new file mode 100644 index 0000000..88600a6 --- /dev/null +++ b/lib/ultralib/src/rmon/rmoncmds.c @@ -0,0 +1,54 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "rmonint.h" + +#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; +} + +static FUNPTR dispatchTable[] = { + __rmonLoadProgram, __rmonListProcesses, __rmonGetExeName, __rmonListThreads, __rmonThreadStatus, + NotImplemented, __rmonStopThread, __rmonRunThread, NotImplemented, NotImplemented, + __rmonSetFault, NotImplemented, __rmonGetRegionCount, __rmonGetRegions, __rmonGetGRegisters, + __rmonSetGRegisters, __rmonGetFRegisters, __rmonSetFRegisters, __rmonReadMem, __rmonWriteMem, + __rmonSetBreak, __rmonClearBreak, __rmonListBreak, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + __rmonSetComm, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, __rmonGetSRegs, + __rmonSetSRegs, __rmonGetVRegs, __rmonSetVRegs, NotImplemented, +}; + +int __rmonExecute(KKHeader* request) { + int retval; + KKHeader reply; + + if (request->code >= ARRLEN(dispatchTable) - 1) { + return TV_ERROR_ILLEGAL_CALL; + } + + retval = dispatchTable[(int)request->code](request); + if (retval < TV_ERROR_NO_ERROR) { + reply.code = request->code; + reply.error = retval; + __rmonSendReply(&reply, sizeof(reply), KK_TYPE_REPLY); + } + return retval; +} + +#endif diff --git a/lib/ultralib/src/rmon/rmonint.h b/lib/ultralib/src/rmon/rmonint.h new file mode 100644 index 0000000..59ad736 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonint.h @@ -0,0 +1,169 @@ +#ifndef _RMONINT_H +#define _RMONINT_H + +#include "dbgproto.h" +#include "PR/os_internal.h" + +/* mips */ + +#define MIPS_LWC2_OPCODE 50 +#define MIPS_SWC2_OPCODE 58 + +#define MIPS_LW_OPCODE 35 +#define MIPS_SW_OPCODE 43 + +#define MIPS_BREAK_OPCODE 0xD +#define MIPS_BREAK_MASK 0xFC00003F + +#define MIPS_BREAK(code) \ + ((((code) & 0xFFFFF) << 6) | MIPS_BREAK_OPCODE) + +/* R4300 General Purpose Register Indices */ +#define GREG_IDX_ZERO 0 +#define GREG_IDX_AT 1 +#define GREG_IDX_T9 25 +#define GREG_IDX_K0 26 +#define GREG_IDX_GP 28 +#define GREG_IDX_RA 31 +#define GREG_IDX_LO 32 +#define GREG_IDX_HI 33 +#define GREG_IDX_CAUSE 34 +#define GREG_IDX_PC 35 +#define GREG_IDX_SR 36 + +/* RSP Scalar Register Indices */ +#define SREG_IDX_ZERO 0 +#define SREG_IDX_RA 31 +#define SREG_IDX_DRAM_ADDR (32 + 0) +#define SREG_IDX_MEM_ADDR (32 + 1) +#define SREG_IDX_RD_LEN (32 + 2) +#define SREG_IDX_PC (32 + 3) +#define SREG_IDX_WR_LEN (32 + 4) +#define SREG_IDX_STATUS (32 + 5) +#define SREG_IDX_DMA_FULL (32 + 6) +#define SREG_IDX_DMA_BUSY (32 + 7) + +/* RSP Vector Register Properties */ +#define VREG_NUM 32 +#define VREG_SIZE 0x10 + +/* rmon */ + +#define RMON_MESG_CPU_BREAK 2 +#define RMON_MESG_SP_BREAK 4 +#define RMON_MESG_FAULT 8 + +#define RMON_CPU 0 +#define RMON_RSP 1 + +/* "thread id" for rsp */ +#define RMON_TID_RSP 1000 +/* "thread priority" for rsp */ +#define RMON_PRI_RSP 42 + +/* "thread id" for no thread running */ +#define RMON_TID_NOTHREAD 1003 + +#define RMON_PID_CPU 1002 +#define RMON_PID_RSP 1001 + +/* Largest serviceable read/write memory request */ +#define RMON_MAX_XFER_SIZE 1024 + +/* rmonmain */ + +void __rmonSendHeader(KKHeader* const block, u32 blockSize, u32 type); +void __rmonSendReply(KKHeader* const block, u32 blockSize, u32 replyType); +void __rmonSendData(char* const block, unsigned int blockSize); + +extern int __rmonActive; + +/* rmonmisc */ + +void __rmonInit(void); +void __rmonPanic(void); + +extern OSMesgQueue __rmonMQ; + +/* rmonmem */ + +void __rmonWriteWordTo(u32* addr, u32 val); +u32 __rmonReadWordAt(u32* addr); +void __rmonMemcpy(u8* dest, u8* srce, u32 count); +void __rmonCopyWords(u32* dest, u32* srce, u32 count); + +extern u8 __rmonUtilityBuffer[]; + +/* rmonsio */ + +void __rmonSendFault(OSThread* thread); +void __rmonIOflush(void); +void __rmonIOputw(u32 word); +void __rmonIOhandler(void); + +extern void* __osRdb_DbgRead_Buf; +extern u8 rmonRdbReadBuf[]; + +/* rmonrcp */ + +int __rmonRCPrunning(void); +void __rmonIdleRCP(void); +void __rmonStepRCP(void); +void __rmonRunRCP(void); + +/* rmonbrk */ + +u32 __rmonGetBranchTarget(int method, int thread, char* addr); +int __rmonSetSingleStep(int thread, u32* instptr); +void __rmonGetExceptionStatus(KKStatusEvent* reply); +void __rmonHitBreak(void); +void __rmonHitSpBreak(void); +void __rmonHitCpuFault(void); + +extern u8 __rmonRcpAtBreak; + +/* rmonregs */ + +u32 __rmonGetRegisterContents(int method, int threadNumber, int regNumber); + +/* rmontask */ + +void __rmonMaskIdleThreadInts(void); +OSThread* __rmonGetTCB(int threadNumber); +int __rmonStopUserThreads(int whichThread); +int __rmonGetThreadStatus(int method, int id, KKStatusEvent* reply); + +/* rmoncmds */ + +int __rmonExecute(KKHeader* request); + +/* commands */ + +typedef int (*FUNPTR)(); + +int __rmonLoadProgram(KKHeader* req); +int __rmonListProcesses(KKHeader* req); +int __rmonGetExeName(KKHeader* req); +int __rmonListThreads(KKHeader* req); +int __rmonThreadStatus(KKHeader* req); +int __rmonStopThread(KKHeader* req); +int __rmonRunThread(KKHeader* req); +int __rmonSetFault(KKHeader* req); +int __rmonGetRegionCount(KKHeader* req); +int __rmonGetRegions(KKHeader* req); +int __rmonGetGRegisters(KKHeader* req); +int __rmonSetGRegisters(KKHeader* req); +int __rmonGetFRegisters(KKHeader* req); +int __rmonSetFRegisters(KKHeader* req); +int __rmonReadMem(KKHeader* req); +int __rmonWriteMem(KKHeader* req); +int __rmonSetBreak(KKHeader* req); +int __rmonClearBreak(KKHeader* req); +int __rmonListBreak(KKHeader* req); +int __rmonSetComm(KKHeader* req); +int __rmonGetSRegs(KKHeader* req); +int __rmonSetSRegs(KKHeader* req); +int __rmonGetVRegs(KKHeader* req); +int __rmonSetVRegs(KKHeader* req); + +#endif diff --git a/lib/ultralib/src/rmon/rmonmain.c b/lib/ultralib/src/rmon/rmonmain.c new file mode 100644 index 0000000..564ac44 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonmain.c @@ -0,0 +1,138 @@ +#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" +#include "PR/os_internal.h" +#include "rmonint.h" +#include "PR/rcp.h" +#include "sptask.h" +#include "PR/rdb.h" + +#include "macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +int __rmonActive = FALSE; + +static vu32 somethingToDo; +static u32 inbuffer[280] ALIGNED(0x10); +static u8 cmdinptr; +static u8 cmdoutptr; +static int state; +static char* inPointer; + +void __rmonSendHeader(KKHeader* const block, u32 blockSize, u32 type) { + int sent; + char* cPtr = (char*)block; + + block->rev = KK_REV; + block->type = type; + + sent = 0; + while (sent < blockSize) { + sent += __osRdbSend(cPtr + sent, blockSize - sent, RDB_TYPE_GtoH_DEBUG); + } +} + +void __rmonSendReply(KKHeader* const block, u32 blockSize, u32 replyType) { + char* cPtr; + int sent = 0; + + block->length = blockSize; + cPtr = (char*)&blockSize; + + /* send size */ + while (sent < (signed)sizeof(blockSize)) { + sent += __osRdbSend(cPtr + sent, sizeof(blockSize) - sent, RDB_TYPE_GtoH_DEBUG); + } + + /* send data */ + __rmonSendHeader(block, blockSize, replyType); + __rmonIOflush(); +} + +void __rmonSendData(char* const block, unsigned int blockSize) { + int* blockPointer = (int*)block; + unsigned int wordCount = (u32)(blockSize + 3) / 4; + u32 data; + union { + char bufBytes[4]; + u32 bufWord; + } buffer; + + if (((u32)block & 3) == 0) { + while (wordCount--) { + if ((u32)blockPointer >= SP_DMEM_START && (u32)blockPointer < 0x05000000) { + __osSpRawReadIo((u32)blockPointer++, &data); + __rmonIOputw(data); + } else { + __rmonIOputw(*(blockPointer++)); + } + } + } else + while (wordCount--) { + __rmonMemcpy((u8*)buffer.bufBytes, (u8*)blockPointer, sizeof(buffer)); + __rmonIOputw(buffer.bufWord); + blockPointer++; + } + __rmonIOflush(); +} + +void rmonMain(void) { + register int newChars UNUSED; + + STUBBED_PRINTF(("rmon: Thread %d created\n")); + STUBBED_PRINTF(("rmon: Thread %d destroyed\n")); + + somethingToDo = 0; + cmdoutptr = 0; + cmdinptr = 0; + + __rmonInit(); + __rmonActive = TRUE; + + + state = 0, newChars = 0, inPointer = (void*)&inbuffer; + for (;;) { + OSMesg work; + + osRecvMesg(&__rmonMQ, &work, OS_MESG_BLOCK); + + somethingToDo |= (u32)work; + + if (somethingToDo & RMON_MESG_CPU_BREAK) { + somethingToDo &= ~RMON_MESG_CPU_BREAK; + __rmonHitBreak(); + } + if (somethingToDo & RMON_MESG_SP_BREAK) { + somethingToDo &= ~RMON_MESG_SP_BREAK; + __rmonHitSpBreak(); + } + if (somethingToDo & RMON_MESG_FAULT) { + somethingToDo &= ~RMON_MESG_FAULT; + __rmonHitCpuFault(); + } + if (somethingToDo & 0x10) { + somethingToDo; + somethingToDo &= (u8)~0x10; + } + if (somethingToDo & 0x20) { + somethingToDo; + somethingToDo &= (u8)~0x20; + } + } +} + +#endif diff --git a/lib/ultralib/src/rmon/rmonmem.c b/lib/ultralib/src/rmon/rmonmem.c new file mode 100644 index 0000000..a11051b --- /dev/null +++ b/lib/ultralib/src/rmon/rmonmem.c @@ -0,0 +1,283 @@ +#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" +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "rmonint.h" +#include "PR/rdb.h" + +#include "macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +u8 __rmonUtilityBuffer[256] ALIGNED(8); + +void __rmonWriteWordTo(u32* addr, u32 val) { + while (__osSpRawWriteIo((u32)addr, val) != 0) { + ; + } +} + +u32 __rmonReadWordAt(u32* addr) { + u32 data; + + if ((u32)addr >= SP_DMEM_START && (u32)addr < 0x05000000) { + __osSpRawReadIo((u32)addr, &data); + return data; + } + return 0; +} + +void __rmonMemcpy(u8* dest, u8* srce, u32 count) { + while (count--) { + *dest++ = *srce++; + } +} + +void __rmonCopyWords(u32* dest, u32* srce, u32 count) { + while (count--) { + *dest++ = *srce++; + } +} + +static void strcpy(char* dest, char* srce) { + while ((*dest++ = *srce++)) { + ; + } +} + +int __rmonReadMem(KKHeader* req) { + char* cPtr; + int sent; + int dataSize; + KKReadRequest* request = (KKReadRequest*)req; + KKBufferEvent* reply = (KKBufferEvent*)__rmonUtilityBuffer; + u8* blockStart; + + STUBBED_PRINTF(("ReadMem @ %08x for %d\n", request->addr, request->nbytes)); + + reply->header.code = request->header.code; + reply->object = request->object; + reply->header.error = TV_ERROR_NO_ERROR; + + if (request->addr == (u32)-1) { + return TV_ERROR_INVALID_ADDRESS; + } + if (request->nbytes > RMON_MAX_XFER_SIZE) { + return TV_ERROR_INVALID_CAPABILITY; + } + + if (req->method == RMON_RSP) { + if (!((request->addr < SP_IMEM_START || (request->addr + request->nbytes) > SP_IMEM_END) ? FALSE : TRUE) && + !((request->addr < SP_DMEM_START || (request->addr + request->nbytes) > SP_DMEM_END) ? FALSE : TRUE)) { + return TV_ERROR_INVALID_ADDRESS; + } + } else if (osVirtualToPhysical((void*)request->addr) == (u32)-1) { + return TV_ERROR_INVALID_ADDRESS; + } + + blockStart = (u8*)request->addr; + reply->header.length = request->nbytes + sizeof(reply->header) + sizeof(reply->object); + dataSize = request->nbytes + sizeof(reply->header) + sizeof(reply->object); + + cPtr = (char*)&dataSize; + sent = 0; + while (sent < (signed)sizeof(dataSize)) { + sent += __osRdbSend(cPtr + sent, sizeof(dataSize) - sent, RDB_TYPE_GtoH_DEBUG); + } + + __rmonSendHeader(&reply->header, sizeof(reply->header) + sizeof(reply->object), KK_TYPE_REPLY); + __rmonSendData(blockStart, request->nbytes); + return TV_ERROR_NO_ERROR; +} + +int __rmonWriteMem(KKHeader* req) { + register KKWriteRequest* request = (KKWriteRequest*)req; + KKObjectEvent reply; + + STUBBED_PRINTF(("WriteMem\n")); + + /* Bad virtual address, abort */ + if (req->method == RMON_CPU && osVirtualToPhysical((u32*)request->writeHeader.addr) == (u32)-1) { + return TV_ERROR_INVALID_ADDRESS; + } + + /* Transfer size too large, abort */ + if (request->writeHeader.nbytes > RMON_MAX_XFER_SIZE) { + return TV_ERROR_INVALID_CAPABILITY; + } + + if (((request->writeHeader.addr < SP_DMEM_START || + (request->writeHeader.addr + request->writeHeader.nbytes) > 0x04FFFFFF) ? FALSE : TRUE)) { + int align; + u32 word; + + if ((align = request->writeHeader.addr & 3) != 0) { + STUBBED_PRINTF(("Long unaligned write...\n")); + + if (request->writeHeader.nbytes != 1) { + return TV_ERROR_INVALID_ADDRESS; + } + + /* Unaligned write; read the word, substitute in the written byte, write it back */ + word = __rmonReadWordAt((u32*)(request->writeHeader.addr & ~3)); + if (align == 1) { + word = (word & ~0xFF0000) | (request->buffer[0] << 0x10); + } else if (align == 2) { + word = (word & ~0xFF00) | (request->buffer[0] << 8); + } else { + word = (word & ~0xFF) | (request->buffer[0] << 0); + } + __rmonWriteWordTo((u32*)(request->writeHeader.addr & ~3), word); + } else { + int wordCount = request->writeHeader.nbytes / sizeof(u32); + u32* wordPointer = (u32*)request->buffer; + + if (request->writeHeader.nbytes % sizeof(u32) != 0) { + STUBBED_PRINTF(("RCP write not an integral number of words\n")); + return TV_ERROR_INVALID_ADDRESS; + } + + while (wordCount--) { + __rmonWriteWordTo((u32*)request->writeHeader.addr, *(wordPointer++)); + request->writeHeader.addr += sizeof(*wordPointer); + } + } + } else { + __rmonMemcpy((u8*)request->writeHeader.addr, (u8*)request->buffer, request->writeHeader.nbytes); + } + + reply.header.code = request->writeHeader.header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->writeHeader.object; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +int __rmonListProcesses(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKObjsEvent reply; + + STUBBED_PRINTF(("ListProcesses\n")); + + reply.object = 0; + reply.objs.number = 1; + reply.objs.objects[0] = (req->method == RMON_RSP) ? RMON_PID_RSP : RMON_PID_CPU; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonLoadProgram(KKHeader* request UNUSED) { + STUBBED_PRINTF(("LoadProgram\n")); + + return TV_ERROR_ILLEGAL_CALL; +} + +int __rmonGetExeName(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKBufferEvent* reply = (KKBufferEvent*)__rmonUtilityBuffer; + + STUBBED_PRINTF(("GetExeName\n")); + + reply->header.code = request->header.code; + reply->header.error = TV_ERROR_NO_ERROR; + reply->object = request->object; + + if (req->method == RMON_RSP) { + strcpy(reply->buffer, "imem"); + } else { + strcpy(reply->buffer, "rmon"); + } + __rmonSendReply(&reply->header, sizeof(reply->header) + sizeof(reply->object) + 8, KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +int __rmonGetRegionCount(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKNumberEvent reply; + + STUBBED_PRINTF(("GetRegionCount\n")); + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->object; + + reply.number = (req->method == RMON_RSP) ? 2 : 5; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +int __rmonGetRegions(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKRegionEvent* reply = (KKRegionEvent*)__rmonUtilityBuffer; + int numRegions; + + STUBBED_PRINTF(("GetRegions\n")); + + numRegions = (req->method == RMON_RSP) ? 2 : 6; + + reply->header.length = numRegions * sizeof(reply->regions[0]) + sizeof(*reply); + reply->header.code = request->header.code; + reply->header.error = TV_ERROR_NO_ERROR; + reply->object = request->object; + reply->number = numRegions; + + reply->regions[1].vaddr = SP_IMEM_START; + reply->regions[1].size = SP_IMEM_END + 1 - SP_IMEM_START; + reply->regions[1].flags = 1 | 2 | 4; + reply->regions[1].paddr = SP_IMEM_START; + + reply->regions[0].vaddr = SP_DMEM_START; + reply->regions[0].size = SP_DMEM_END + 1 - SP_DMEM_START; + reply->regions[0].flags = 1 | 2; + reply->regions[0].paddr = SP_DMEM_START; + + if (numRegions > 2) { + reply->regions[2].vaddr = 0x88200000; + reply->regions[2].size = 0x6130; + reply->regions[2].flags = 1 | 4; + reply->regions[2].paddr = 0; + + reply->regions[3].vaddr = 4; + reply->regions[3].size = 0x200000; + reply->regions[3].flags = 1 | 2; + reply->regions[3].paddr = 0; + + reply->regions[4].vaddr = 0x4002000; + reply->regions[4].size = 0x800000; + reply->regions[4].flags = 1 | 2; + reply->regions[4].paddr = 0; + + reply->regions[5].vaddr = 0x88206130; + reply->regions[5].size = 0x9000; + reply->regions[5].flags = 1 | 2; + reply->regions[5].paddr = 0; + } + + __rmonSendReply(&reply->header, reply->header.length, KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +#endif diff --git a/lib/ultralib/src/rmon/rmonmisc.c b/lib/ultralib/src/rmon/rmonmisc.c new file mode 100644 index 0000000..a1aa96c --- /dev/null +++ b/lib/ultralib/src/rmon/rmonmisc.c @@ -0,0 +1,76 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "rmonint.h" + +#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; + KKObjectEvent reply; + + STUBBED_PRINTF(("SetFault\n")); + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->tid; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +OSMesgQueue __rmonMQ ALIGNED(8); +static OSThread rmonIOThread ALIGNED(8); +static OSMesg rmonMsgs[8] ALIGNED(8); +static u64 rmonIOStack[2048] ALIGNED(16); +static OSMesg rmonPiMsgs[8] ALIGNED(8); +static OSMesgQueue rmonPiMQ ALIGNED(8); + +void __rmonInit(void) { + osCreateMesgQueue(&__rmonMQ, rmonMsgs, ARRLEN(rmonMsgs)); + osSetEventMesg(OS_EVENT_CPU_BREAK, &__rmonMQ, (OSMesg)RMON_MESG_CPU_BREAK); + osSetEventMesg(OS_EVENT_SP_BREAK, &__rmonMQ, (OSMesg)RMON_MESG_SP_BREAK); + osSetEventMesg(OS_EVENT_FAULT, &__rmonMQ, (OSMesg)RMON_MESG_FAULT); + osSetEventMesg(OS_EVENT_THREADSTATUS, &__rmonMQ, NULL); + osCreateThread(&rmonIOThread, 0, (void (*)(void*))__rmonIOhandler, NULL, rmonIOStack + ARRLEN(rmonIOStack), + OS_PRIORITY_MAX); + osCreatePiManager(OS_PRIORITY_PIMGR, &rmonPiMQ, rmonPiMsgs, ARRLEN(rmonPiMsgs)); + osStartThread(&rmonIOThread); +} + +void __rmonPanic(void) { + STUBBED_PRINTF(("PANIC!!\n")); + + for (;;) { + ; + } +} + +int __rmonSetComm(KKHeader* req) { + KKObjectEvent reply; + + STUBBED_PRINTF(("SetComm\n")); + + reply.header.code = req->code; + reply.object = 0; + reply.header.error = TV_ERROR_NO_ERROR; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +#endif diff --git a/lib/ultralib/src/rmon/rmonprint.c b/lib/ultralib/src/rmon/rmonprint.c new file mode 100644 index 0000000..8ac91a5 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonprint.c @@ -0,0 +1 @@ +/* Empty file */ diff --git a/lib/ultralib/src/rmon/rmonrcp.s b/lib/ultralib/src/rmon/rmonrcp.s new file mode 100644 index 0000000..539f41d --- /dev/null +++ b/lib/ultralib/src/rmon/rmonrcp.s @@ -0,0 +1,60 @@ +#include "PR/os_version.h" +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/rcp.h" +#include "PR/R4300.h" + +.text + +/* check if the rsp is currently running by polling HALT or BROKE bits in SP_STATUS */ +LEAF(__rmonRCPrunning) + move v0, zero + lw t0, PHYS_TO_K1(SP_STATUS_REG) + and t0, SP_STATUS_HALT | SP_STATUS_BROKE + bnez t0, isHalted + ori v0, 1 +isHalted: + jr ra +END(__rmonRCPrunning) + +/* stop the rsp, first wait for any ongoing dma to complete before setting HALT in SP_STATUS */ +LEAF(__rmonIdleRCP) + li a0, PHYS_TO_K1(SP_DMA_BUSY_REG) +wait4dma: + lw v0, (a0) + bnez v0, wait4dma + li a1, SP_CLR_INTR_BREAK | SP_SET_HALT + li a0, PHYS_TO_K1(SP_STATUS_REG) + sw a1, (a0) + +/* wait for the rsp to stop */ +awaitIdle: + li a0, PHYS_TO_K1(SP_STATUS_REG) + lw v0, (a0) + and v0, SP_STATUS_HALT | SP_STATUS_BROKE + beqz v0, awaitIdle + jr ra +END(__rmonIdleRCP) + +/* run the rsp in single-step mode to step one instruction */ +LEAF(__rmonStepRCP) + li a0, PHYS_TO_K1(SP_STATUS_REG) + li a1, SP_CLR_INTR_BREAK | SP_SET_SSTEP | SP_CLR_BROKE | SP_CLR_HALT + sw a1, (a0) + b awaitIdle +END(__rmonStepRCP) + +/* run the rsp normally */ +LEAF(__rmonRunRCP) + li a0, PHYS_TO_K1(MI_INTR_MASK_REG) + li a1, MI_INTR_MASK_SET_SP + sw a1, (a0) + li a0, PHYS_TO_K1(SP_STATUS_REG) + li a1, SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT + sw a1, (a0) + jr ra +END(__rmonRunRCP) + +#endif diff --git a/lib/ultralib/src/rmon/rmonregs.c b/lib/ultralib/src/rmon/rmonregs.c new file mode 100644 index 0000000..39cf5b2 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonregs.c @@ -0,0 +1,417 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "PR/os_internal.h" +#include "PR/rcp.h" +#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; +static u32 DMEMbuffer[4] ALIGNED(8); + +typedef union { + u32 everything; + struct { + int opcode : 6; + int base : 5; + int rt : 5; + int offset : 16; + } scalarop; + struct { + int opcode : 6; + int base : 5; + int rt : 5; + int size : 5; + int element : 4; + int offset : 7; + } vectorop; +} INSTRUCTION; + +static void LoadStoreSU(int opcode, int regno) { + INSTRUCTION inst; + + /* Prepare a scalar load or store instruction at DMEM address 0 */ + inst.everything = 0; + inst.scalarop.opcode = opcode; + inst.scalarop.rt = regno; + __rmonWriteWordTo((u32*)SP_IMEM_START, inst.everything); + __rmonWriteWordTo((u32*)SP_PC_REG, 0); +} + +static void LoadStoreVU(int opcode, int regno) { + INSTRUCTION inst; + + /* Prepare a vector 128-bit load or store instruction at DMEM address 0 */ + inst.everything = 0; + inst.vectorop.opcode = opcode; + inst.vectorop.rt = regno; + inst.vectorop.size = 4; /* LQV / SQV */ + __rmonWriteWordTo((u32*)SP_IMEM_START, inst.everything); + __rmonWriteWordTo((u32*)SP_PC_REG, 0); +} + +static void SetUpForRCPop(int isVector) { + /* Save RSP data that would be overwritten when reading or writing registers */ + RCPpc = __rmonReadWordAt((u32*)SP_PC_REG); + oldIMEMvalue = __rmonReadWordAt((u32*)SP_IMEM_START); + DMEMbuffer[0] = __rmonReadWordAt((u32*)SP_DMEM_START); + if (isVector) { + DMEMbuffer[1] = __rmonReadWordAt((u32*)(SP_DMEM_START + 0x4)); + DMEMbuffer[2] = __rmonReadWordAt((u32*)(SP_DMEM_START + 0x8)); + DMEMbuffer[3] = __rmonReadWordAt((u32*)(SP_DMEM_START + 0xC)); + } +} + +static void CleanupFromRCPop(int isVector) { + /* Restore RSP data that was saved to read or write registers */ + __rmonWriteWordTo((u32*)SP_DMEM_START, DMEMbuffer[0]); + if (isVector) { + __rmonWriteWordTo((u32*)(SP_DMEM_START + 0x4), DMEMbuffer[1]); + __rmonWriteWordTo((u32*)(SP_DMEM_START + 0x8), DMEMbuffer[2]); + /* BUG: the last word is not restored properly */ + __rmonWriteWordTo((u32*)(SP_DMEM_START + 0xC), DMEMbuffer[2]); + } + __rmonWriteWordTo((u32*)SP_IMEM_START, oldIMEMvalue); + __rmonWriteWordTo((u32*)SP_PC_REG, RCPpc); +} + +int __rmonGetGRegisters(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKGregEvent reply; + + STUBBED_PRINTF(("GetGRegisters\n")); + + reply.tid = request->object; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + + if (request->header.method == RMON_CPU) { + OSThread* tptr = __rmonGetTCB(request->object); + u64* tcbregptr; + register s32 i; + + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + for (i = GREG_IDX_AT, tcbregptr = &tptr->context.at; i < GREG_IDX_K0; i++, tcbregptr++) { + reply.registers.gregs[i] = *tcbregptr; + } + for (i = GREG_IDX_GP, tcbregptr = &tptr->context.gp; i < GREG_IDX_CAUSE; i++, tcbregptr++) { + reply.registers.gregs[i] = *tcbregptr; + } + + reply.registers.gregs[GREG_IDX_CAUSE] = tptr->context.cause; + reply.registers.gregs[GREG_IDX_PC] = tptr->context.pc; + reply.registers.gregs[GREG_IDX_SR] = tptr->context.sr; + reply.registers.gregs[GREG_IDX_ZERO] = 0; + } else { + return TV_ERROR_INVALID_ID; + } + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonSetGRegisters(KKHeader* req) { + register KKGRegsetRequest* request = (KKGRegsetRequest*)req; + KKObjectEvent reply; + + STUBBED_PRINTF(("SetGRegisters\n")); + + if (request->header.method == RMON_CPU) { + OSThread* tptr = __rmonGetTCB(request->tid); + u64* tcbregptr; + register int i; + + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + for (i = GREG_IDX_AT, tcbregptr = &tptr->context.at; i < GREG_IDX_K0; i++, tcbregptr++) { + *tcbregptr = (s32)request->registers.gregs[i]; + } + + for (i = GREG_IDX_GP, tcbregptr = &tptr->context.gp; i < GREG_IDX_CAUSE; i++, tcbregptr++) { + *tcbregptr = (s32)request->registers.gregs[i]; + } + + tptr->context.cause = request->registers.gregs[GREG_IDX_CAUSE]; + tptr->context.pc = request->registers.gregs[GREG_IDX_PC]; + tptr->context.sr = request->registers.gregs[GREG_IDX_SR]; + } else { + return TV_ERROR_INVALID_ID; + } + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonGetFRegisters(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKFPregEvent reply; + OSThread* tptr; + volatile float f UNUSED; + + STUBBED_PRINTF(("GetFRegisters\n")); + + if (req->method != RMON_CPU) { + return TV_ERROR_INVALID_ID; + } + + /* touch fpu to ensure registers are saved to the context structure */ + f = 0.0f; + + tptr = __rmonGetTCB(request->object); + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + __rmonCopyWords((u32*)reply.registers.fpregs.regs, (u32*)&tptr->context.fp0, ARRLEN(reply.registers.fpregs.regs)); + + reply.registers.fpcsr = tptr->context.fpcsr; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.tid = request->object; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonSetFRegisters(KKHeader* req) { + register KKFPRegsetRequest* request = (KKFPRegsetRequest*)req; + KKObjectEvent reply; + OSThread* tptr; + volatile float f UNUSED; + + STUBBED_PRINTF(("SetFRegisters\n")); + + if (req->method != RMON_CPU) { + return TV_ERROR_INVALID_ID; + } + + /* touch fpu to ensure registers are saved to the context structure */ + f = 0.0f; + + tptr = __rmonGetTCB(request->tid); + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + __rmonCopyWords((u32*)&tptr->context.fp0, (u32*)request->registers.fpregs.regs, + ARRLEN(request->registers.fpregs.regs)); + tptr->context.fpcsr = request->registers.fpcsr; + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +static u32 rmonGetRcpRegister(int regNumber) { + u32 contents; + + if (__rmonRCPrunning()) { + return 0; + } + + SetUpForRCPop(FALSE); + LoadStoreSU(MIPS_SW_OPCODE, regNumber); + __rmonStepRCP(); + contents = __rmonReadWordAt((u32*)SP_DMEM_START); + CleanupFromRCPop(FALSE); + + return contents; +} + +int __rmonGetSRegs(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKCpSregEvent reply; + register int i; + + STUBBED_PRINTF(("GetSRegisters\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + reply.tid = request->object; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + + SetUpForRCPop(FALSE); + for (i = SREG_IDX_ZERO; i <= SREG_IDX_RA; i++) { + LoadStoreSU(MIPS_SW_OPCODE, i); + __rmonStepRCP(); + reply.registers.sregs[i] = __rmonReadWordAt((u32*)SP_DMEM_START); + } + CleanupFromRCPop(FALSE); + + reply.registers.sregs[SREG_IDX_DRAM_ADDR] = __rmonReadWordAt((u32*)SP_DRAM_ADDR_REG); + reply.registers.sregs[SREG_IDX_MEM_ADDR] = __rmonReadWordAt((u32*)SP_MEM_ADDR_REG); + reply.registers.sregs[SREG_IDX_RD_LEN] = __rmonReadWordAt((u32*)SP_RD_LEN_REG); + reply.registers.sregs[SREG_IDX_PC] = __rmonReadWordAt((u32*)SP_PC_REG) + SP_IMEM_START; + reply.registers.sregs[SREG_IDX_WR_LEN] = __rmonReadWordAt((u32*)SP_WR_LEN_REG); + reply.registers.sregs[SREG_IDX_STATUS] = __rmonReadWordAt((u32*)SP_STATUS_REG); + reply.registers.sregs[SREG_IDX_DMA_FULL] = __rmonReadWordAt((u32*)SP_DMA_FULL_REG); + reply.registers.sregs[SREG_IDX_DMA_BUSY] = __rmonReadWordAt((u32*)SP_DMA_BUSY_REG); + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonSetSRegs(KKHeader* req) { + register KKCpScalarRegsetRequest* request = (KKCpScalarRegsetRequest*)req; + KKObjectEvent reply; + register int i; + + STUBBED_PRINTF(("SetSRegisters\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + SetUpForRCPop(FALSE); + for (i = SREG_IDX_ZERO; i <= SREG_IDX_RA; i++) { + __rmonWriteWordTo((u32*)SP_DMEM_START, request->registers.sregs[i]); + LoadStoreSU(MIPS_LW_OPCODE, i); + __rmonStepRCP(); + } + CleanupFromRCPop(FALSE); + + __rmonWriteWordTo((u32*)SP_DRAM_ADDR_REG, request->registers.sregs[SREG_IDX_DRAM_ADDR]); + __rmonWriteWordTo((u32*)SP_MEM_ADDR_REG, request->registers.sregs[SREG_IDX_MEM_ADDR]); + __rmonWriteWordTo((u32*)SP_PC_REG, request->registers.sregs[SREG_IDX_PC] & 0xFFF); + __rmonWriteWordTo((u32*)SP_WR_LEN_REG, request->registers.sregs[SREG_IDX_WR_LEN]); + __rmonWriteWordTo((u32*)SP_STATUS_REG, request->registers.sregs[SREG_IDX_STATUS]); + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonGetVRegs(KKHeader* req) { + char* cPtr; + int sent; + int dataSize; + register KKObjectRequest* request = (KKObjectRequest*)req; + KKCpVregEvent reply; + register int i; + + STUBBED_PRINTF(("GetVRegisters\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + reply.tid = request->object; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.header.length = sizeof(reply); + + dataSize = sizeof(reply); + cPtr = (char*)&dataSize; + sent = 0; + while (sent < (signed)sizeof(dataSize)) { + sent += __osRdbSend(cPtr + sent, sizeof(dataSize) - sent, RDB_TYPE_GtoH_DEBUG); + } + + __rmonSendHeader(&reply.header, VREG_SIZE, KK_TYPE_REPLY); + + SetUpForRCPop(TRUE); + for (i = 0; i < VREG_NUM; i++) { + LoadStoreVU(MIPS_SWC2_OPCODE, i); + __rmonStepRCP(); + __rmonSendData((void*)SP_DMEM_START, VREG_SIZE); + } + CleanupFromRCPop(TRUE); + + return TV_ERROR_NO_ERROR; +} + +int __rmonSetVRegs(KKHeader* req) { + register KKCpVectorRegsetRequest* request = (KKCpVectorRegsetRequest*)req; + KKObjectEvent reply; + register int i; + + STUBBED_PRINTF(("SetVRegs\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + SetUpForRCPop(TRUE); + for (i = 0; i < VREG_NUM; i++) { + __rmonCopyWords((u32*)SP_DMEM_START, (u32*)&request->registers.vregs[i], VREG_SIZE / sizeof(u32)); + LoadStoreVU(MIPS_LWC2_OPCODE, i); + __rmonStepRCP(); + } + CleanupFromRCPop(TRUE); + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +u32 __rmonGetRegisterContents(int method, int threadNumber, int regNumber) { + if (method == RMON_CPU) { + /* CPU register */ + u32* regPointer; + OSThread* tptr; + + if (regNumber >= GREG_IDX_AT && regNumber < GREG_IDX_K0) { + regNumber -= GREG_IDX_AT - GREG_IDX_ZERO; + } else if (regNumber >= GREG_IDX_GP && regNumber < GREG_IDX_LO) { + regNumber -= GREG_IDX_GP - GREG_IDX_T9; + } else { + return 0; + } + tptr = __rmonGetTCB(threadNumber); + if (tptr == NULL) { + return 0; + } + regPointer = (u32*)&tptr->context; + regPointer += regNumber; + return *regPointer; + } else { + /* RSP register */ + return rmonGetRcpRegister(regNumber); + } +} + +#endif diff --git a/lib/ultralib/src/rmon/rmonsio.c b/lib/ultralib/src/rmon/rmonsio.c new file mode 100644 index 0000000..3e45995 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonsio.c @@ -0,0 +1,89 @@ +#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" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PR/sptask.h" +#include "dbgproto.h" +#include "rmonint.h" +#include "PR/ramrom.h" +#include "PR/rdb.h" +#include "PR/rmon.h" + +#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; + +void* __osRdb_DbgRead_Buf; +u8 rmonRdbReadBuf[RMON_DBG_BUF_SIZE] ALIGNED(0x10); + +void __rmonSendFault(OSThread* thread) { + volatile float f UNUSED; + u8* tPtr; + u32 sent = 0; + + /* touch fpu to ensure registers are saved to the context structure */ + f = 0.0f; + + tPtr = (u8*)thread; + while (sent < sizeof(OSThread)) { + sent += __osRdbSend(tPtr + sent, sizeof(OSThread) - sent, RDB_TYPE_GtoH_FAULT); + } +} + +void __rmonIOflush(void) { + int sent = 0; + char tstr[4]; + + while (sent <= 0) { + sent += __osRdbSend(tstr, 1, RDB_TYPE_GtoH_DEBUG_DONE); + } +} + +void __rmonIOputw(u32 word) { + int sent = 0; + char* cPtr = (char*)&word; + + while (sent < 4) { + sent += __osRdbSend(cPtr + sent, sizeof(word) - sent, RDB_TYPE_GtoH_DEBUG); + } +} + +void __rmonIOhandler(void) { + int sent; + char tstr[4]; + + osCreateMesgQueue(&IOmq, &IOmsgs, 1); + osSetEventMesg(OS_EVENT_RDB_DBG_DONE, &IOmq, NULL); + __osRdb_DbgRead_Buf = rmonRdbReadBuf; + + while (TRUE) { + osRecvMesg(&IOmq, NULL, OS_MESG_BLOCK); + + __rmonExecute((KKHeader*)&rmonRdbReadBuf); + __osRdb_DbgRead_Buf = rmonRdbReadBuf; + + sent = 0; + while (sent <= 0) { + sent += __osRdbSend(tstr, 1, RDB_TYPE_GtoH_DEBUG_READY); + } + } +} + +#endif diff --git a/lib/ultralib/src/rmon/rmontask.c b/lib/ultralib/src/rmon/rmontask.c new file mode 100644 index 0000000..25757a7 --- /dev/null +++ b/lib/ultralib/src/rmon/rmontask.c @@ -0,0 +1,343 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "PR/os_internal.h" +#include "rmonint.h" +#include "PR/rcp.h" +#include "PR/sptask.h" + +#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(); + + while (tptr->priority != -1) { + if (tptr->priority == OS_PRIORITY_IDLE) { + tptr->context.sr &= ~OS_IM_CPU; + tptr->context.sr |= (OS_IM_RDBREAD | OS_IM_RDBWRITE | OS_IM_CART); + break; + } + tptr = tptr->tlnext; + } +} + +OSThread* __rmonGetTCB(int threadNumber) { + register OSThread* tptr = __osGetActiveQueue(); + + if (threadNumber < 1) { + return NULL; + } + + while (tptr->priority != -1) { + if (tptr->id == threadNumber) { + return tptr; + } + tptr = tptr->tlnext; + } + + return NULL; +} + +int __rmonStopUserThreads(int whichThread) { + register int whichOne = 0; + register OSThread* tptr = __osGetActiveQueue(); + + STUBBED_PRINTF(("StopThreads %d\n", whichThread)); + + if (whichThread != 0) { + /* Stop specified thread */ + + while (tptr->priority != -1) { + if (tptr->id == whichThread) { + break; + } + tptr = tptr->tlnext; + } + + if (tptr->priority == -1) { + return 0; + } + + if (tptr->priority > OS_PRIORITY_IDLE && tptr->priority <= OS_PRIORITY_APPMAX) { + osStopThread(tptr); + if (tptr->state != OS_STATE_STOPPED) { + STUBBED_PRINTF(("Couldn't stop thread %d\n", tptr->id)); + } + whichOne = whichThread; + } + } else { + /* Stop all threads */ + + while (tptr->priority != -1) { + if (tptr->priority > OS_PRIORITY_IDLE && tptr->priority <= OS_PRIORITY_APPMAX) { + osStopThread(tptr); + if (tptr->state != OS_STATE_STOPPED) { + STUBBED_PRINTF(("Couldn\'t stop thread %d\n", tptr->id)); + } + whichOne = -1; + } + tptr = tptr->tlnext; + } + } + return whichOne; +} + +int __rmonListThreads(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKObjsEvent* reply = (KKObjsEvent*)__rmonUtilityBuffer; + + STUBBED_PRINTF(("ListThreads\n")); + + reply->object = (request->object == -1) ? RMON_PID_CPU : request->object; + + if (req->method == RMON_RSP) { + reply->objs.number = 1; + reply->objs.objects[0] = RMON_TID_RSP; + } else { + register OSThread* tptr = __osGetActiveQueue(); + + reply->objs.number = 0; + + while (tptr->priority != -1) { + if (tptr->id != 0) { + reply->objs.objects[reply->objs.number] = tptr->id; + reply->objs.number++; + } + tptr = tptr->tlnext; + } + } + reply->header.code = request->header.code; + reply->header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply->header, sizeof(*reply) + sizeof(reply->objs.objects[0]) * (reply->objs.number - 1), + KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonGetThreadStatus(int method, int id, KKStatusEvent* reply) { + u32 inst; + + STUBBED_PRINTF(("ThreadStatus %d method %d\n", id, method)); + + reply->status.tid = id; + reply->status.pid = (method == RMON_RSP) ? RMON_PID_RSP : RMON_PID_CPU; + reply->status.why = 1; + reply->status.what = 0; + reply->status.info.major = 0; + reply->status.info.minor = 0; + reply->status.rv = 0; + + if (method == RMON_RSP) { + reply->status.start = SP_IMEM_START; + reply->status.priority = RMON_PRI_RSP; + + if (__rmonRCPrunning()) { + reply->status.flags = OS_STATE_RUNNING; + /* Cannot read RSP PC or current instruction while the RSP is running */ + reply->status.info.addr = 0; + reply->status.instr = 0; + } else { + reply->status.flags = OS_STATE_STOPPED; + reply->status.info.addr = __rmonReadWordAt((u32*)SP_PC_REG) + SP_IMEM_START; + inst = __rmonReadWordAt((u32*)reply->status.info.addr); + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + inst = MIPS_BREAK_OPCODE; + } + if (__rmonRcpAtBreak) { + /* Report RSP break */ + reply->status.why = 2; + reply->status.info.major = 2; + reply->status.info.minor = 4; + } + reply->status.instr = inst; + } + } else { + OSThread* tptr = __osGetActiveQueue(); + + while (tptr->priority != -1) { + if (tptr->id == id) { + break; + } + tptr = tptr->tlnext; + } + if (tptr->priority == -1) { + return TV_ERROR_INVALID_ID; + } + + reply->status.priority = tptr->priority; + reply->status.flags = (tptr->state != 0) ? tptr->state : OS_STATE_STOPPED; + reply->status.info.addr = tptr->context.pc; + + inst = *(u32*)(tptr->context.pc); + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + inst = MIPS_BREAK_OPCODE; + } + + reply->status.instr = inst; + reply->status.start = (int)tptr; + + if (tptr->flags & OS_FLAG_CPU_BREAK) { + /* Report break */ + reply->status.why = 2; + reply->status.info.major = 2; + reply->status.info.minor = 4; + } else if (tptr->flags & OS_FLAG_FAULT) { + /* Report fault */ + reply->status.why = 2; + reply->status.info.major = 1; + reply->status.info.minor = 2; + } + } + + return TV_ERROR_NO_ERROR; +} + +int __rmonThreadStatus(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKStatusEvent reply; + + if (__rmonGetThreadStatus(req->method, request->object, &reply) != TV_ERROR_NO_ERROR) { + return TV_ERROR_INVALID_ID; + } + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonStopThread(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKStatusEvent reply; + u32* pc; + + STUBBED_PRINTF(("StopThread %d\n", request->object)); + + switch (req->method) { + case RMON_CPU: + __rmonStopUserThreads(request->object); + break; + case RMON_RSP: + if (__rmonRCPrunning()) { + /* Stop the rsp */ + __rmonIdleRCP(); + pc = (u32*)__rmonReadWordAt((u32*)SP_PC_REG); + if (pc == NULL) { + break; + } + pc--; + /* Check if the RSP is stopped in a branch delay slot, if it is step out of it. The RSP would otherwise + lose information about whether the branch should or should not be taken when reading registers. */ + if (__rmonGetBranchTarget(RMON_RSP, RMON_TID_RSP, (void*)((u32)pc + SP_IMEM_START)) % 4 == 0) { + __rmonStepRCP(); + } + } + break; + default: + return TV_ERROR_OPERATIONS_PROTECTED; + } + + if (__rmonGetThreadStatus(req->method, request->object, &reply) != TV_ERROR_NO_ERROR) { + return TV_ERROR_INVALID_ID; + } + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + if (reply.status.flags == OS_STATE_STOPPED) { + reply.header.code = KK_CODE_THREAD_STATUS; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_EXCEPTION); + } + return TV_ERROR_NO_ERROR; +} + +int __rmonRunThread(KKHeader* req) { + KKRunThreadRequest* request = (KKRunThreadRequest*)req; + KKObjectEvent reply; + KKStatusEvent exceptionReply; + register OSThread* tptr; + register int runNeeded = FALSE; + + STUBBED_PRINTF(("RunThread %d\n", request->tid)); + + switch (req->method) { + case RMON_CPU: + tptr = __osGetActiveQueue(); + while (tptr->priority != -1) { + if (tptr->id == request->tid) { + break; + } + tptr = tptr->tlnext; + } + + if (tptr->priority == -1) { + return TV_ERROR_INVALID_ID; + } + if (tptr->state != OS_STATE_STOPPED) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + tptr->flags &= ~(OS_FLAG_CPU_BREAK | OS_FLAG_FAULT); + if (request->actions.flags & KK_RUN_SETPC) { + tptr->context.pc = request->actions.vaddr; + } + if ((request->actions.flags & KK_RUN_SSTEP) && !__rmonSetSingleStep(request->tid, (u32*)tptr->context.pc)) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + runNeeded = TRUE; + break; + case RMON_RSP: + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + if (request->actions.flags & KK_RUN_SETPC) { + __rmonWriteWordTo((u32*)SP_PC_REG, request->actions.vaddr - SP_IMEM_START); + } + if (request->actions.flags & KK_RUN_SSTEP) { + /* If the RSP is stopped at a branch step twice so as to not stop in a branch delay slot. */ + if (__rmonGetBranchTarget(RMON_RSP, RMON_TID_RSP, + (void*)(__rmonReadWordAt((u32*)SP_PC_REG) + SP_IMEM_START)) % + 4 == + 0) { + __rmonStepRCP(); + } + __rmonStepRCP(); + __rmonRcpAtBreak = TRUE; + } else { + __rmonRcpAtBreak = FALSE; + __rmonRunRCP(); + } + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->tid; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + if (request->actions.flags & KK_RUN_SSTEP) { + __rmonGetThreadStatus(RMON_RSP, RMON_TID_RSP, &exceptionReply); + __rmonGetExceptionStatus(&exceptionReply); + __rmonSendReply(&exceptionReply.header, sizeof(exceptionReply), KK_TYPE_EXCEPTION); + } + return TV_ERROR_NO_ERROR; + default: + return TV_ERROR_OPERATIONS_PROTECTED; + } + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->tid; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + if (runNeeded) { + osStartThread(tptr); + } + return 1; +} + +#endif diff --git a/lib/ultralib/src/sched/Makefile b/lib/ultralib/src/sched/Makefile new file mode 100644 index 0000000..d4cd659 --- /dev/null +++ b/lib/ultralib/src/sched/Makefile @@ -0,0 +1,19 @@ +#!smake +# +# Makefile for the scheduler subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = \ + sched.c + +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/ultralib/src/sched/sched.c b/lib/ultralib/src/sched/sched.c new file mode 100644 index 0000000..70ebf55 --- /dev/null +++ b/lib/ultralib/src/sched/sched.c @@ -0,0 +1,620 @@ +/*==================================================================== + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (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, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/* + * private typedefs and defines + */ +#define VIDEO_MSG 666 +#define RSP_DONE_MSG 667 +#define RDP_DONE_MSG 668 +#define PRE_NMI_MSG 669 + +/* + * OSScTask state + */ +#define OS_SC_DP 0x0001 /* set if still needs dp */ +#define OS_SC_SP 0x0002 /* set if still needs sp */ +#define OS_SC_YIELD 0x0010 /* set if yield requested */ +#define OS_SC_YIELDED 0x0020 /* set if yield completed */ + +/* + * OSScTask->flags type identifier + */ +#define OS_SC_XBUS (OS_SC_SP | OS_SC_DP) +#define OS_SC_DRAM (OS_SC_SP | OS_SC_DP | OS_SC_DRAM_DLIST) +#define OS_SC_DP_XBUS (OS_SC_SP) +#define OS_SC_DP_DRAM (OS_SC_SP | OS_SC_DRAM_DLIST) +#define OS_SC_SP_XBUS (OS_SC_DP) +#define OS_SC_SP_DRAM (OS_SC_DP | OS_SC_DRAM_DLIST) + +/* + * private functions + */ +static void __scMain(void *arg); +static void __scHandleRetrace(OSSched *s); +static void __scHandleRSP(OSSched *s); +static void __scHandleRDP(OSSched *s); + +static void __scAppendList(OSSched *s, OSScTask *t); +OSScTask *__scTaskReady(OSScTask *t); +static s32 __scTaskComplete(OSSched *s,OSScTask *t); +static void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); +static void __scYield(OSSched *s); +static s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, + s32 availRCP); + + +/* +#define SC_LOGGING 1 +*/ + + +#ifdef SC_LOGGING +#define SC_LOG_LEN 32*1024 +static OSLog scLog; +static OSLog *l = &scLog; +static u32 logArray[SC_LOG_LEN/sizeof(u32)]; +#endif + +/*********************************************************************** + * Scheduler API + **********************************************************************/ +void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, + u8 mode, u8 numFields) +{ + sc->curRSPTask = 0; + sc->curRDPTask = 0; + sc->clientList = 0; + sc->frameCount = 0; + sc->audioListHead = 0; + sc->gfxListHead = 0; + sc->audioListTail = 0; + sc->gfxListTail = 0; + sc->retraceMsg.type = OS_SC_RETRACE_MSG; /* sent to apps */ + sc->prenmiMsg.type = OS_SC_PRE_NMI_MSG; + + osCreateMesgQueue(&sc->interruptQ, sc->intBuf, OS_SC_MAX_MESGS); + osCreateMesgQueue(&sc->cmdQ, sc->cmdMsgBuf, OS_SC_MAX_MESGS); + + /* + * Set up video manager, listen for Video, RSP, and RDP interrupts + */ + osCreateViManager(OS_PRIORITY_VIMGR); + osViSetMode(&osViModeTable[mode]); + osViBlack(TRUE); + osSetEventMesg(OS_EVENT_SP, &sc->interruptQ, (OSMesg)RSP_DONE_MSG); + osSetEventMesg(OS_EVENT_DP, &sc->interruptQ, (OSMesg)RDP_DONE_MSG); + osSetEventMesg(OS_EVENT_PRENMI, &sc->interruptQ, (OSMesg)PRE_NMI_MSG); + + osViSetEvent(&sc->interruptQ, (OSMesg)VIDEO_MSG, numFields); + +#ifdef SC_LOGGING + osCreateLog(l, logArray, sizeof(logArray)); +#endif + + osCreateThread(&sc->thread, 4, __scMain, (void *)sc, stack, priority); + osStartThread(&sc->thread); +} + +/* + * Add a client to the scheduler. Clients receive messages at retrace time + */ +void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ) +{ + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + c->msgQ = msgQ; + c->next = sc->clientList; + sc->clientList = c; + + osSetIntMask(mask); +} + +void osScRemoveClient(OSSched *sc, OSScClient *c) +{ + OSScClient *client = sc->clientList; + OSScClient *prev = 0; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + while (client != 0) { + if (client == c) { + if(prev) + prev->next = c->next; + else + sc->clientList = c->next; + break; + } + prev = client; + client = client->next; + } + + osSetIntMask(mask); +} + +OSMesgQueue *osScGetCmdQ(OSSched *sc) +{ + return &sc->cmdQ; +} + +/*********************************************************************** + * Scheduler implementation + **********************************************************************/ +static void __scMain(void *arg) +{ + OSMesg msg; + OSSched *sc = (OSSched *)arg; + OSScClient *client; + static int count = 0; + + while (1) { + + osRecvMesg(&sc->interruptQ, (OSMesg *)&msg, OS_MESG_BLOCK); + +#ifdef SC_LOGGING + if (++count % 1024 == 0) + osFlushLog(l); +#endif + + + switch ((int) msg) { + case (VIDEO_MSG): + __scHandleRetrace(sc); + break; + + case (RSP_DONE_MSG): + __scHandleRSP(sc); + break; + + case (RDP_DONE_MSG): + __scHandleRDP(sc); + break; + + case (PRE_NMI_MSG): + /* + * notify audio and graphics threads to fade out + */ + for (client = sc->clientList;client != 0;client = client->next) { + osSendMesg(client->msgQ, (OSMesg) &sc->prenmiMsg, + OS_MESG_NOBLOCK); + } + break; + } + } +} + +/* + * scHandleRetrace() + */ +static int dp_busy = 0; +static int dpCount = 0; + +void __scHandleRetrace(OSSched *sc) +{ + OSScTask *rspTask; + OSScClient *client; + s32 i; + s32 state; + OSScTask *sp = 0; + OSScTask *dp = 0; + + sc->frameCount++; + +#ifdef SC_LOGGING + osLogEvent(l, 500, 4, sc->frameCount, sc->curRSPTask, sc->curRDPTask); +#endif + + /* + * Read the task command queue and schedule tasks + */ + while (osRecvMesg(&sc->cmdQ, (OSMesg *)&rspTask, OS_MESG_NOBLOCK) != -1) { + __scAppendList(sc, rspTask); + } + + if (sc->doAudio && sc->curRSPTask) { + /* + * Preempt the running gfx task. Note: if the RSP + * component of the graphics task has finished, but the + * RDP component is still running, we can start an audio + * task which will freeze the RDP (and save the RDP cmd + * FIFO) while the audio RSP code is running. + */ + __scYield(sc); + } else { + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if ( __scSchedule (sc, &sp, &dp, state) != state) + __scExec(sc, sp, dp); + } + + /* + * notify audio and graphics threads to start building the command + * lists for the next frame (client threads may choose not to + * build the list in overrun case) + */ + for (client = sc->clientList; client != 0; client = client->next) { + osSendMesg(client->msgQ, (OSMesg) &sc->retraceMsg, OS_MESG_NOBLOCK); + } +} + +/* + * __scHandleRSP is called when an RSP task signals that it has + * finished or yielded (at the hosts request) + */ +void __scHandleRSP(OSSched *sc) +{ + OSScTask *t, *sp = 0, *dp = 0; + s32 state; + + + assert(sc->curRSPTask); + + t = sc->curRSPTask; + sc->curRSPTask = 0; + +#ifdef SC_LOGGING + osLogEvent(l, 510, 3, t, t->state, t->flags); +#endif + + if ((t->state & OS_SC_YIELD) && osSpTaskYielded(&t->list)) { + t->state |= OS_SC_YIELDED; +#ifndef _FINALROM + t->totalTime += osGetTime() - t->startTime; +#endif + if ((t->flags & OS_SC_TYPE_MASK) == OS_SC_XBUS) { + /* push the task back on the list */ + t->next = sc->gfxListHead; + sc->gfxListHead = t; + if (sc->gfxListTail == 0) + sc->gfxListTail = t; + } + +#ifdef SC_LOGGING + osLogEvent(l, 521, 1, t); +#endif + + } else { + t->state &= ~OS_SC_NEEDS_RSP; + __scTaskComplete(sc, t); + } + + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if ( (__scSchedule (sc, &sp, &dp, state)) != state) + __scExec(sc, sp, dp); +} + +/* + * __scHandleRDP is called when an RDP task signals that it has + * finished + */ +void __scHandleRDP(OSSched *sc) +{ + OSScTask *t, *sp = 0, *dp = 0; + s32 state; + + assert(sc->curRDPTask); + assert(sc->curRDPTask->list.t.type == M_GFXTASK); + + t = sc->curRDPTask; + sc->curRDPTask = 0; + +#ifdef SC_LOGGING + osLogEvent(l, 515, 3, t, t->state, t->flags); +#endif + + t->state &= ~OS_SC_NEEDS_RDP; + + __scTaskComplete(sc, t); + + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if ( (__scSchedule (sc, &sp, &dp, state)) != state) + __scExec(sc, sp, dp); +} + +/* + * __scTaskReady checks to see if the graphics task is able to run + * based on the current state of the RCP. + */ +OSScTask *__scTaskReady(OSScTask *t) +{ + int rv = 0; + void *a; + void *b; + + if (t) { + /* + * If there is a pending swap bail out til later (next + * retrace). + */ + if ((a=osViGetCurrentFramebuffer()) != (b=osViGetNextFramebuffer())) { +#ifdef SC_LOGGING + osLogEvent(l, 513, 2, a, b); +#endif + return 0; + } + + return t; + } + + return 0; +} + +/* + * __scTaskComplete checks to see if the task is complete (all RCP + * operations have been performed) and sends the done message to the + * client if it is. + */ +s32 __scTaskComplete(OSSched *sc, OSScTask *t) +{ + int rv; + static int firsttime = 1; + + if ((t->state & OS_SC_RCP_MASK) == 0) { /* none of the needs bits set */ + + assert (t->msgQ); + +#ifndef _FINALROM + t->totalTime += osGetTime() - t->startTime; +#endif + +#ifdef SC_LOGGING + osLogEvent(l, 504, 1, t); +#endif + rv = osSendMesg(t->msgQ, t->msg, OS_MESG_BLOCK); + + if (t->list.t.type == M_GFXTASK) { + if ((t->flags & OS_SC_SWAPBUFFER) && (t->flags & OS_SC_LAST_TASK)){ + if (firsttime) { + osViBlack(FALSE); + firsttime = 0; + } + osViSwapBuffer(t->framebuffer); +#ifdef SC_LOGGING + osLogEvent(l, 525, 1, t->framebuffer); +#endif + } + } + return 1; + } + + return 0; +} + +/* + * Place task on either the audio or graphics queue + */ +void __scAppendList(OSSched *sc, OSScTask *t) +{ + long type = t->list.t.type; + + assert ( (type == M_AUDTASK) || (type == M_GFXTASK)); + + if (type == M_AUDTASK) { + if (sc->audioListTail) + sc->audioListTail->next = t; + else + sc->audioListHead = t; + + sc->audioListTail = t; + sc->doAudio = 1; +#ifdef SC_LOGGING + osLogEvent(l, 506, 1, t); +#endif + } else { + if (sc->gfxListTail) + sc->gfxListTail->next = t; + else + sc->gfxListHead = t; + + sc->gfxListTail = t; +#ifdef SC_LOGGING + osLogEvent(l, 507, 1, t); +#endif + } + + t->next = NULL; + t->state = t->flags & OS_SC_RCP_MASK; +} + +/* + * + */ +void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp) +{ + int rv; + +#ifdef SC_LOGGING + osLogEvent(l, 511, 2, sp, dp); +#endif + + assert(sc->curRSPTask == 0); + + if (sp) { + if (sp->list.t.type == M_AUDTASK) { + osWritebackDCacheAll(); /* flush the cache */ + } + + sp->state &= ~(OS_SC_YIELD | OS_SC_YIELDED); +#ifndef _FINALROM + sp->startTime = osGetTime(); +#endif + osSpTaskLoad(&sp->list); + osSpTaskStartGo(&sp->list); + sc->curRSPTask = sp; + if (sp == dp) + sc->curRDPTask = dp; + } + + if (dp && (dp != sp)) { + assert(dp->list.t.output_buff); + +#ifdef SC_LOGGING + osLogEvent(l, 523, 3, dp, dp->list.t.output_buff, + (u32)*dp->list.t.output_buff_size); +#endif + rv = osDpSetNextBuffer(dp->list.t.output_buff, + *dp->list.t.output_buff_size); + + dp_busy = 1; + dpCount = 0; + + assert(rv == 0); + + sc->curRDPTask = dp; + } +} + +static void __scYield(OSSched *sc) +{ + +#ifdef SC_LOGGING + osLogEvent(l, 503, 1, sc->curRSPTask ); +#endif + + if (sc->curRSPTask->list.t.type == M_GFXTASK) { + +/* assert(sc->curRSPTask->state & OS_SC_YIELD);*/ + + sc->curRSPTask->state |= OS_SC_YIELD; + + osSpTaskYield(); + } else { +#ifdef SC_LOGGING + osLogEvent(l, 508, 1, sc->curRSPTask); +#endif + } +} + +/* + * Schedules the tasks to be run on the RCP + */ +s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, s32 availRCP) +{ + s32 avail = availRCP; + OSScTask *gfx = sc->gfxListHead; + OSScTask *audio = sc->audioListHead; + +#ifdef SC_LOGGING + osLogEvent(l, 517, 3, *sp, *dp, availRCP); +#endif + + if (sc->doAudio && (avail & OS_SC_SP)) { + + if (gfx && (gfx->flags & OS_SC_PARALLEL_TASK)) { + *sp = gfx; + avail &= ~OS_SC_SP; + } else { + *sp = audio; + avail &= ~OS_SC_SP; + sc->doAudio = 0; + sc->audioListHead = sc->audioListHead->next; + if (sc->audioListHead == NULL) + sc->audioListTail = NULL; + } + } else { +#ifdef SC_LOGGING + osLogEvent(l, 520, 1, gfx); +#endif + if (__scTaskReady(gfx)) { + +#ifdef SC_LOGGING + osLogEvent(l, 522, 3, gfx, gfx->state, gfx->flags); +#endif + switch (gfx->flags & OS_SC_TYPE_MASK) { + case (OS_SC_XBUS): + if (gfx->state & OS_SC_YIELDED) { +#ifdef SC_LOGGING + osLogEvent(l, 518, 0); +#endif + /* can hit this if RDP finishes at yield req */ + /* assert(gfx->state & OS_SC_DP); */ + + if (avail & OS_SC_SP) { /* if SP is available */ +#ifdef SC_LOGGING + osLogEvent(l, 519, 0); +#endif + *sp = gfx; + avail &= ~OS_SC_SP; + + if (gfx->state & OS_SC_DP) { /* if it needs DP */ + *dp = gfx; + avail &= ~OS_SC_DP; + + if (avail & OS_SC_DP == 0) + assert(sc->curRDPTask == gfx); + + } + + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + + } + } else { + if (avail == (OS_SC_SP | OS_SC_DP)) { + *sp = *dp = gfx; + avail &= ~(OS_SC_SP | OS_SC_DP); + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } + + break; + + case (OS_SC_DRAM): + case (OS_SC_DP_DRAM): + case (OS_SC_DP_XBUS): + if (gfx->state & OS_SC_SP) { /* if needs SP */ + if (avail & OS_SC_SP) { /* if SP is available */ + *sp = gfx; + avail &= ~OS_SC_SP; + } + } else if (gfx->state & OS_SC_DP) { /* if needs DP */ + if (avail & OS_SC_DP) { /* if DP available */ + *dp = gfx; + avail &= ~OS_SC_DP; + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } + break; + + case (OS_SC_SP_DRAM): + case (OS_SC_SP_XBUS): + default: + break; + } + } + } + + if (avail != availRCP) + avail = __scSchedule(sc, sp, dp, avail); + + return avail; + +} + diff --git a/lib/ultralib/src/sched/sched_log.fmt b/lib/ultralib/src/sched/sched_log.fmt new file mode 100644 index 0000000..50e042d --- /dev/null +++ b/lib/ultralib/src/sched/sched_log.fmt @@ -0,0 +1,19 @@ +500 "__scHandleRetrace: framecount %d, curRSPTask 0x%x, curRDPTask 0x%x" +510 "__scHandleRSP: Current 0x%x state 0x%x flags 0x%x" +521 "__scHandleRSP: Yielded Task 0x%x" +515 "__scHandleRDP: Current 0x%x state 0x%x flags 0x%x" +513 "__scTaskReady: Pending swap bail - current 0x%x next 0x%x" +514 "__scTaskReady: Rendering bail - current 0x%x" +504 "__scTaskComplete: Task 0x%x" +525 "__scTaskComplete: Swapbuffer 0x%x" +506 "__scAppendList: Audio task 0x%x" +507 "__scAppendList: Gfx task 0x%x" +511 "__scExec: sp 0x%x, dp 0x%x" +523 "__scExec: DP only buf 0x%x, size %d" +503 "__scYield: curRSPtask 0x%x" +508 "__scYield: NOT A GFX TASK!! curRSPtask 0x%x" +517 "__scSchedule: sp 0x%x, dp 0x%x, avail 0x%x" +520 "__scSchedule: gfx task 0x%x" +522 "__scSchedule: gfx task ready 0x%x, state 0x%x, flags 0x%x" +518 "__scSchedule: Yielded" +519 "__scSchedule: SP available" diff --git a/lib/ultralib/src/sp/Makefile b/lib/ultralib/src/sp/Makefile new file mode 100644 index 0000000..7807431 --- /dev/null +++ b/lib/ultralib/src/sp/Makefile @@ -0,0 +1,30 @@ +#!smake +# +# Makefile for the sp subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = \ + clearattribute.c \ + color.c \ + hide.c \ + setattribute.c \ + show.c \ + sprite.c \ + spriteex.c \ + spriteex2.c \ + spscale.c + + +ASFILES = + +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/ultralib/src/sp/clearattribute.c b/lib/ultralib/src/sp/clearattribute.c new file mode 100644 index 0000000..e5faf16 --- /dev/null +++ b/lib/ultralib/src/sp/clearattribute.c @@ -0,0 +1,35 @@ +/* + * 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. + */ + +#include + +/* + * spClearAttribute() + * + * Clears attributes about a sprite. + */ +void +spClearAttribute (Sprite *sp, s32 attr) +{ + sp->attr &= ~attr; +} diff --git a/lib/ultralib/src/sp/color.c b/lib/ultralib/src/sp/color.c new file mode 100644 index 0000000..a5abc85 --- /dev/null +++ b/lib/ultralib/src/sp/color.c @@ -0,0 +1,39 @@ +/* + * 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. + */ + +#include + +/* + * spColor() + * + * Sets the color for IA or I images. + */ +void +spColor (Sprite *sp, unsigned char red, unsigned char green, + unsigned char blue, unsigned char alpha) +{ + sp->red = red; + sp->green = green; + sp->blue = blue; + sp->alpha = alpha; +} diff --git a/lib/ultralib/src/sp/hide.c b/lib/ultralib/src/sp/hide.c new file mode 100644 index 0000000..6223c2c --- /dev/null +++ b/lib/ultralib/src/sp/hide.c @@ -0,0 +1,35 @@ +/* + * 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. + */ + +#include + +/* + * spHide() + * + * Hides a sprite so that it will not be drawn at the next spUpdate(). + */ +void +spHide (Sprite *sp) +{ + spSetAttribute (sp, SP_HIDDEN); +} diff --git a/lib/ultralib/src/sp/setattribute.c b/lib/ultralib/src/sp/setattribute.c new file mode 100644 index 0000000..887df08 --- /dev/null +++ b/lib/ultralib/src/sp/setattribute.c @@ -0,0 +1,35 @@ +/* + * 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. + */ + +#include + +/* + * spSetAttribute() + * + * Sets attributes about a sprite. + */ +void +spSetAttribute ( Sprite *sp, s32 attr) +{ + sp->attr |= attr; +} diff --git a/lib/ultralib/src/sp/show.c b/lib/ultralib/src/sp/show.c new file mode 100644 index 0000000..dc0db54 --- /dev/null +++ b/lib/ultralib/src/sp/show.c @@ -0,0 +1,35 @@ +/* + * 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. + */ + +#include + +/* + * spShow() + * + * Shows a sprite so that it will be drawn at the next spUpdate(). + */ +void +spShow (Sprite *sp) +{ + spClearAttribute (sp, SP_HIDDEN); +} diff --git a/lib/ultralib/src/sp/sprite.c b/lib/ultralib/src/sp/sprite.c new file mode 100644 index 0000000..719a662 --- /dev/null +++ b/lib/ultralib/src/sp/sprite.c @@ -0,0 +1,761 @@ +/* + * 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. + */ +#include +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/* + * spSetZ() + * + */ +void +spSetZ (Sprite *sp, s32 z) +{ + +#ifdef DEBUG + emPrintf("spSetZ (Sprite 0x%08x, (%d))\n", sp, z ); +#endif + + sp->zdepth = (s16)z; +} + +/* + * spMove() + * + * Moves a sprite on the screen. + */ +void +spMove (Sprite *sp, s32 x, s32 y) +{ + +#ifdef DEBUG + emPrintf("spMove (Sprite 0x%08x, (%d,%d))\n", sp, x, y ); +#endif + + sp->x = (s16)x; + sp->y = (s16)y; +} + +static s32 scissor_xmax; +static s32 scissor_ymax; + +static s32 scissor_xmin; +static s32 scissor_ymin; + +/* + * spScissor() + * + * Sets the scissoring box to be used for subsequent Sprite Drawing + */ +void +spScissor (s32 xmin, s32 xmax, s32 ymin, s32 ymax ) +{ + scissor_xmin = xmin; + scissor_ymin = ymin; + + scissor_xmax = xmax; + scissor_ymax = ymax; +} + +static int *prev_bmbuf = NULL; + +/* + * drawbitmap() + * + * Draws a bitmap from a sprite at a location on the screen. If the + * "usevert" flag is set, then the routine will use vertices and triangles + * to draw the bitmap. Otherwise, the texture rectangle instruction + * will be used. + */ + +static void +drawbitmap (Gfx **glp, Sprite *s, Bitmap *b, + s32 x, s32 y, s32 xx, s32 yy, s32 fs, s32 ft, s32 sx, s32 sy) +{ + s32 rs, rt; + s32 rxh, ryh; + s32 rxl, ryl; + Gfx *gl; + s32 tex_width, tex_height; + Gtexrect gt, *g; + s32 s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod; + + g = > + + tex_width = b->width_img; + tex_height= s->bmHreal; + +#ifdef rmDEBUG + rmonPrintf("\tdrawbitmap (buf= 0x%08x; x,y= %d,%d; w,h= %d,%d )\n", + b->buf, x, y, b->width, s->bmheight ); +#endif + gl = *glp; + + /* Scissoring */ + if( (x >= scissor_xmax) || (y >= scissor_ymax) ) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Upper Left corner (%d,%d) beyond range (%d,%d)\n", + x, y, scissor_xmax, scissor_ymax ); +#endif + return; + } + + if( (xx < scissor_xmin) || (yy < scissor_ymin) ) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Lower Right corner (%d,%d) not in range (%d,%d)\n", + xx, yy, scissor_xmin, scissor_ymin ); +#endif + return; + } + + + if (x < scissor_xmin) { + rxh = scissor_xmin*4; + rs = (b->s<<5) + fs + (((scissor_xmin - x)*sx)>>5); +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Left Edge (%d) not in range (%d,%d)\n", + x, scissor_xmin, scissor_xmax ); +#endif + } else { + rxh = x*4; + rs = (b->s<<5) + fs; + }; + + if (y < scissor_ymin) { + ryh = scissor_ymin*4; + rt = (b->t<<5) + ft + (((scissor_ymin-y)*sy)>>5); +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Top Edge (%d) not in range (%d,%d)\n", + y, scissor_ymin, scissor_ymax ); +#endif + } else { + ryh = y*4; + rt = (b->t<<5) + ft; + } + + if( xx >= scissor_xmax ) { + rxl = scissor_xmax*4; +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Right Edge (%d) not in range (%d,%d)\n", + xx, scissor_xmin, scissor_xmax ); +#endif + } else { + rxl = xx*4; + }; + + if( yy >= scissor_ymax ) { + ryl = scissor_ymax*4; +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Bottom Edge (%d) not in range (%d,%d)\n", + yy, scissor_ymin, scissor_ymax ); +#endif + } else { + ryl = yy*4; + }; + + s_clamp = G_TX_CLAMP; t_clamp = G_TX_CLAMP; + s_mask = G_TX_NOMASK; t_mask = G_TX_NOMASK; + s_lod = G_TX_NOLOD; t_lod = G_TX_NOLOD; + +#define LOAD_TEX + +#ifdef LOAD_TEX + 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, + b->s + b->width,b->t + b->actualHeight, + 0, + s_clamp, t_clamp, + 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, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + } else { + gDPLoadTextureBlock_4b(gl++, b->buf, s->bmfmt, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + }; + break; + + case G_IM_SIZ_8b: + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockS(gl++, b->buf, s->bmfmt, G_IM_SIZ_8b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + } else { + gDPLoadTextureBlock(gl++, b->buf, s->bmfmt, G_IM_SIZ_8b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + }; + break; + case G_IM_SIZ_16b: + if (s->bmfmt == G_IM_FMT_YUV ) { + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockYuvS(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + } else { + if( b->LUToffset != 0 ) { /* Split Y and UV areas */ + unsigned char *uv, *addr; + int j; + s32 tmem, siz; + + gDPSetTextureImage( gl++, G_IM_FMT_I, G_IM_SIZ_8b, 1, b->buf); + gDPSetTile( gl++, G_IM_FMT_I, G_IM_SIZ_8b, 0, 256, G_TX_LOADTILE, 0, + t_clamp, t_mask, t_lod, + s_clamp, s_mask, s_lod ); + gDPLoadSync( gl++ ); + gDPLoadBlock( gl++, G_TX_LOADTILE, 0,0, tex_width*tex_height -1, + CALC_DXT(tex_width,1) ); + gDPLoadSync( gl++ ); + + uv = ((unsigned char *)b->buf) + + ((tex_width*tex_height)/2)*b->LUToffset; + + for( j=0; j<=(tex_height/2); j++ ) { + addr = uv + ((tex_height/2) -2 -j)*tex_width; + siz = 3*tex_width; + tmem = (tex_width/8)*(tex_height - 2 - 2*j); + if( tmem < 0 ) { + addr += (-tmem)*8; + siz -= (-tmem)*8; + tmem = 0; + }; + if( j == 0 ) + siz = 2*tex_width; + + gDPSetTextureImage( gl++, G_IM_FMT_I, G_IM_SIZ_8b, 1, addr); + gDPSetTile( gl++, G_IM_FMT_I, G_IM_SIZ_8b, 0, tmem, + G_TX_LOADTILE, 0, + t_clamp, t_mask, t_lod, + s_clamp, s_mask, s_lod ); + gDPLoadSync( gl++ ); + gDPLoadBlock( gl++, G_TX_LOADTILE, 0,0, siz -1, + CALC_DXT(tex_width,1) ); + gDPLoadSync( gl++ ); + }; + + gDPSetTile( gl++, s->bmfmt, G_IM_SIZ_16b, (((tex_width) * 1)+7)>>3, 0, + G_TX_RENDERTILE, 0, + t_clamp, t_mask, t_lod, + s_clamp, s_mask, s_lod ); + gDPSetTileSize( gl++, G_TX_RENDERTILE, 0, 0, + ((tex_width)-1) << G_TEXTURE_IMAGE_FRAC, + ((tex_height)-1) << G_TEXTURE_IMAGE_FRAC ); + + } else { + gDPLoadTextureBlockYuv(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + }; + }; + } else { + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockS(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + } else { + gDPLoadTextureBlock(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + }; + }; + break; + case G_IM_SIZ_32b: + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockS(gl++, b->buf, s->bmfmt, G_IM_SIZ_32b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + } else { + gDPLoadTextureBlock(gl++, b->buf, s->bmfmt, G_IM_SIZ_32b, + tex_width, tex_height, 0, + s_clamp, t_clamp, + s_mask, t_mask, + s_lod, t_lod); + }; + break; + } + prev_bmbuf = b->buf; + } +#endif /* LOAD_TEX */ + + + g->cmd = G_TEXRECT; + g->tile = 0; + + g->xh = rxh; + g->xl = rxl; + g->yh = ryh; + g->yl = ryl; + + g->s = rs; + g->t = rt; + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV) ) + g->dsdx = sx * 4; + else + g->dsdx = sx; + + g->dtdy = sy; + +#ifdef rmDEBUG + rmonPrintf("\trect (xh,l= %d,%d, yh,l= %d,%d, s,t= %d,%d, dsdx=%d, dtdy=%d )\n", + rxh,rxl,ryh,ryl,rs,rt,g->dsdx,sy ); +#endif + + gSPTextureRectangle(gl++,g->xh,g->yh,g->xl,g->yl,g->tile,g->s,g->t,g->dsdx,g->dtdy); + + gDPPipeSync(gl++); + + *glp = gl; +} + +static u16 sp_attr = 0; + +void +spInit( Gfx **glistp ) +{ + Gfx *gl; + + gl = *glistp; + +#ifdef DEBUG + emPrintf("spInit ()\n" ); +#endif + sp_attr = 0; + + scissor_xmin = 0; + scissor_ymin = 0; + + scissor_xmax = 320; + scissor_ymax = 240; + + /* Turn on texturing */ + gDPPipeSync ( gl++ ); + gDPSetCycleType ( gl++, G_CYC_1CYCLE); + gSPTexture ( gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); + gDPSetAlphaCompare ( gl++, G_AC_NONE ); + gDPSetTexturePersp ( gl++, G_TP_NONE ); + gDPSetTextureFilter ( gl++, G_TF_BILERP ); + gDPSetTextureConvert( gl++, G_TC_FILT ); + gDPSetTextureDetail ( gl++, G_TD_CLAMP ); + gDPSetTextureLOD ( gl++, G_TL_TILE ); + gDPSetTextureLUT ( gl++, G_TT_NONE ); + +#define SPRITE_SURF G_RM_TEX_EDGE +#define SPRITE_SURF2 G_RM_TEX_EDGE2 + + gDPSetRenderMode( gl++, SPRITE_SURF, SPRITE_SURF2); + + *glistp = gl; +} + + +/* + * spDraw() + * + * Draws all of the sprites that are associated with bitmaps and that + * are supposed to be drawn (spDraw()). They are drawn from 0 to maxsp, + * so sprites with higher numbers will overwrite lower-numbered sprites. + * + */ +Gfx * +spDraw ( Sprite *s ) +{ + int i; + s32 x, y; + float sx, sy; + Bitmap *b; + Gfx *gl; +#ifndef NDEBUG + Gfx *ogl; +#endif + Gfx *dl_start; + s32 isx, isy; + s32 tx, ty; + s32 tx2, ty2; + s32 x2, y2; + float ftx, fty; + s32 fs, ft; + s32 ex, ey; + +#ifdef rmDEBUG + rmonPrintf("spDraw (Sprite 0x%08x )\n", s ); +#endif + + if (s->attr & SP_HIDDEN) + return(NULL); + + prev_bmbuf = NULL; + + gl = s->rsp_dl_next; + if( gl == NULL ) + gl = s->rsp_dl; + dl_start = gl; + +#ifndef NDEBUG + ogl = gl; +#endif + + b = s->bitmap; + ex = 0; + ey = 0; + + if (sp_attr & SP_EXTERN) /* previous attr was extern? */ + sp_attr = ~s->attr; /* Assume previous modes are all different + from new ones */ + + if (s->attr & SP_EXTERN) /* current attr is extern? */ + sp_attr = s->attr; /* Assume all settings should remain the same */ + + if (s->attr != sp_attr) { + if ((s->attr & SP_TRANSPARENT) && !(sp_attr & SP_TRANSPARENT)) { + gDPSetRenderMode( gl++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + } else if (!(s->attr & SP_TRANSPARENT) && + (sp_attr & SP_TRANSPARENT)) { + gDPSetRenderMode( gl++, + SPRITE_SURF, SPRITE_SURF2); + } + + if ((s->attr & SP_CUTOUT) && !(sp_attr & SP_CUTOUT)) { + gDPSetBlendColor ( gl++, 0xff, 0xff, 0xff, 0x01); + gDPSetAlphaCompare ( gl++, G_AC_THRESHOLD) ; + } else if (!(s->attr & SP_CUTOUT) && (sp_attr & SP_CUTOUT)) { + gDPSetAlphaCompare ( gl++, G_AC_NONE) ; + } + + if( (s->attr & SP_TEXSHIFT) && !(sp_attr & SP_TEXSHIFT) ) { + gDPSetTextureFilter( gl++, G_TF_AVERAGE ); + } else if( !(s->attr & SP_TEXSHIFT) && (sp_attr & SP_TEXSHIFT) ) { + gDPSetTextureFilter( gl++, G_TF_BILERP ); + }; + + }; + + sp_attr = s->attr; + + if( sp_attr & SP_Z ) { + gDPSetPrimDepth(gl++, s->zdepth, 0); + }; + + + gDPSetPrimColor( gl++, 0, 0, s->red, s->green, s->blue, s->alpha); + + if (s->bmfmt == G_IM_FMT_IA || s->bmfmt == G_IM_FMT_I) { + if( s->alpha == 255 ) { + gDPSetCombineMode ( gl++, + G_CC_MODULATEIDECALA_PRIM, + G_CC_MODULATEIDECALA_PRIM); + } else { + gDPSetCombineMode ( gl++, + G_CC_MODULATEIA_PRIM, + G_CC_MODULATEIA_PRIM); + }; + } else { + if( s->alpha == 255 ) { + gDPSetCombineMode ( gl++, + G_CC_MODULATEIDECALA_PRIM, + G_CC_MODULATEIDECALA_PRIM); + } else { + gDPSetCombineMode ( gl++, + G_CC_MODULATERGBA_PRIM, + G_CC_MODULATERGBA_PRIM); + }; + } + + + if( s->bmfmt == G_IM_FMT_CI ) { + gDPSetTextureLUT( gl++, G_TT_RGBA16); + gDPLoadTLUT( gl++, s->nTLUT, 256+s->startTLUT, s->LUT ); + gDPLoadSync( gl++ ); + }; + +#define MY_K0 (175 & 0x1ff) +#define MY_K1 (-43 & 0x1ff) +#define MY_K2 (-89 & 0x1ff) +#define MY_K3 (222 & 0x1ff) +#define MY_K4 (114 & 0x1ff) +#define MY_K5 (42 & 0x1ff) + + if( (s->bmfmt == G_IM_FMT_YUV) && (s->attr & SP_FASTCOPY) ) { + gDPSetTextureConvert( gl++, G_TC_CONV); + gDPSetTextureFilter( gl++, G_TF_POINT); + gDPSetCombineMode( gl++, G_CC_1CYUV2RGB, G_CC_1CYUV2RGB); + gDPSetConvert( gl++, MY_K0, MY_K1, MY_K2, MY_K3, MY_K4, MY_K5); + } else if(s->bmfmt == G_IM_FMT_YUV) { + gDPSetCycleType( gl++, G_CYC_2CYCLE ); + gDPSetTextureFilter( gl++, G_TF_BILERP); + gDPSetTextureConvert( gl++, G_TC_FILTCONV); + gDPSetConvert( gl++, MY_K0, MY_K1, MY_K2, MY_K3, MY_K4, MY_K5); + gDPSetCombineMode( gl++, G_CC_YUV2RGB, G_CC_PASS2); + } + + if (s->attr & SP_SCALE) { + sx = s->scalex; + sy = s->scaley; + } else { + sx = 1.0F; + sy = 1.0F; + } + + isx = (int) ((1<<10) / sx + 0.5F); + isy = (int) ((1<<10) / sy + 0.5F); + + if( b ) { + + if( (s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV) ) + gDPSetCycleType( gl++, G_CYC_COPY); + + x = 0.0F; + y = 0.0F; + + fty = s->y+y*sy; + ty = (int) ( fty + 0.99999F); + ft = (int) (isy * (ty - fty)); + ft = (ft + 16)>>5; + if( s->attr & SP_TEXSHIFT ) + ft += 16; /* 1/2 Texel for AntiAliasing */ + + if( s->attr & SP_FRACPOS ) + ft += s->frac_t; /* Micro-positioning */ + + y2 = y + s->bmheight; + ty2 = (int) (s->y+y2*sy + 0.99999F); + + if( (s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV) ) + ty2--; + + +#ifdef rmDEBUG + rmonPrintf("\tiscale=(%d,%d), %d bitmaps, sprite_size=(%d,%d)\n", + isx, isy, s->nbitmaps, s->width, s->height ); +#endif + + for( i=0; (i < s->nbitmaps) && (b->width > 0); i++, b++ ) { + + if( (x+b->width) > s->width ) { /* Next bitmap hits edge? */ + int bh; + + x = 0; + fs = 0; + ex = 0; + ey += s->expy; + y += s->bmheight; /* Wrap to next line */ + y2 = y + s->bmheight; /* Wrap to next line */ + + fty = s->y+y*sy; + ty = (int) ( fty + 0.9999F); + ft = (int) (isy * (ty - fty)); + ft = (ft + 16)>>5; + if( s->attr & SP_TEXSHIFT ) + ft += 16; /* 1/2 Texel for AntiAliasing */ + + if( s->attr & SP_FRACPOS ) + ft += s->frac_t; /* Micro-positioning */ + + ty2 = (int) (s->y+y2*sy + 0.9999F); + + ty += ey; + ty2 += ey; + + if( (s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV) ) + ty2--; + + /* Fill out to rect. bdy? */ + + if( (b->actualHeight != 0) ) + bh = b->actualHeight; + else + bh = s->bmheight; + + if( (y + bh) > s->height ) /* Can't wrap any more? */ + break; + }; + +#ifdef rmDEBUG + rmonPrintf("bm# %d, x,y=(%d,%d) width=%d \n", i, x, y, b->width ); +#endif + + ftx = s->x+x*sx; + tx = (s32) (ftx + 0.9999F); + fs = (s32) (isx * (tx - ftx)); + fs = (fs + 16)>>5; + if( s->attr & SP_TEXSHIFT ) + fs += 16; /* 1/2 Texel for AntiAliasing */ + + if( s->attr & SP_FRACPOS ) + fs += s->frac_s; /* Micro-positioning */ + + x2 = x + b->width; + tx2 = (int) (s->x+x2*sx + 0.9999F); + + if( (b->actualHeight != 0) ) { + y2 = y + b->actualHeight; + ty2 = (s32) (s->y+y2*sy + 0.9999F); + ty2 += ey; + + if( (s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV) ) + ty2--; + }; + +#ifdef rmDEBUG + rmonPrintf("\tfull(%g,%g) = int(%d,%d) + frac(%d,%d)\n", + ftx, fty, tx,ty, fs,ft ); +#endif + + tx += ex; + tx2 += ex; + + if( (s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV) ) + tx2--; + + if( b->buf != NULL ) /* Skip over null bitmaps (blanks) */ + drawbitmap ( &gl, s, b, tx, ty, tx2, ty2, fs, ft, isx, isy); + + x += b->width; + ex += s->expx; + } + + if (s->attr & SP_FASTCOPY) + gDPSetCycleType( gl++, G_CYC_1CYCLE); + + if(s->bmfmt == G_IM_FMT_YUV) { + gDPSetCycleType( gl++, G_CYC_1CYCLE); + gDPSetTextureFilter ( gl++, G_TF_BILERP ); + gDPSetTextureConvert( gl++, G_TC_FILT ); + }; + + } else { + int rgba; + + x = (s32)s->x; + y = (s32)s->y; + x2 = s->x + (s->width*sx)-1; + y2 = s->y + (s->height*sy)-1; + + if( ( x >= scissor_xmax) || (y >= scissor_ymax) ) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: FILL Upper Left corner (%d,%d) beyond range (%d,%d)\n", + x, y, scissor_xmax, scissor_ymax ); +#endif + } else if( ( x2 < scissor_xmin) || (y2 < scissor_ymin) ) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: FILL Lower Right corner (%d,%d) below range (%d,%d)\n", + x2, y2, scissor_xmin, scissor_ymin ); +#endif + } else { + + if( x < scissor_xmin ) + x = scissor_xmin; + + if( x2 >= scissor_xmax ) + x2 = scissor_xmax - 1; + + if( y < scissor_ymin ) + y = scissor_ymin; + + if( y2 >= scissor_ymax ) + y2 = scissor_ymax - 1; + + rgba = GPACK_RGBA5551((s->red), (s->green), (s->blue), (s->alpha>>7)); + + gSPTexture ( gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_OFF); + gDPSetCycleType( gl++, G_CYC_FILL); + gDPSetFillColor( gl++, (rgba << 16) | (rgba) ); + + gDPFillRectangle( gl++, x,y, x2,y2 ); + gDPSetCycleType( gl++, G_CYC_1CYCLE); + gSPTexture ( gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); + } + } + + if( s->bmfmt == G_IM_FMT_CI ) { + gDPSetTextureLUT( gl++, G_TT_NONE); + }; + + 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 ); +} + +void +spFinish( Gfx **glistp ) +{ + Gfx *gl; + + gl = *glistp; + + /* Turn off texturing */ + gSPTexture ( gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_OFF); + gDPSetCombineMode ( gl++, G_CC_SHADE, G_CC_SHADE); + + if (sp_attr & SP_TRANSPARENT) { + /* Turn off transparency */ + gDPSetRenderMode( gl++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + } + + if (sp_attr & SP_CUTOUT) { + /* Turn off Alpha write enable */ + gDPSetAlphaCompare ( gl++, G_AC_NONE) ; + } + + gSPEndDisplayList ( gl++ ); + + *glistp = gl; +} diff --git a/lib/ultralib/src/sp/spriteex.c b/lib/ultralib/src/sp/spriteex.c new file mode 100644 index 0000000..772036f --- /dev/null +++ b/lib/ultralib/src/sp/spriteex.c @@ -0,0 +1,2 @@ +#define F3DEX_GBI +#include "sprite.c" diff --git a/lib/ultralib/src/sp/spriteex2.c b/lib/ultralib/src/sp/spriteex2.c new file mode 100644 index 0000000..2ef1221 --- /dev/null +++ b/lib/ultralib/src/sp/spriteex2.c @@ -0,0 +1,2 @@ +#define F3DEX_GBI_2 +#include "sprite.c" diff --git a/lib/ultralib/src/sp/spscale.c b/lib/ultralib/src/sp/spscale.c new file mode 100644 index 0000000..4f1bd92 --- /dev/null +++ b/lib/ultralib/src/sp/spscale.c @@ -0,0 +1,42 @@ +/* + * 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. + */ + +#include + +/* + * spScale() + * + * Scales the sprite by a vertical and horizontal factor. + */ +void +spScale (Sprite *sp, float sx, float sy) +{ + + sp->scalex = sx; + sp->scaley = sy; + + if( (sx == 1.0F) && (sy == 1.0F) ) + spClearAttribute( sp, SP_SCALE ); + else + spSetAttribute( sp, SP_SCALE ); +} diff --git a/lib/ultralib/src/vimodes/vimodefpalhaf1.c b/lib/ultralib/src/vimodes/vimodefpalhaf1.c new file mode 100644 index 0000000..5ad95fa --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalHaf1 = { + OS_VI_FPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpalhan1.c b/lib/ultralib/src/vimodes/vimodefpalhan1.c new file mode 100644 index 0000000..f29ff4b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalHan1 = { + OS_VI_FPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpalhpf1.c b/lib/ultralib/src/vimodes/vimodefpalhpf1.c new file mode 100644 index 0000000..db0eb9d --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalHpf1 = { + OS_VI_FPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpalhpf2.c b/lib/ultralib/src/vimodes/vimodefpalhpf2.c new file mode 100644 index 0000000..dfd3d92 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalHpf2 = { + OS_VI_FPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpalhpn1.c b/lib/ultralib/src/vimodes/vimodefpalhpn1.c new file mode 100644 index 0000000..8b665a8 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalHpn1 = { + OS_VI_FPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpalhpn2.c b/lib/ultralib/src/vimodes/vimodefpalhpn2.c new file mode 100644 index 0000000..c046e97 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalHpn2 = { + OS_VI_FPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallaf1.c b/lib/ultralib/src/vimodes/vimodefpallaf1.c new file mode 100644 index 0000000..e4a8a9e --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLaf1 = { + OS_VI_FPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallaf2.c b/lib/ultralib/src/vimodes/vimodefpallaf2.c new file mode 100644 index 0000000..8b3b608 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLaf2 = { + OS_VI_FPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallan1.c b/lib/ultralib/src/vimodes/vimodefpallan1.c new file mode 100644 index 0000000..f190f55 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLan1 = { + OS_VI_FPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallan2.c b/lib/ultralib/src/vimodes/vimodefpallan2.c new file mode 100644 index 0000000..13c71e5 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLan2 = { + OS_VI_FPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallpf1.c b/lib/ultralib/src/vimodes/vimodefpallpf1.c new file mode 100644 index 0000000..d1c307c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLpf1 = { + OS_VI_FPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallpf2.c b/lib/ultralib/src/vimodes/vimodefpallpf2.c new file mode 100644 index 0000000..385b1df --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLpf2 = { + OS_VI_FPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallpn1.c b/lib/ultralib/src/vimodes/vimodefpallpn1.c new file mode 100644 index 0000000..6fbcfe9 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLpn1 = { + OS_VI_FPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodefpallpn2.c b/lib/ultralib/src/vimodes/vimodefpallpn2.c new file mode 100644 index 0000000..c852cf9 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeFpalLpn2 = { + OS_VI_FPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempalhaf1.c b/lib/ultralib/src/vimodes/vimodempalhaf1.c new file mode 100644 index 0000000..c9a74dc --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalHaf1 = { + OS_VI_MPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + //[0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempalhan1.c b/lib/ultralib/src/vimodes/vimodempalhan1.c new file mode 100644 index 0000000..038163b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalHan1 = { + OS_VI_MPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempalhpf1.c b/lib/ultralib/src/vimodes/vimodempalhpf1.c new file mode 100644 index 0000000..4bbb0e5 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalHpf1 = { + OS_VI_MPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempalhpf2.c b/lib/ultralib/src/vimodes/vimodempalhpf2.c new file mode 100644 index 0000000..b2fad3d --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalHpf2 = { + OS_VI_MPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempalhpn1.c b/lib/ultralib/src/vimodes/vimodempalhpn1.c new file mode 100644 index 0000000..3955a4f --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalHpn1 = { + OS_VI_MPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempalhpn2.c b/lib/ultralib/src/vimodes/vimodempalhpn2.c new file mode 100644 index 0000000..b4c7a6d --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalHpn2 = { + OS_VI_MPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallaf1.c b/lib/ultralib/src/vimodes/vimodempallaf1.c new file mode 100644 index 0000000..1369d39 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLaf1 = { + OS_VI_MPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallaf2.c b/lib/ultralib/src/vimodes/vimodempallaf2.c new file mode 100644 index 0000000..0502362 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLaf2 = { + OS_VI_MPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallan1.c b/lib/ultralib/src/vimodes/vimodempallan1.c new file mode 100644 index 0000000..a3f4e69 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLan1 = { + OS_VI_MPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallan2.c b/lib/ultralib/src/vimodes/vimodempallan2.c new file mode 100644 index 0000000..65817e7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLan2 = { + OS_VI_MPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallpf1.c b/lib/ultralib/src/vimodes/vimodempallpf1.c new file mode 100644 index 0000000..7df1655 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLpf1 = { + OS_VI_MPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallpf2.c b/lib/ultralib/src/vimodes/vimodempallpf2.c new file mode 100644 index 0000000..285832e --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLpf2 = { + OS_VI_MPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallpn1.c b/lib/ultralib/src/vimodes/vimodempallpn1.c new file mode 100644 index 0000000..8914794 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLpn1 = { + OS_VI_MPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodempallpn2.c b/lib/ultralib/src/vimodes/vimodempallpn2.c new file mode 100644 index 0000000..40f381c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeMpalLpn2 = { + OS_VI_MPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentschaf1.c b/lib/ultralib/src/vimodes/vimodentschaf1.c new file mode 100644 index 0000000..e6ad8bc --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscHaf1 = { + OS_VI_NTSC_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentschan1.c b/lib/ultralib/src/vimodes/vimodentschan1.c new file mode 100644 index 0000000..14711e7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscHan1 = { + OS_VI_NTSC_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentschpf1.c b/lib/ultralib/src/vimodes/vimodentschpf1.c new file mode 100644 index 0000000..8f70311 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscHpf1 = { + OS_VI_NTSC_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentschpf2.c b/lib/ultralib/src/vimodes/vimodentschpf2.c new file mode 100644 index 0000000..8533e23 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscHpf2 = { + OS_VI_NTSC_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentschpn1.c b/lib/ultralib/src/vimodes/vimodentschpn1.c new file mode 100644 index 0000000..f82e277 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscHpn1 = { + OS_VI_NTSC_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentschpn2.c b/lib/ultralib/src/vimodes/vimodentschpn2.c new file mode 100644 index 0000000..d1b5974 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscHpn2 = { + OS_VI_NTSC_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclaf1.c b/lib/ultralib/src/vimodes/vimodentsclaf1.c new file mode 100644 index 0000000..fe12792 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLaf1 = { + OS_VI_NTSC_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclaf2.c b/lib/ultralib/src/vimodes/vimodentsclaf2.c new file mode 100644 index 0000000..acf2c3c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLaf2 = { + OS_VI_NTSC_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclan1.c b/lib/ultralib/src/vimodes/vimodentsclan1.c new file mode 100644 index 0000000..0092a00 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLan1 = { + OS_VI_NTSC_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclan2.c b/lib/ultralib/src/vimodes/vimodentsclan2.c new file mode 100644 index 0000000..da2747b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLan2 = { + OS_VI_NTSC_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclpf1.c b/lib/ultralib/src/vimodes/vimodentsclpf1.c new file mode 100644 index 0000000..b6bb5e7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLpf1 = { + OS_VI_NTSC_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclpf2.c b/lib/ultralib/src/vimodes/vimodentsclpf2.c new file mode 100644 index 0000000..f3f82c7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLpf2 = { + OS_VI_NTSC_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclpn1.c b/lib/ultralib/src/vimodes/vimodentsclpn1.c new file mode 100644 index 0000000..ecc68cb --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLpn1 = { + OS_VI_NTSC_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodentsclpn2.c b/lib/ultralib/src/vimodes/vimodentsclpn2.c new file mode 100644 index 0000000..bce83b8 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModeNtscLpn2 = { + OS_VI_NTSC_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepalhaf1.c b/lib/ultralib/src/vimodes/vimodepalhaf1.c new file mode 100644 index 0000000..3ff1394 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalHaf1 = { + OS_VI_PAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepalhan1.c b/lib/ultralib/src/vimodes/vimodepalhan1.c new file mode 100644 index 0000000..3d32ba6 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalHan1 = { + OS_VI_PAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepalhpf1.c b/lib/ultralib/src/vimodes/vimodepalhpf1.c new file mode 100644 index 0000000..bdd0871 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalHpf1 = { + OS_VI_PAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepalhpf2.c b/lib/ultralib/src/vimodes/vimodepalhpf2.c new file mode 100644 index 0000000..565ac4f --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalHpf2 = { + OS_VI_PAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepalhpn1.c b/lib/ultralib/src/vimodes/vimodepalhpn1.c new file mode 100644 index 0000000..a0c1ecc --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalHpn1 = { + OS_VI_PAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepalhpn2.c b/lib/ultralib/src/vimodes/vimodepalhpn2.c new file mode 100644 index 0000000..d6e05b8 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalHpn2 = { + OS_VI_PAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallaf1.c b/lib/ultralib/src/vimodes/vimodepallaf1.c new file mode 100644 index 0000000..3d03857 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLaf1 = { + OS_VI_PAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallaf2.c b/lib/ultralib/src/vimodes/vimodepallaf2.c new file mode 100644 index 0000000..4fc496c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLaf2 = { + OS_VI_PAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallan1.c b/lib/ultralib/src/vimodes/vimodepallan1.c new file mode 100644 index 0000000..22a893c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLan1 = { + OS_VI_PAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallan2.c b/lib/ultralib/src/vimodes/vimodepallan2.c new file mode 100644 index 0000000..d32360b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLan2 = { + OS_VI_PAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallpf1.c b/lib/ultralib/src/vimodes/vimodepallpf1.c new file mode 100644 index 0000000..37d68e4 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLpf1 = { + OS_VI_PAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallpf2.c b/lib/ultralib/src/vimodes/vimodepallpf2.c new file mode 100644 index 0000000..c37ebe1 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLpf2 = { + OS_VI_PAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallpn1.c b/lib/ultralib/src/vimodes/vimodepallpn1.c new file mode 100644 index 0000000..eafbe6b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLpn1 = { + OS_VI_PAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/vimodes/vimodepallpn2.c b/lib/ultralib/src/vimodes/vimodepallpn2.c new file mode 100644 index 0000000..49a26fd --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/viint.h" + +OSViMode osViModePalLpn2 = { + OS_VI_PAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 | + VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/ultralib/src/voice/voicecheckresult.c b/lib/ultralib/src/voice/voicecheckresult.c new file mode 100644 index 0000000..5318652 --- /dev/null +++ b/lib/ultralib/src/voice/voicecheckresult.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 __osVoiceCheckResult(OSVoiceHandle* hd, u8* stat) { + s32 ret; + u8 buf[2]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, stat); + if (ret == 0) { + if (*stat & 1) { + ret = CONT_ERR_VOICE_NO_RESPONSE; + } else { + ret = __osVoiceContRead2(hd->__mq, hd->__channel, 0, buf); + if (ret == 0) { + hd->cmd_status = buf[0] & 7; + + if (buf[0] & 0x40) { + ret = CONT_ERR_VOICE_NO_RESPONSE; + } else { + ret = buf[1] << 8; + } + } + } + } + return ret; +} diff --git a/lib/ultralib/src/voice/voicecheckword.c b/lib/ultralib/src/voice/voicecheckword.c new file mode 100644 index 0000000..05c2a59 --- /dev/null +++ b/lib/ultralib/src/voice/voicecheckword.c @@ -0,0 +1,80 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" + +s32 osVoiceCheckWord(u8* word) { + s32 k; + s32 ret = 0; + u16 sjis; + u16 old = 0; + + for (k = 0; word[k] != 0; k += 2) { + sjis = (word[k] << 8) + word[k + 1]; + if (((sjis != 'ー') && (sjis < 'ぁ')) || ((sjis > 'ん') && (sjis < 'ァ')) || (sjis == 0x837F) || + (sjis > 'ヶ')) { + ret = CONT_ERR_VOICE_WORD; + } else if ((k == 0) && + ((sjis == 'ー') || (sjis == 'ん') || (sjis == 'っ') || (sjis == 'ゎ') || (sjis == 'ン') || + (sjis == 'ッ') || (sjis == 'ヮ') || (sjis == 'ヵ') || (sjis == 'ヶ'))) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぁ') || (sjis == 'ァ')) && (old != 'ふ') && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぃ') || (sjis == 'ィ')) && (old != 'う') && (old != 'て') && (old != 'で') && + (old != 'ふ') && (old != 'ウ') && (old != 'テ') && (old != 'デ') && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぅ') || (sjis == 'ゥ')) && (old != 'と') && (old != 'ど') && (old != 'ふ') && + (old != 'ト') && (old != 'ド') && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぇ') || (sjis == 'ェ')) && (old != 'う') && (old != 'し') && (old != 'じ') && + (old != 'ち') && (old != 'ぢ') && (old != 'つ') && (old != 'ふ') && (old != 'ウ') && (old != 'シ') && + (old != 'ジ') && (old != 'チ') && (old != 'ヂ') && (old != 'ツ') && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぉ') || (sjis == 'ォ')) && (old != 'う') && (old != 'ふ') && (old != 'ウ') && + (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ゃ') || (sjis == 'ゅ') || (sjis == 'ょ') || (sjis == 'ャ') || (sjis == 'ュ') || + (sjis == 'ョ')) && + (old != 'き') && (old != 'し') && (old != 'ち') && (old != 'に') && (old != 'ひ') && (old != 'み') && + (old != 'り') && (old != 'ぎ') && (old != 'じ') && (old != 'ぢ') && (old != 'び') && (old != 'ぴ') && + (old != 'キ') && (old != 'シ') && (old != 'チ') && (old != 'ニ') && (old != 'ヒ') && (old != 'ミ') && + (old != 'リ') && (old != 'ギ') && (old != 'ジ') && (old != 'ヂ') && (old != 'ビ') && (old != 'ピ') && + (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if ((sjis == 'ー') && ((old == 'ん') || (old == 'っ') || (old == 'ン') || (old == 'ッ'))) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ん') || (sjis == 'ン')) && ((old == 'ん') || (old == 'ン'))) { + ret = CONT_ERR_VOICE_WORD; + } else if (((old == 'っ') || (old == 'ッ')) && + ((sjis == 'ー') || (sjis == 'あ') || (sjis == 'い') || (sjis == 'う') || (sjis == 'え') || + (sjis == 'お') || (sjis == 'な') || (sjis == 'に') || (sjis == 'ぬ') || (sjis == 'ね') || + (sjis == 'の') || (sjis == 'ま') || (sjis == 'み') || (sjis == 'む') || (sjis == 'め') || + (sjis == 'も') || (sjis == 'や') || (sjis == 'ゆ') || (sjis == 'よ') || (sjis == 'ら') || + (sjis == 'り') || (sjis == 'る') || (sjis == 'れ') || (sjis == 'ろ') || (sjis == 'わ') || + (sjis == 'ゐ') || (sjis == 'ゑ') || (sjis == 'を') || (sjis == 'ん') || (sjis == 'ぁ') || + (sjis == 'ぃ') || (sjis == 'ぅ') || (sjis == 'ぇ') || (sjis == 'ぉ') || (sjis == 'ゃ') || + (sjis == 'ゅ') || (sjis == 'ょ') || (sjis == 'っ') || (sjis == 'ゎ') + + || (sjis == 'ア') || (sjis == 'イ') || (sjis == 'ウ') || (sjis == 'エ') || (sjis == 'オ') || + (sjis == 'ナ') || (sjis == 'ニ') || (sjis == 'ヌ') || (sjis == 'ネ') || (sjis == 'ノ') || + (sjis == 'マ') || (sjis == 'ミ') || (sjis == 'ム') || (sjis == 'メ') || (sjis == 'モ') || + (sjis == 'ヤ') || (sjis == 'ユ') || (sjis == 'ヨ') || (sjis == 'ラ') || (sjis == 'リ') || + (sjis == 'ル') || (sjis == 'レ') || (sjis == 'ロ') || (sjis == 'ワ') || (sjis == 'ヰ') || + (sjis == 'ヱ') || (sjis == 'ヲ') || (sjis == 'ン') || (sjis == 'ァ') || (sjis == 'ィ') || + (sjis == 'ゥ') || (sjis == 'ェ') || (sjis == 'ォ') || (sjis == 'ャ') || (sjis == 'ュ') || + (sjis == 'ョ') || (sjis == 'ッ') || (sjis == 'ヮ'))) { + ret = CONT_ERR_VOICE_WORD; + } + + if (ret != 0) { + return ret; + } else { + old = sjis; + } + } + + if ((sjis == 'っ') || (sjis == 'ッ')) { + ret = CONT_ERR_VOICE_WORD; + } + + return ret; +} diff --git a/lib/ultralib/src/voice/voicecleardictionary.c b/lib/ultralib/src/voice/voicecleardictionary.c new file mode 100644 index 0000000..6ed1464 --- /dev/null +++ b/lib/ultralib/src/voice/voicecleardictionary.c @@ -0,0 +1,29 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceClearDictionary(OSVoiceHandle* hd, u8 words) { + s32 ret; + u8 stat; + u8 buf[4]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + *(u32*)buf = 0x02000000; + buf[2] = words; + + ERRCK(__osVoiceContWrite4(hd->__mq, hd->__channel, 0, buf)); + + ret = __osVoiceCheckResult(hd, &stat); + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + + return ret; +} diff --git a/lib/ultralib/src/voice/voicecontread2.c b/lib/ultralib/src/voice/voicecontread2.c new file mode 100644 index 0000000..a204ffc --- /dev/null +++ b/lib/ultralib/src/voice/voicecontread2.c @@ -0,0 +1,73 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/siint.h" + +#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 = 2; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam.ramarray; + + if ((__osContLastCmd != CONT_CMD_READ2_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_READ2_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READ2FORMAT(ptr)->dummy = CONT_CMD_NOP; + READ2FORMAT(ptr)->txsize = CONT_CMD_READ2_VOICE_TX; + READ2FORMAT(ptr)->rxsize = CONT_CMD_READ2_VOICE_RX; + READ2FORMAT(ptr)->cmd = CONT_CMD_READ2_VOICE; + READ2FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceRead2Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + READ2FORMAT(ptr)->addrh = address >> 3; + READ2FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READ2FORMAT(ptr)); + + if (ret == 0) { + if (__osVoiceContDataCrc(READ2FORMAT(ptr)->data, ARRLEN(READ2FORMAT(ptr)->data)) != + READ2FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } else { + bcopy(READ2FORMAT(ptr)->data, buffer, ARRLEN(READ2FORMAT(ptr)->data)); + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/voice/voicecontread36.c b/lib/ultralib/src/voice/voicecontread36.c new file mode 100644 index 0000000..c537aff --- /dev/null +++ b/lib/ultralib/src/voice/voicecontread36.c @@ -0,0 +1,73 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/siint.h" + +#define READ36FORMAT(ptr) ((__OSVoiceRead36Format*)(ptr)) + +s32 __osVoiceContRead36(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + u8 status; + s32 i; + u8* ptr; + s32 retry = 2; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam.ramarray; + + if ((__osContLastCmd != CONT_CMD_READ36_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_READ36_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READ36FORMAT(ptr)->dummy = CONT_CMD_NOP; + READ36FORMAT(ptr)->txsize = CONT_CMD_READ36_VOICE_TX; + READ36FORMAT(ptr)->rxsize = CONT_CMD_READ36_VOICE_RX; + READ36FORMAT(ptr)->cmd = CONT_CMD_READ36_VOICE; + READ36FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceRead36Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + READ36FORMAT(ptr)->addrh = address >> 3; + READ36FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READ36FORMAT(ptr)); + + if (ret == 0) { + if (__osVoiceContDataCrc(READ36FORMAT(ptr)->data, ARRLEN(READ36FORMAT(ptr)->data)) != + READ36FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } else { + bcopy(READ36FORMAT(ptr)->data, buffer, ARRLEN(READ36FORMAT(ptr)->data)); + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/voice/voicecontrolgain.c b/lib/ultralib/src/voice/voicecontrolgain.c new file mode 100644 index 0000000..95e9bb2 --- /dev/null +++ b/lib/ultralib/src/voice/voicecontrolgain.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceControlGain(OSVoiceHandle* hd, s32 analog, s32 digital) { + s32 ret; + u8 cmd; + + static u8 digital_table[] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0 }; + + if (analog == 0) { + cmd = 0x18; + } else { + cmd = 0x98; + } + + ERRCK(__osVoiceSetADConverter(hd->__mq, hd->__channel, cmd)); + + if ((digital < ARRLEN(digital_table)) && (digital >= 0)) { + cmd = digital_table[digital] + 2; + } else { + return CONT_ERR_INVALID; + } + + ERRCK(__osVoiceSetADConverter(hd->__mq, hd->__channel, cmd)); + return ret; +} diff --git a/lib/ultralib/src/voice/voicecontwrite20.c b/lib/ultralib/src/voice/voicecontwrite20.c new file mode 100644 index 0000000..d1a7446 --- /dev/null +++ b/lib/ultralib/src/voice/voicecontwrite20.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/siint.h" + +#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 = 2; + u8 crc; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam; + + if ((__osContLastCmd != CONT_CMD_WRITE20_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_WRITE20_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + WRITE20FORMAT(ptr)->dummy = CONT_CMD_NOP; + WRITE20FORMAT(ptr)->txsize = CONT_CMD_WRITE20_VOICE_TX; + WRITE20FORMAT(ptr)->rxsize = CONT_CMD_WRITE20_VOICE_RX; + WRITE20FORMAT(ptr)->cmd = CONT_CMD_WRITE20_VOICE; + WRITE20FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceWrite20Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + WRITE20FORMAT(ptr)->addrh = address >> 3; + WRITE20FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + bcopy(buffer, WRITE20FORMAT(ptr)->data, ARRLEN(WRITE20FORMAT(ptr)->data)); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + 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 = CHNL_ERR(*WRITE20FORMAT(ptr)); + + if (ret == 0) { + if (crc != WRITE20FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/voice/voicecontwrite4.c b/lib/ultralib/src/voice/voicecontwrite4.c new file mode 100644 index 0000000..6f00586 --- /dev/null +++ b/lib/ultralib/src/voice/voicecontwrite4.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/siint.h" + +#define WRITE4FORMAT(ptr) ((__OSVoiceWrite4Format*)(ptr)) + +s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + u8 status; + int i; + u8* ptr; + s32 retry = 2; + u8 crc; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam; + + if ((__osContLastCmd != CONT_CMD_WRITE4_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_WRITE4_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + WRITE4FORMAT(ptr)->dummy = CONT_CMD_NOP; + WRITE4FORMAT(ptr)->txsize = CONT_CMD_WRITE4_VOICE_TX; + WRITE4FORMAT(ptr)->rxsize = CONT_CMD_WRITE4_VOICE_RX; + WRITE4FORMAT(ptr)->cmd = CONT_CMD_WRITE4_VOICE; + WRITE4FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceWrite4Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + WRITE4FORMAT(ptr)->addrh = address >> 3; + WRITE4FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + bcopy(buffer, WRITE4FORMAT(ptr)->data, ARRLEN(WRITE4FORMAT(ptr)->data)); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + 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 = CHNL_ERR(*WRITE4FORMAT(ptr)); + + if (ret == 0) { + if (crc != WRITE4FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/voice/voicecountsyllables.c b/lib/ultralib/src/voice/voicecountsyllables.c new file mode 100644 index 0000000..b0112ef --- /dev/null +++ b/lib/ultralib/src/voice/voicecountsyllables.c @@ -0,0 +1,55 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" + +// The VRU can store only 880 semisyllables of words in its dictionary. +// Use this function to determine the semisyllable count before adding a word with osVoiceSetWord, +// to properly see whether it will fit. + +void osVoiceCountSyllables(u8* data, u32* syllable) { + s32 k; + u16 sjis; + u16 old; + + old = 0; + *syllable = 1; + for (k = 0; data[k] != 0; k += 2) { + sjis = (data[k] << 8) + data[k + 1]; + if ((sjis == 'あ') || (sjis == 'い') || (sjis == 'う') || (sjis == 'え') || (sjis == 'お') || (sjis == 'ア') || + (sjis == 'イ') || (sjis == 'ウ') || (sjis == 'エ') || (sjis == 'オ')) { + if (k == 0) { + *syllable += 2; + } else { + *syllable += 1; + } + } else if ((sjis == 'か') || (sjis == 'き') || (sjis == 'く') || (sjis == 'け') || (sjis == 'こ') || + (sjis == 'た') || (sjis == 'ち') || (sjis == 'つ') || (sjis == 'て') || (sjis == 'と') || + (sjis == 'ぱ') || (sjis == 'ぴ') || (sjis == 'ぷ') || (sjis == 'ぺ') || (sjis == 'ぽ') || + (sjis == 'カ') || (sjis == 'キ') || (sjis == 'ク') || (sjis == 'ケ') || (sjis == 'コ') || + (sjis == 'タ') || (sjis == 'チ') || (sjis == 'ツ') || (sjis == 'テ') || (sjis == 'ト') || + (sjis == 'パ') || (sjis == 'ピ') || (sjis == 'プ') || (sjis == 'ペ') || (sjis == 'ポ')) { + if (k == 0) { + *syllable += 2; + } else if ((old == 'っ') || (old == 'ッ')) { + *syllable += 2; + } else { + *syllable += 3; + } + } else if ((sjis == 'ぁ') || (sjis == 'ぃ') || (sjis == 'ぅ') || (sjis == 'ぇ') || (sjis == 'ぉ') || + (sjis == 'ゃ') || (sjis == 'ゅ') || (sjis == 'ょ') || (sjis == 'ゎ') + + || (sjis == 'ァ') || (sjis == 'ィ') || (sjis == 'ゥ') || (sjis == 'ェ') || (sjis == 'ォ') || + (sjis == 'ャ') || (sjis == 'ュ') || (sjis == 'ョ') || (sjis == 'ヮ') || (sjis == 'ヵ') || + (sjis == 'ヶ')) { + if ((old == 'あ') || (old == 'い') || (old == 'う') || (old == 'え') || (old == 'お') || (old == 'ア') || + (old == 'イ') || (old == 'ウ') || (old == 'エ') || (old == 'オ')) { + *syllable += 1; + } + } else if ((sjis == 'ん') || (sjis == 'ー') || (sjis == 'っ') || (sjis == 'ン') || (sjis == 'ッ')) { + *syllable += 1; + } else { + *syllable += 2; + } + old = sjis; + } +} diff --git a/lib/ultralib/src/voice/voicecrc.c b/lib/ultralib/src/voice/voicecrc.c new file mode 100644 index 0000000..56b4838 --- /dev/null +++ b/lib/ultralib/src/voice/voicecrc.c @@ -0,0 +1,40 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" + +#define VOICE_CRC_LENGTH 8 +#define VOICE_CRC_GENERATOR 0x85 + +u8 __osVoiceContDataCrc(u8* data, u32 length) { + s32 temp = 0; + u32 i; + u32 j; + + for (i = length; i != 0; i--) { + // Loop over each j in the i starting with most significant + for (j = (1 << (VOICE_CRC_LENGTH - 1)); j != 0; j >>= 1) { + temp <<= 1; + if (*data & j) { + if (temp & (1 << VOICE_CRC_LENGTH)) { + // Same as temp++; temp ^= 0x85 since last j always 0 after the shift + temp ^= VOICE_CRC_GENERATOR - 1; + } else { + temp++; + } + } else if (temp & (1 << VOICE_CRC_LENGTH)) { + temp ^= VOICE_CRC_GENERATOR; + } + } + data++; + } + // Act like a i of zeros is appended to data + do { + temp <<= 1; + if (temp & (1 << VOICE_CRC_LENGTH)) { + temp ^= VOICE_CRC_GENERATOR; + } + } while (++i < VOICE_CRC_LENGTH); + + // Discarding the excess is done automatically by the return type + return temp; +} diff --git a/lib/ultralib/src/voice/voicegetreaddata.c b/lib/ultralib/src/voice/voicegetreaddata.c new file mode 100644 index 0000000..d2f5063 --- /dev/null +++ b/lib/ultralib/src/voice/voicegetreaddata.c @@ -0,0 +1,94 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* micdata) { + s32 ret = 0; + s32 i; + u8 stat; + u8 temp[36]; + static u8 c; + + switch (hd->__mode) { + case 1: + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 1) { + return CONT_ERR_NOT_READY; + } + + ERRCK(__osVoiceContRead2(hd->__mq, hd->__channel, 0, temp)); + + c = temp[0] & 7; + hd->cmd_status = c; + if ((c != 0) && (c != 7)) { + return CONT_ERR_NOT_READY; + } + case 2: + hd->__mode = 2; + + ERRCK(__osVoiceGetStatus(hd->__mq, hd->__channel, &stat)); + + if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + *(u32*)temp = 0x600; + ERRCK(__osVoiceContWrite4(hd->__mq, hd->__channel, 0, temp)); + + case 3: + hd->__mode = 3; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 1) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + ERRCK(__osVoiceContRead36(hd->__mq, hd->__channel, 0, temp)); + + micdata->warning = temp[4] + (temp[5] << 8); + micdata->answer_num = temp[6]; + micdata->voice_level = temp[8] + (temp[9] << 8); + micdata->voice_sn = temp[10] + (temp[11] << 8); + micdata->voice_time = temp[12] + (temp[13] << 8); + + for (i = 0; i < 5; i++) { + micdata->answer[i] = temp[14 + (i << 2)] + (temp[15 + (i << 2)] << 8); + micdata->distance[i] = temp[16 + (i << 2)] + (temp[17 + (i << 2)] << 8); + } + + if (micdata->answer[0] == 0x7FFF) { + micdata->answer_num = 0; + } + + hd->cmd_status = temp[34] & 7; + if ((c == 0) || (hd->cmd_status == 0)) { + break; + } + case 4: + hd->__mode = 4; + + ERRCK(__osVoiceGetStatus(hd->__mq, hd->__channel, &stat)); + + if (stat & 1) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + ERRCK(__osVoiceContRead2(hd->__mq, hd->__channel, 0, temp)); + + hd->cmd_status = temp[0] & 7; + if (temp[0] & 7) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + break; + default: + return CONT_ERR_INVALID; + } + hd->__mode = 0; + return ret; +} diff --git a/lib/ultralib/src/voice/voicegetstatus.c b/lib/ultralib/src/voice/voicegetstatus.c new file mode 100644 index 0000000..e7328c1 --- /dev/null +++ b/lib/ultralib/src/voice/voicegetstatus.c @@ -0,0 +1,62 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/siint.h" + +s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) { + __OSContRequesFormatShort header; + s32 ret = 0; + s32 i; + u8* ptr = (u8*)&__osContPifRam.ramarray; + s32 retry = 2; + + __osSiGetAccess(); + + do { + if (ret != CONT_ERR_CONTRFAIL) { + __osContPifRam.pifstatus = CONT_CMD_EXE; + + for (i = 0; i < port; i++, *ptr++ = CONT_CMD_REQUEST_STATUS) { + ; + } + + *ptr++ = CONT_CMD_REQUEST_STATUS_TX; + *ptr++ = CONT_CMD_REQUEST_STATUS_RX; + *ptr = CONT_CMD_REQUEST_STATUS; + ptr += 4; + *ptr = CONT_CMD_END; + + __osContLastCmd = CONT_CMD_END; + ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + ret = __osSiRawStartDma(OS_READ, &__osContPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ptr = (u8*)&__osContPifRam.ramarray + port; + + header = *((__OSContRequesFormatShort*)ptr); + + ret = (u8)CHNL_ERR(header); + *status = header.status; + + if (ret == 0) { + if (header.typeh == 0 && header.typel == 1) { + if (header.status & 4) { + ret = CONT_ERR_CONTRFAIL; + } + } else { + ret = CONT_ERR_DEVICE; + } + } else if (ret & CONT_NO_RESPONSE_ERROR) { + ret = CONT_ERR_NO_CONTROLLER; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/voice/voiceinit.c b/lib/ultralib/src/voice/voiceinit.c new file mode 100644 index 0000000..5074a84 --- /dev/null +++ b/lib/ultralib/src/voice/voiceinit.c @@ -0,0 +1,42 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* handle, int channel) { + s32 ret; + s32 i; + u8 stat = 0; + u8 buf[4]; + static u8 cmd[] = { 0x1E, 0x6E, 0x08, 0x56, 0x03 }; + + handle->__channel = channel; + handle->__mq = mq; + handle->__mode = 0; + + ERRCK(__osVoiceGetStatus(mq, channel, &stat)); + + ret = __osContChannelReset(mq, channel); + if (ret != 0) { + return CONT_ERR_CONTRFAIL; + } + + for (i = 0; i < ARRLEN(cmd); i++) { + ERRCK(__osVoiceSetADConverter(mq, channel, cmd[i])); + } + + ERRCK(__osVoiceGetStatus(mq, channel, &stat)); + if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + *(u32*)buf = 0x100; + ERRCK(__osVoiceContWrite4(mq, channel, 0, buf)); + + ret = __osVoiceCheckResult(handle, &stat); + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + + return ret; +} diff --git a/lib/ultralib/src/voice/voiceinternal.h b/lib/ultralib/src/voice/voiceinternal.h new file mode 100644 index 0000000..8dc6299 --- /dev/null +++ b/lib/ultralib/src/voice/voiceinternal.h @@ -0,0 +1,18 @@ +#ifndef VOICE_INTERNAL_H +#define VOICE_INTERNAL_H + +// Various prototypes and externs that don't show up in os_voice.h +extern s32 __osPfsLastChannel; + +s32 __osContChannelReset(OSMesgQueue* mq, int channel); + +s32 __osVoiceCheckResult(OSVoiceHandle* hd, u8* stat); +s32 __osVoiceContRead2(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osVoiceContRead36(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osVoiceContWrite20(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +u8 __osVoiceContDataCrc(u8* data, u32 length); +s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status); +s32 __osVoiceSetADConverter(OSMesgQueue*, s32 channel, u8 cmd); + +#endif diff --git a/lib/ultralib/src/voice/voicemaskdictionary.c b/lib/ultralib/src/voice/voicemaskdictionary.c new file mode 100644 index 0000000..39db7ac --- /dev/null +++ b/lib/ultralib/src/voice/voicemaskdictionary.c @@ -0,0 +1,48 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceMaskDictionary(OSVoiceHandle* hd, u8* pattern, int size) { + s32 ret = 0; + s32 i; + s32 j; + u8 stat; + u8 buf[20]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + if (size & 1) { + j = size + 1; + } else { + j = size; + } + + bzero(&buf, ARRLEN(buf)); + + buf[18 - j] = 4; + + for (i = 0; i < j; i += 2) { + buf[i + ARRLEN(buf) - j] = pattern[i]; + buf[i + ARRLEN(buf) - j + 1] = pattern[i + 1]; + } + + if (size & 1) { + buf[ARRLEN(buf) - 1] = 0; + } + + ret = __osVoiceContWrite20(hd->__mq, hd->__channel, 0, (u8*)&buf); + if (ret == 0) { + ret = __osVoiceCheckResult(hd, &stat); + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + } + + return ret; +} diff --git a/lib/ultralib/src/voice/voicesetadconverter.c b/lib/ultralib/src/voice/voicesetadconverter.c new file mode 100644 index 0000000..d1c5eb2 --- /dev/null +++ b/lib/ultralib/src/voice/voicesetadconverter.c @@ -0,0 +1,69 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/siint.h" + +#define SWRITEFORMAT(ptr) ((__OSVoiceSWriteFormat*)(ptr)) + +s32 __osVoiceSetADConverter(OSMesgQueue* mq, s32 channel, u8 data) { + s32 ret = 0; + int i; + u8* ptr; + u8 status; + int retry = 2; + + __osSiGetAccess(); + + do { + + ptr = (u8*)__osPfsPifRam.ramarray; + + if ((__osContLastCmd != CONT_CMD_SWRITE_VOICE) || (__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_SWRITE_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + SWRITEFORMAT(ptr)->txsize = CONT_CMD_SWRITE_VOICE_TX; + SWRITEFORMAT(ptr)->rxsize = CONT_CMD_SWRITE_VOICE_RX; + SWRITEFORMAT(ptr)->cmd = CONT_CMD_SWRITE_VOICE; + SWRITEFORMAT(ptr)->datacrc = 0; + + ptr[sizeof(__OSVoiceSWriteFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + + SWRITEFORMAT(ptr)->data = data; + SWRITEFORMAT(ptr)->scrc = __osContAddressCrc(data << 3); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*SWRITEFORMAT(ptr)); + + if (ret == 0) { + if (SWRITEFORMAT(ptr)->datacrc & 1) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/ultralib/src/voice/voicesetword.c b/lib/ultralib/src/voice/voicesetword.c new file mode 100644 index 0000000..7969fae --- /dev/null +++ b/lib/ultralib/src/voice/voicesetword.c @@ -0,0 +1,54 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceSetWord(OSVoiceHandle* hd, u8* word) { + s32 j; + s32 k; + s32 ret; + u8 stat; + u8 buf[40]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + for (k = 0; word[k] != 0; k += 2) { + ; + } + +#ifndef NDEBUG + if (k >= 34) { + return CONT_ERR_VOICE_WORD; + } +#endif + + bzero(buf, ARRLEN(buf)); + + for (j = 0; j < k; j += 2) { + buf[ARRLEN(buf) - 1 - k + j] = word[j]; + buf[ARRLEN(buf) - 1 - k + j - 1] = word[j + 1]; + } + + buf[ARRLEN(buf) - 1 - j - 5] = 3; + + if (k >= 15) { + ERRCK(__osVoiceContWrite20(hd->__mq, hd->__channel, 0, buf)); + } + ERRCK(__osVoiceContWrite20(hd->__mq, hd->__channel, 0, buf + 20)); + ret = __osVoiceCheckResult(hd, &stat); + if (ret != 0) { + if (ret & 0x100) { + ret = CONT_ERR_VOICE_MEMORY; + } else if (ret & 0x200) { + ret = CONT_ERR_VOICE_WORD; + } else if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + } + return ret; +} diff --git a/lib/ultralib/src/voice/voicestartreaddata.c b/lib/ultralib/src/voice/voicestartreaddata.c new file mode 100644 index 0000000..ea83da0 --- /dev/null +++ b/lib/ultralib/src/voice/voicestartreaddata.c @@ -0,0 +1,36 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceStartReadData(OSVoiceHandle* hd) { + s32 ret; + u8 stat; + u8 temp[4]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + if (hd->__mode != 0) { + return CONT_ERR_INVALID; + } + + *(u32*)temp = 0x5000000; + ret = __osVoiceContWrite4(hd->__mq, hd->__channel, 0, temp); + + if (ret == 0) { + ret = __osVoiceCheckResult(hd, &stat); + + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } else { + hd->__mode = 1; + } + } + + return ret; +} diff --git a/lib/ultralib/src/voice/voicestopreaddata.c b/lib/ultralib/src/voice/voicestopreaddata.c new file mode 100644 index 0000000..b43eb81 --- /dev/null +++ b/lib/ultralib/src/voice/voicestopreaddata.c @@ -0,0 +1,59 @@ +#include "PR/os_internal.h" +#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]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + if (hd->__mode == 0) { + return CONT_ERR_INVALID; + } + + *(u32*)temp = 0x700; + 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) { + if (((ret & 7) == 0) || ((ret & 7) == 7)) { + ret = 0; + hd->__mode = 0; + } else { + ret = CONT_ERR_INVALID; + } + } 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 new file mode 100644 index 0000000..cf0d35e --- /dev/null +++ b/lib/ultralib/tools/Makefile @@ -0,0 +1,46 @@ + +.PHONY: all clean distclean + +# GCC +GCC_DIR := gcc +AR := $(GCC_DIR)/ar +GCC-2.7.2 := $(GCC_DIR)/gcc +STRIP-2.7 := $(GCC_DIR)/strip-2.7 + +# IDO +IDO_DIR := ido +IDO-5.3 := $(IDO_DIR)/cc + +all: $(AR) $(GCC-2.7.2) $(STRIP-2.7) $(IDO-5.3) + +$(AR): | $(GCC_DIR) + wget https://github.com/decompals/mips-binutils-2.6/releases/download/main/binutils-2.6-linux.tar.gz + tar xf binutils-2.6-linux.tar.gz -C $(GCC_DIR) + $(RM) binutils-2.6-linux.tar.gz + +$(GCC-2.7.2): | $(GCC_DIR) + wget https://github.com/decompals/mips-gcc-2.7.2/releases/download/main/gcc-2.7.2-linux.tar.gz + tar xf gcc-2.7.2-linux.tar.gz -C $(GCC_DIR) + $(RM) gcc-2.7.2-linux.tar.gz + +$(STRIP-2.7): | $(GCC_DIR) + wget https://github.com/decompals/mips-binutils-2.7/releases/download/release/binutils-2.7.tar.gz + tar xf binutils-2.7.tar.gz -C $(GCC_DIR) + $(RM) binutils-2.7.tar.gz + +$(GCC_DIR): + mkdir -p $@ + +$(IDO-5.3): | $(IDO_DIR) + 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 $@ + +clean: + $(RM) -rf $(GCC_DIR) + $(RM) -rf $(IDO_DIR) + +distclean: clean diff --git a/lib/ultralib/tools/ar.py b/lib/ultralib/tools/ar.py new file mode 100755 index 0000000..0f3e574 --- /dev/null +++ b/lib/ultralib/tools/ar.py @@ -0,0 +1,476 @@ +#!/usr/bin/env python3 +# +# ar +# + +from genericpath import isfile +import os, struct, time +from dataclasses import dataclass +from libelf import ElfFile, SB_GLOBAL, SHN_UND + +class Archive: + @dataclass + class ArchiveFileRecord: + """ + AR file headers + data + + Offset Length Name Format + 0 16 File identifier ASCII + 16 12 File modification timestamp (in seconds) Decimal + 28 6 Owner ID Decimal + 34 6 Group ID Decimal + 40 8 File mode (type and permission) Octal + 48 10 File size in bytes Decimal + 58 2 Ending characters 0x60 0x0A + """ + name : str + time : int + uid : int + gid : int + mode : int + size : int + data : bytes + + def __init__(self): + self.files = [] # List[ArchiveFileRecord] + self.armap_entries = None + self.time = int(time.time()) + + def add_data(self, name, time, uid, gid, mode, size, data): + self.files.append(Archive.ArchiveFileRecord(name, time, uid, gid, mode, size, data)) + + def add_file(self, file_path): + if not os.path.isfile(file_path): + print(f"Error: No file named {file_path}") + return + + st = os.stat(file_path) + name = os.path.basename(file_path) + time = int(st.st_mtime) + uid = st.st_uid + gid = st.st_gid + mode = st.st_mode + size = st.st_size + + data = None + with open(file_path, "rb") as infile: + data = bytes(infile.read()) + + self.add_data(name, time, uid, gid, mode, size, data) + + def add_ar(self, file_path): + for file in Archive.from_file(file_path).files: + self.add_data(file) + + def build_image(self): + def add_bin(ba, bin): + for b in bin: + ba.append(b) + + def add_str(ba, s, pad_to_len=-1): + if pad_to_len != -1: + s = f"{s:{pad_to_len}}" + s = s.encode("ASCII") + for c in s: + ba.append(c) + + def add_pad(ba): + if len(ba) % 2 != 0: + ba.append(0) + + def add_ar_hdr(ba, name, time, uid, gid, mode, length): + add_str(ba, name, 16) + add_str(ba, str(time), 12) + add_str(ba, str(uid), 6) + add_str(ba, str(gid), 6) + add_str(ba, oct(mode)[2:], 8) + add_str(ba, str(length), 10) + add_str(ba, "`\n") + + b = bytearray() + + # MAGIC + + add_str(b, "!\n") + + # ARMAP + + armap_data= bytearray() + + armap_entries_files = [] + + num_entries = 0 + armap_size = 4 + armap_string_data = bytearray() + for i,file in enumerate(self.files): + elf = ElfFile(file.data) + if elf.symtab is not None: + for sym in elf.symtab.symbol_entries: + if sym.st_shndx != SHN_UND and sym.bind == SB_GLOBAL: + num_entries += 1 + armap_size += 4 + len(sym.name) + 1 + armap_string_data.extend(sym.name.encode("latin1") + b'\0') + armap_entries_files.append(i) + + armap_data.extend(struct.pack(">I", num_entries)) + armap_data.extend([0] * 4 * num_entries) # defer writing file positions until files are emplaced later + armap_data.extend(armap_string_data) + + if len(armap_data) % 4 != 0: + alsiz = (len(armap_data) + 3) & ~3 + armap_data.extend([0] * (alsiz - len(armap_data))) + + current_time = int(time.time()) + + add_ar_hdr(b, "/", current_time, 0, 0, 0, len(armap_data)) + armap_offsets_start = len(b) + 4 + add_bin(b, armap_data) + add_pad(b) + + # LONG STRINGS + + long_strings = "" + + file_names = [] + flag = False + for _,file in enumerate(self.files): + if len(file.name) >= 16: + fname = f"{file.name}/\n" + ind = len(long_strings) + long_strings += fname + else: + fname = f"{file.name}/" + ind = None + file_names.append((fname, ind)) + + # Weird hack + if len(long_strings) != 0 and not flag: + flag = True + long_strings += "/\n" + + long_strings += "/" + + add_ar_hdr(b, "//", current_time, 0, 0, 0, len(long_strings)) + add_str(b, long_strings) + add_pad(b) + + # FILES + + armap_pos = 0 + for i,(file,(fname,ind)) in enumerate(zip(self.files, file_names)): + file_pos = len(b) + add_ar_hdr(b, f"/{ind}" if ind is not None else fname, file.time, file.uid, file.gid, file.mode, file.size) + add_bin(b, file.data) + add_pad(b) + + # Patch the armap with file locations + while armap_pos < len(armap_entries_files) and armap_entries_files[armap_pos] == i: + b[armap_offsets_start+armap_pos*4:armap_offsets_start+armap_pos*4+4] = struct.pack(">I", file_pos) + armap_pos += 1 + + return b + + def write(self, file_path): + ar = self.build_image() + with open(file_path, "wb") as outfile: + outfile.write(ar) + + @staticmethod + def from_image(ar_data): + long_strings = None + ar = Archive() + + assert ar_data[:8].decode("ASCII") == "!\n" , "Not an archive file? Bad file magic value" + + i = 8 + while i < len(ar_data): + file_name = ar_data[i:][ 0:][:16].decode("ASCII").strip() + file_time = int(ar_data[i:][16:][:12].decode("ASCII").strip()) + file_uid = int(ar_data[i:][28:][: 6].decode("ASCII").strip()) + file_gid = int(ar_data[i:][34:][: 6].decode("ASCII").strip()) + file_mode = int(ar_data[i:][40:][: 8].decode("ASCII").strip(), 8) + file_size = int(ar_data[i:][48:][:10].decode("ASCII").strip()) + end = ar_data[i:][58:][:2].decode("ASCII") + assert end == "`\n" + + data = ar_data[i:][60:][:file_size] + assert len(data) == file_size + + if file_name == '/': + """ + "armap" + The special filename "/" denotes that this entry contains a symbol lookup table used by some libraries + to speed up file access. + The symbol table is comprised of three contiguous parts: + - A 32-bit Big Endian integer recording the number of symbol entries. + - A list of 32-bit Big Endian integers for each symbol entry, recording the position within the + archive of the header of the file containing the symbol. + - A list of null-terminated strings, the symbol names for each symbol entry. + + We rebuild this from scratch on write out. + """ + ar.time = file_time + assert file_uid == 0 + assert file_gid == 0 + assert file_mode == 0 + + # Code to interpret the armap, currently unused + """ + armap_n_syms = struct.unpack(">I", data[0:4])[0] + offsets = [i[0] for i in struct.iter_unpack(">I", data[4:4+4*armap_n_syms])] + + strings = [] + ofs = 4 + 4 * armap_n_syms + for _ in range(armap_n_syms): + to = data.find(b'\0', ofs) + assert to != -1 + string = data[ofs:to].decode('latin1') + strings.append(string) + ofs += len(string) + 1 + assert all([b == 0 for b in data[ofs:]]) + assert len(strings) == len(offsets) + + ar.armap_entries = list(zip(offsets, strings)) + """ + elif file_name == '//': + """ + Long string table. Strings larger than 16 are placed here and referenced from the header by /. + + We rebuild this from scratch on write out. + """ + assert file_time == ar.time + assert file_uid == 0 + assert file_gid == 0 + assert file_mode == 0 + long_strings = data.decode("ASCII") + else: + """ + Normal files. + """ + if file_name.startswith("/"): + assert long_strings is not None + # Fetch the name from the long string table + file_name = long_strings[int(file_name[1:]):].split("\n")[0] + # Add file + ar.add_data(file_name[:-1], file_time, file_uid, file_gid, file_mode, file_size, data) + + if file_size % 2 != 0: + file_size += 1 + i += 60 + file_size + + return ar + + @staticmethod + def from_file(file_path): + ar_file = None + with open(file_path, "rb") as infile: + ar_file = infile.read() + + return Archive.from_image(ar_file) + +def ar_usage(progname): + print(f"Usage: {progname} [-]{{dmpqrstx}}[abcDfilMNoOPsSTuvV] [member-name] [count] archive-file file...") + print(f" commands:") + print(f" d - delete file(s) from the archive") + print(f" m[ab] - move file(s) in the archive") + print(f" p - print file(s) found in the archive") + print(f" q[f] - quick append file(s) to the archive") + print(f" r[ab][f][u] - replace existing or insert new file(s) into the archive") + print(f" s - act as ranlib") + print(f" t[O][v] - display contents of the archive") + print(f" x[o] - extract file(s) from the archive") + print(f" command specific modifiers:") + print(f" [a] - put file(s) after [member-name]") + print(f" [b] - put file(s) before [member-name] (same as [i])") + print(f" [D] - use zero for timestamps and uids/gids (default)") + print(f" [U] - use actual timestamps and uids/gids") + print(f" [N] - use instance [count] of name") + print(f" [f] - truncate inserted file names") + print(f" [P] - use full path names when matching") + print(f" [o] - preserve original dates") + print(f" [O] - display offsets of files in the archive") + print(f" [u] - only replace files that are newer than current archive contents") + print(f" generic modifiers:") + print(f" [c] - do not warn if the library had to be created") + print(f" [s] - create an archive index (cf. ranlib)") + print(f" [S] - do not build a symbol table") + print(f" [v] - be verbose") + print(f" [V] - display the version number") + print(f" @ - read options from ") + print(f" --output=DIRNAME - specify the output directory for extraction operations") + return 1 + +def ar(argv): + if len(argv) < 2: + return ar_usage(argv[0]) + + progname = argv[0] + create_ok = False + make_ar_idx = False + no_symtab = False + verbose = False + + def verbose_print(msg): + if verbose: + print(msg) + + def dcmd(modifiers, args): + if modifiers != "": + print(f"{progname}: bad modifiers -- '{modifiers}'") + return ar_usage(progname) + + ar_file = args[0] + o_files = args[1:] + + ar = Archive.from_file(ar_file) + for file in ar.files: + if file.name in o_files: + ar.files.remove(file) + ar.write(ar_file) + return 0 + + def mcmd(modifiers, args): + print("") + return 1 + + def pcmd(modifiers, args): + if modifiers != "": + print(f"{progname}: bad modifiers -- '{modifiers}'") + return ar_usage(progname) + if len(args) != 1: + print(f"{progname} p: bad args") + return ar_usage(progname) + + ar_file = args[0] + + ar = Archive.from_file(ar_file) + for file in ar.files: + print(file.data) + return 0 + + def qcmd(modifiers, args): + print("") + return 1 + + def rcmd(modifiers, args): + if modifiers !="": + print("") + if len(args) < 2: + print(f"{progname} r: bad args") + return ar_usage(progname) + + ar_file = args[0] + o_files = args[1:] + + ar = Archive() + if os.path.isfile(ar_file): + ar = Archive.from_file(ar_file) + else: + if not create_ok: + print(f"Warning: Created file {ar_file}") + ar = Archive() + + for o_file in o_files: + ar.add_file(o_file) + + ar.write(ar_file) + + def scmd(modifiers, args): + print("") + return 1 + + def tcmd(modifiers, args): + # TODO modifiers + + if len(args) != 1: + print(f"{progname} t: bad args") + return ar_usage(progname) + + ar_file = args[0] + + ar = Archive.from_file(ar_file) + for file in ar.files: + print(file.name) + return 0 + + def xcmd(modifiers, args): + if modifiers not in ('', 'o'): + print(f"{progname}: bad modifiers -- '{modifiers}'") + return ar_usage(progname) + if len(args) not in (1, 3) or not (args[0].startswith("--output") or args[1].startswith("--output")): + print(f"{progname} t: bad args") + return ar_usage(progname) + + original_times = modifiers == 'o' + + if args[0].startswith("--output"): + out_dir = args[1] + ar_file = args[2] + elif args[1].startswith("--output"): + out_dir = args[2] + ar_file = args[0] + else: + ar_file = args[0] + out_dir = "" + + # Create dir if not exists + if not os.path.exists(out_dir): + os.makedirs(out_dir, exist_ok=True) + + if not os.path.isdir(out_dir): + print(f"Output directory {out_dir} is a file") + return ar_usage(progname) + + # Extract files to destination + ar = Archive.from_file(ar_file) + for file in ar.files: + opath =os.path.join(out_dir, file.name) + with open(opath, "wb") as ofile: + ofile.write(file.data) + + if not original_times: + t = time.time() + os.utime(opath, (t, t)) + # TODO patch with original dates etc. + + return 0 + + argtbl = { + 'd': dcmd, # delete file(s) from the archive + 'm': mcmd, # [ab] move file(s) in the archive + 'p': pcmd, # print file(s) found in the archive + 'q': qcmd, # [f] quick append file(s) to the archive + 'r': rcmd, # [ab][f][u] replace existing or insert new file(s) into the archive + 's': scmd, # act as ranlib + 't': tcmd, # [O][v] display contents of the archive + 'x': xcmd, # [o] extract file(s) from the archive + } + + arg1 = argv[1] + if arg1[0] == '-': + arg1 = arg1[1:] + cmd = arg1[0] + + if cmd not in argtbl: + print(f"{progname}: invalid option -- '{cmd}'") + return ar_usage(argv[0]) + + modifiers = arg1[1:] + + create_ok = "c" in modifiers + modifiers = modifiers.replace("c","") + make_ar_idx = "s" in modifiers + modifiers = modifiers.replace("s","") + no_symtab = "S" in modifiers + modifiers = modifiers.replace("S","") + verbose = "v" in modifiers + modifiers = modifiers.replace("v","") + + if "V" in modifiers: + print(f"{progname} v1.0") + + return argtbl[cmd](modifiers, argv[2:]) + +if __name__ == '__main__': + import sys + sys.exit(ar(sys.argv)) diff --git a/lib/ultralib/tools/asm_differ/.gitignore b/lib/ultralib/tools/asm_differ/.gitignore new file mode 100644 index 0000000..eb176dc --- /dev/null +++ b/lib/ultralib/tools/asm_differ/.gitignore @@ -0,0 +1,2 @@ +.mypy_cache/ +__pycache__/ diff --git a/lib/ultralib/tools/asm_differ/.gitrepo b/lib/ultralib/tools/asm_differ/.gitrepo new file mode 100644 index 0000000..2e999c8 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = https://github.com/simonlindholm/asm-differ + branch = main + commit = 4b38c884c1efdc3bfa8b14f13015a69368a8d3a2 + parent = 32a1a8061de197c4f10d4904cd72a22dd7cf905c + method = merge + cmdver = 0.4.3 diff --git a/lib/ultralib/tools/asm_differ/.pre-commit-config.yaml b/lib/ultralib/tools/asm_differ/.pre-commit-config.yaml new file mode 100644 index 0000000..6695f71 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: +- repo: https://github.com/psf/black + rev: 20.8b1 + hooks: + - id: black + language_version: python3.6 diff --git a/lib/ultralib/tools/asm_differ/LICENSE b/lib/ultralib/tools/asm_differ/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/lib/ultralib/tools/asm_differ/README.md b/lib/ultralib/tools/asm_differ/README.md new file mode 100644 index 0000000..4a7f329 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/README.md @@ -0,0 +1,56 @@ +# asm-differ + +Nice differ for assembly code. Currently supports MIPS, PPC, AArch64, and ARM32; should be easy to hack to support other instruction sets. + +![](screenshot.png) + +## Dependencies + +- Python >= 3.6 +- `python3 -m pip install --user colorama watchdog python-Levenshtein` (also `dataclasses` if on 3.6) + +## Usage + +Create a file `diff_settings.sh` in some directory (see the one in this repo for an example). Then from that directory, run + +```bash +/path/to/diff.sh [flags] (function|rom addr) +``` + +Recommended flags are `-mwo` (automatically run `make` on source file changes, and include symbols in diff). See `--help` for more details. + +### Tab completion + +[argcomplete](https://kislyuk.github.io/argcomplete/) can be optionally installed (with `python3 -m pip install argcomplete`) to enable tab completion in a bash shell, completing options and symbol names using the linker map. It also requires a bit more setup: + +If invoking the script **exactly** as `./diff.py`, the following should be added to the `.bashrc` according to argcomplete's instructions: + +```bash +eval "$(register-python-argcomplete ./diff.py)" +``` + +If that doesn't work, run `register-python-argcomplete ./diff.py` in your terminal and copy the output to `.bashrc`. + +If setup correctly (don't forget to restart the shell), `complete | grep ./diff.py` should output: + +```bash +complete -o bashdefault -o default -o nospace -F _python_argcomplete ./diff.py +``` + +Note for developers or for general troubleshooting: run `export _ARC_DEBUG=` to enable debug output during tab-completion, it may show otherwise silenced errors. Use `unset _ARC_DEBUG` or restart the terminal to disable. + +### Contributing + +Contributions are very welcome! Some notes on workflow: + +`black` is used for code formatting. You can either run `black diff.py` manually, or set up a pre-commit hook: +```bash +pip install pre-commit black +pre-commit install +``` + +Type annotations are used for all Python code. `mypy` should pass without any errors. + +PRs that skip the above are still welcome, however. + +The targeted Python version is 3.6. There are currently no tests. diff --git a/lib/ultralib/tools/asm_differ/diff-stylesheet.css b/lib/ultralib/tools/asm_differ/diff-stylesheet.css new file mode 100644 index 0000000..79da120 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/diff-stylesheet.css @@ -0,0 +1,67 @@ +table.diff { + border: none; + font-family: Monospace; + white-space: pre; +} +tr.data-ref { + background-color: gray; +} +.immediate { + color: lightblue; +} +.stack { + color: yellow; +} +.register { + color: yellow; +} +.delay-slot { + font-weight: bold; + color: gray; +} +.diff-change { + color: lightblue; +} +.diff-add { + color: green; +} +.diff-remove { + color: red; +} +.source-filename { + font-weight: bold; +} +.source-function { + font-weight: bold; + text-decoration: underline; +} +.source-other { + font-style: italic; +} +.rotation-0 { + color: magenta; +} +.rotation-1 { + color: cyan; +} +.rotation-2 { + color: green; +} +.rotation-3 { + color: red; +} +.rotation-4 { + color: yellow; +} +.rotation-5 { + color: pink; +} +.rotation-6 { + color: blue; +} +.rotation-7 { + color: lime; +} +.rotation-8 { + color: gray; +} diff --git a/lib/ultralib/tools/asm_differ/diff.py b/lib/ultralib/tools/asm_differ/diff.py new file mode 100755 index 0000000..8ed764f --- /dev/null +++ b/lib/ultralib/tools/asm_differ/diff.py @@ -0,0 +1,2923 @@ +#!/usr/bin/env python3 +# PYTHON_ARGCOMPLETE_OK +import argparse +import sys +from typing import ( + Any, + Callable, + Dict, + Iterator, + List, + Match, + NoReturn, + Optional, + Pattern, + Set, + Tuple, + Type, + Union, +) + + +def fail(msg: str) -> NoReturn: + print(msg, file=sys.stderr) + sys.exit(1) + + +def static_assert_unreachable(x: NoReturn) -> NoReturn: + raise Exception("Unreachable! " + repr(x)) + + +# ==== COMMAND-LINE ==== + +if __name__ == "__main__": + # Prefer to use diff_settings.py from the current working directory + sys.path.insert(0, ".") + try: + import diff_settings + except ModuleNotFoundError: + fail("Unable to find diff_settings.py in the same directory.") + sys.path.pop(0) + + try: + import argcomplete + except ModuleNotFoundError: + argcomplete = None + + parser = argparse.ArgumentParser( + description="Diff MIPS, PPC, AArch64, or ARM32 assembly." + ) + + start_argument = parser.add_argument( + "start", + help="Function name or address to start diffing from.", + ) + + if argcomplete: + + def complete_symbol( + prefix: str, parsed_args: argparse.Namespace, **kwargs: object + ) -> List[str]: + if not prefix or prefix.startswith("-"): + # skip reading the map file, which would + # result in a lot of useless completions + return [] + config: Dict[str, Any] = {} + diff_settings.apply(config, parsed_args) # type: ignore + mapfile = config.get("mapfile") + if not mapfile: + return [] + completes = [] + with open(mapfile) as f: + data = f.read() + # assume symbols are prefixed by a space character + search = f" {prefix}" + pos = data.find(search) + while pos != -1: + # skip the space character in the search string + pos += 1 + # assume symbols are suffixed by either a space + # character or a (unix-style) line return + spacePos = data.find(" ", pos) + lineReturnPos = data.find("\n", pos) + if lineReturnPos == -1: + endPos = spacePos + elif spacePos == -1: + endPos = lineReturnPos + else: + endPos = min(spacePos, lineReturnPos) + if endPos == -1: + match = data[pos:] + pos = -1 + else: + match = data[pos:endPos] + pos = data.find(search, endPos) + completes.append(match) + return completes + + setattr(start_argument, "completer", complete_symbol) + + parser.add_argument( + "end", + nargs="?", + help="Address to end diff at.", + ) + parser.add_argument( + "-o", + dest="diff_obj", + action="store_true", + help="""Diff .o files rather than a whole binary. This makes it possible to + see symbol names. (Recommended)""", + ) + parser.add_argument( + "-e", + "--elf", + dest="diff_elf_symbol", + metavar="SYMBOL", + help="""Diff a given function in two ELFs, one being stripped and the other + one non-stripped. Requires objdump from binutils 2.33+.""", + ) + parser.add_argument( + "-c", + "--source", + dest="show_source", + action="store_true", + help="Show source code (if possible). Only works with -o or -e.", + ) + parser.add_argument( + "-C", + "--source-old-binutils", + dest="source_old_binutils", + action="store_true", + help="""Tweak --source handling to make it work with binutils < 2.33. + Implies --source.""", + ) + parser.add_argument( + "-j", + "--section", + dest="diff_section", + default=".text", + metavar="SECTION", + help="Diff restricted to a given output section.", + ) + parser.add_argument( + "-L", + "--line-numbers", + dest="show_line_numbers", + action="store_const", + const=True, + help="""Show source line numbers in output, when available. May be enabled by + default depending on diff_settings.py.""", + ) + parser.add_argument( + "--no-line-numbers", + dest="show_line_numbers", + action="store_const", + const=False, + help="Hide source line numbers in output.", + ) + parser.add_argument( + "--inlines", + dest="inlines", + action="store_true", + help="Show inline function calls (if possible). Only works with -o or -e.", + ) + parser.add_argument( + "--base-asm", + dest="base_asm", + metavar="FILE", + help="Read assembly from given file instead of configured base img.", + ) + parser.add_argument( + "--write-asm", + dest="write_asm", + metavar="FILE", + help="Write the current assembly output to file, e.g. for use with --base-asm.", + ) + parser.add_argument( + "-m", + "--make", + dest="make", + action="store_true", + help="Automatically run 'make' on the .o file or binary before diffing.", + ) + parser.add_argument( + "-l", + "--skip-lines", + dest="skip_lines", + metavar="LINES", + type=int, + default=0, + help="Skip the first LINES lines of output.", + ) + parser.add_argument( + "-s", + "--stop-jr-ra", + dest="stop_jrra", + action="store_true", + help="""Stop disassembling at the first 'jr ra'. Some functions have + multiple return points, so use with care!""", + ) + parser.add_argument( + "-i", + "--ignore-large-imms", + dest="ignore_large_imms", + action="store_true", + help="Pretend all large enough immediates are the same.", + ) + parser.add_argument( + "-I", + "--ignore-addr-diffs", + dest="ignore_addr_diffs", + action="store_true", + help="Ignore address differences. Currently only affects AArch64 and ARM32.", + ) + parser.add_argument( + "-B", + "--no-show-branches", + dest="show_branches", + action="store_false", + help="Don't visualize branches/branch targets.", + ) + parser.add_argument( + "-S", + "--base-shift", + dest="base_shift", + metavar="N", + type=str, + default="0", + help="""Diff position N in our img against position N + shift in the base img. + Arithmetic is allowed, so e.g. |-S "0x1234 - 0x4321"| is a reasonable + flag to pass if it is known that position 0x1234 in the base img syncs + up with position 0x4321 in our img. Not supported together with -o.""", + ) + parser.add_argument( + "-w", + "--watch", + dest="watch", + action="store_true", + help="""Automatically update when source/object files change. + Recommended in combination with -m.""", + ) + parser.add_argument( + "-3", + "--threeway=prev", + dest="threeway", + action="store_const", + const="prev", + help="""Show a three-way diff between target asm, current asm, and asm + prior to -w rebuild. Requires -w.""", + ) + parser.add_argument( + "-b", + "--threeway=base", + dest="threeway", + action="store_const", + const="base", + help="""Show a three-way diff between target asm, current asm, and asm + when diff.py was started. Requires -w.""", + ) + parser.add_argument( + "--width", + dest="column_width", + metavar="COLS", + type=int, + default=50, + help="Sets the width of the left and right view column.", + ) + parser.add_argument( + "--algorithm", + dest="algorithm", + default="levenshtein", + choices=["levenshtein", "difflib"], + help="""Diff algorithm to use. Levenshtein gives the minimum diff, while difflib + aims for long sections of equal opcodes. Defaults to %(default)s.""", + ) + parser.add_argument( + "--max-size", + "--max-lines", + metavar="LINES", + dest="max_lines", + type=int, + default=1024, + help="The maximum length of the diff, in lines.", + ) + parser.add_argument( + "--no-pager", + dest="no_pager", + action="store_true", + help="""Disable the pager; write output directly to stdout, then exit. + Incompatible with --watch.""", + ) + parser.add_argument( + "--format", + choices=("color", "plain", "html", "json"), + default="color", + help="Output format, default is color. --format=html or json implies --no-pager.", + ) + parser.add_argument( + "-U", + "--compress-matching", + metavar="N", + dest="compress_matching", + type=int, + help="""Compress streaks of matching lines, leaving N lines of context + around non-matching parts.""", + ) + parser.add_argument( + "-V", + "--compress-sameinstr", + metavar="N", + dest="compress_sameinstr", + type=int, + help="""Compress streaks of lines with same instructions (but possibly + different regalloc), leaving N lines of context around other parts.""", + ) + + # Project-specific flags, e.g. different versions/make arguments. + add_custom_arguments_fn = getattr(diff_settings, "add_custom_arguments", None) + if add_custom_arguments_fn: + add_custom_arguments_fn(parser) + + if argcomplete: + argcomplete.autocomplete(parser) + +# ==== IMPORTS ==== + +# (We do imports late to optimize auto-complete performance.) + +import abc +import ast +from collections import Counter, defaultdict +from dataclasses import asdict, dataclass, field, replace +import difflib +import enum +import html +import itertools +import json +import os +import queue +import re +import string +import struct +import subprocess +import threading +import time +import traceback + + +MISSING_PREREQUISITES = ( + "Missing prerequisite python module {}. " + "Run `python3 -m pip install --user colorama watchdog python-Levenshtein cxxfilt` to install prerequisites (cxxfilt only needed with --source)." +) + +try: + from colorama import Back, Fore, Style + import watchdog +except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + +# ==== CONFIG ==== + + +@dataclass +class ProjectSettings: + arch_str: str + objdump_executable: str + build_command: List[str] + map_format: str + mw_build_dir: str + baseimg: Optional[str] + myimg: Optional[str] + mapfile: Optional[str] + source_directories: Optional[List[str]] + source_extensions: List[str] + show_line_numbers_default: bool + disassemble_all: bool + + +@dataclass +class Compress: + context: int + same_instr: bool + + +@dataclass +class Config: + arch: "ArchSettings" + + # Build/objdump options + diff_obj: bool + make: bool + source_old_binutils: bool + diff_section: str + inlines: bool + max_function_size_lines: int + max_function_size_bytes: int + + # Display options + formatter: "Formatter" + threeway: Optional[str] + base_shift: int + skip_lines: int + compress: Optional[Compress] + show_branches: bool + show_line_numbers: bool + show_source: bool + stop_jrra: bool + ignore_large_imms: bool + ignore_addr_diffs: bool + algorithm: str + + # Score options + score_stack_differences = True + penalty_stackdiff = 1 + penalty_regalloc = 5 + penalty_reordering = 60 + penalty_insertion = 100 + penalty_deletion = 100 + + +def create_project_settings(settings: Dict[str, Any]) -> ProjectSettings: + return ProjectSettings( + arch_str=settings.get("arch", "mips"), + baseimg=settings.get("baseimg"), + myimg=settings.get("myimg"), + mapfile=settings.get("mapfile"), + build_command=settings.get( + "make_command", ["make", *settings.get("makeflags", [])] + ), + source_directories=settings.get("source_directories"), + source_extensions=settings.get( + "source_extensions", [".c", ".h", ".cpp", ".hpp", ".s"] + ), + objdump_executable=get_objdump_executable(settings.get("objdump_executable")), + map_format=settings.get("map_format", "gnu"), + mw_build_dir=settings.get("mw_build_dir", "build/"), + show_line_numbers_default=settings.get("show_line_numbers_default", True), + disassemble_all=settings.get("disassemble_all", False) + ) + + +def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config: + arch = get_arch(project.arch_str) + + formatter: Formatter + if args.format == "plain": + formatter = PlainFormatter(column_width=args.column_width) + elif args.format == "color": + formatter = AnsiFormatter(column_width=args.column_width) + elif args.format == "html": + formatter = HtmlFormatter() + elif args.format == "json": + formatter = JsonFormatter(arch_str=arch.name) + else: + raise ValueError(f"Unsupported --format: {args.format}") + + compress = None + if args.compress_matching is not None: + compress = Compress(args.compress_matching, False) + if args.compress_sameinstr is not None: + if compress is not None: + raise ValueError( + "Cannot pass both --compress-matching and --compress-sameinstr" + ) + compress = Compress(args.compress_sameinstr, True) + + show_line_numbers = args.show_line_numbers + if show_line_numbers is None: + show_line_numbers = project.show_line_numbers_default + + return Config( + arch=arch, + # Build/objdump options + diff_obj=args.diff_obj, + make=args.make, + source_old_binutils=args.source_old_binutils, + diff_section=args.diff_section, + inlines=args.inlines, + max_function_size_lines=args.max_lines, + max_function_size_bytes=args.max_lines * 4, + # Display options + formatter=formatter, + threeway=args.threeway, + base_shift=eval_int( + args.base_shift, "Failed to parse --base-shift (-S) argument as an integer." + ), + skip_lines=args.skip_lines, + compress=compress, + show_branches=args.show_branches, + show_line_numbers=show_line_numbers, + show_source=args.show_source or args.source_old_binutils, + stop_jrra=args.stop_jrra, + ignore_large_imms=args.ignore_large_imms, + ignore_addr_diffs=args.ignore_addr_diffs, + algorithm=args.algorithm, + ) + + +def get_objdump_executable(objdump_executable: Optional[str]) -> str: + if objdump_executable is not None: + return objdump_executable + + objdump_candidates = [ + "mips-linux-gnu-objdump", + "mips64-elf-objdump", + "mips-elf-objdump", + ] + for objdump_cand in objdump_candidates: + try: + subprocess.check_call( + [objdump_cand, "--version"], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + return objdump_cand + except subprocess.CalledProcessError: + pass + except FileNotFoundError: + pass + + return fail( + f"Missing binutils; please ensure {' or '.join(objdump_candidates)} exists, or configure objdump_executable." + ) + + +def get_arch(arch_str: str) -> "ArchSettings": + for settings in ARCH_SETTINGS: + if arch_str == settings.name: + return settings + raise ValueError(f"Unknown architecture: {arch_str}") + + +BUFFER_CMD: List[str] = ["tail", "-c", str(10 ** 9)] + +# -S truncates long lines instead of wrapping them +# -R interprets color escape sequences +# -i ignores case when searching +# -c something about how the screen gets redrawn; I don't remember the purpose +# -#6 makes left/right arrow keys scroll by 6 characters +LESS_CMD: List[str] = ["less", "-SRic", "-#6"] + +DEBOUNCE_DELAY: float = 0.1 + +# ==== FORMATTING ==== + + +@enum.unique +class BasicFormat(enum.Enum): + NONE = enum.auto() + IMMEDIATE = enum.auto() + STACK = enum.auto() + REGISTER = enum.auto() + DELAY_SLOT = enum.auto() + DIFF_CHANGE = enum.auto() + DIFF_ADD = enum.auto() + DIFF_REMOVE = enum.auto() + SOURCE_FILENAME = enum.auto() + SOURCE_FUNCTION = enum.auto() + SOURCE_LINE_NUM = enum.auto() + SOURCE_OTHER = enum.auto() + + +@dataclass(frozen=True) +class RotationFormat: + group: str + index: int + key: str + + +Format = Union[BasicFormat, RotationFormat] +FormatFunction = Callable[[str], Format] + + +class Text: + segments: List[Tuple[str, Format]] + + def __init__(self, line: str = "", f: Format = BasicFormat.NONE) -> None: + self.segments = [(line, f)] if line else [] + + def reformat(self, f: Format) -> "Text": + return Text(self.plain(), f) + + def plain(self) -> str: + return "".join(s for s, f in self.segments) + + def __repr__(self) -> str: + return f"" + + def __bool__(self) -> bool: + return any(s for s, f in self.segments) + + def __str__(self) -> str: + # Use Formatter.apply(...) instead + return NotImplemented + + def __eq__(self, other: object) -> bool: + return NotImplemented + + def __add__(self, other: Union["Text", str]) -> "Text": + if isinstance(other, str): + other = Text(other) + result = Text() + # If two adjacent segments have the same format, merge their lines + if ( + self.segments + and other.segments + and self.segments[-1][1] == other.segments[0][1] + ): + result.segments = ( + self.segments[:-1] + + [(self.segments[-1][0] + other.segments[0][0], self.segments[-1][1])] + + other.segments[1:] + ) + else: + result.segments = self.segments + other.segments + return result + + def __radd__(self, other: Union["Text", str]) -> "Text": + if isinstance(other, str): + other = Text(other) + return other + self + + def finditer(self, pat: Pattern[str]) -> Iterator[Match[str]]: + """Replacement for `pat.finditer(text)` that operates on the inner text, + and returns the exact same matches as `Text.sub(pat, ...)`.""" + for chunk, f in self.segments: + for match in pat.finditer(chunk): + yield match + + def sub(self, pat: Pattern[str], sub_fn: Callable[[Match[str]], "Text"]) -> "Text": + result = Text() + for chunk, f in self.segments: + i = 0 + for match in pat.finditer(chunk): + start, end = match.start(), match.end() + assert i <= start <= end <= len(chunk) + sub = sub_fn(match) + if i != start: + result.segments.append((chunk[i:start], f)) + result.segments.extend(sub.segments) + i = end + if chunk[i:]: + result.segments.append((chunk[i:], f)) + return result + + def ljust(self, column_width: int) -> "Text": + length = sum(len(x) for x, _ in self.segments) + return self + " " * max(column_width - length, 0) + + +@dataclass +class TableMetadata: + headers: Tuple[Text, ...] + current_score: int + max_score: int + previous_score: Optional[int] + + +class Formatter(abc.ABC): + @abc.abstractmethod + def apply_format(self, chunk: str, f: Format) -> str: + """Apply the formatting `f` to `chunk` and escape the contents.""" + ... + + @abc.abstractmethod + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + """Format a multi-column table with metadata""" + ... + + def apply(self, text: Text) -> str: + return "".join(self.apply_format(chunk, f) for chunk, f in text.segments) + + @staticmethod + def outputline_texts(lines: Tuple["OutputLine", ...]) -> Tuple[Text, ...]: + return tuple([lines[0].base or Text()] + [line.fmt2 for line in lines[1:]]) + + +@dataclass +class PlainFormatter(Formatter): + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + return chunk + + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + rows = [meta.headers] + [self.outputline_texts(ls) for ls in lines] + return "\n".join( + "".join(self.apply(x.ljust(self.column_width)) for x in row) for row in rows + ) + + +@dataclass +class AnsiFormatter(Formatter): + # Additional ansi escape codes not in colorama. See: + # https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters + STYLE_UNDERLINE = "\x1b[4m" + STYLE_NO_UNDERLINE = "\x1b[24m" + STYLE_INVERT = "\x1b[7m" + + BASIC_ANSI_CODES = { + BasicFormat.NONE: "", + BasicFormat.IMMEDIATE: Fore.LIGHTBLUE_EX, + BasicFormat.STACK: Fore.YELLOW, + BasicFormat.REGISTER: Fore.YELLOW, + BasicFormat.DELAY_SLOT: Fore.LIGHTBLACK_EX, + BasicFormat.DIFF_CHANGE: Fore.LIGHTBLUE_EX, + BasicFormat.DIFF_ADD: Fore.GREEN, + BasicFormat.DIFF_REMOVE: Fore.RED, + BasicFormat.SOURCE_FILENAME: Style.DIM + Style.BRIGHT, + BasicFormat.SOURCE_FUNCTION: Style.DIM + Style.BRIGHT + STYLE_UNDERLINE, + BasicFormat.SOURCE_LINE_NUM: Fore.LIGHTBLACK_EX, + BasicFormat.SOURCE_OTHER: Style.DIM, + } + + BASIC_ANSI_CODES_UNDO = { + BasicFormat.NONE: "", + BasicFormat.SOURCE_FILENAME: Style.NORMAL, + BasicFormat.SOURCE_FUNCTION: Style.NORMAL + STYLE_NO_UNDERLINE, + BasicFormat.SOURCE_OTHER: Style.NORMAL, + } + + ROTATION_ANSI_COLORS = [ + Fore.MAGENTA, + Fore.CYAN, + Fore.GREEN, + Fore.RED, + Fore.LIGHTYELLOW_EX, + Fore.LIGHTMAGENTA_EX, + Fore.LIGHTCYAN_EX, + Fore.LIGHTGREEN_EX, + Fore.LIGHTBLACK_EX, + ] + + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + if f == BasicFormat.NONE: + return chunk + undo_ansi_code = Fore.RESET + if isinstance(f, BasicFormat): + ansi_code = self.BASIC_ANSI_CODES[f] + undo_ansi_code = self.BASIC_ANSI_CODES_UNDO.get(f, undo_ansi_code) + elif isinstance(f, RotationFormat): + ansi_code = self.ROTATION_ANSI_COLORS[ + f.index % len(self.ROTATION_ANSI_COLORS) + ] + else: + static_assert_unreachable(f) + return f"{ansi_code}{chunk}{undo_ansi_code}" + + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + rows = [(meta.headers, False)] + [ + (self.outputline_texts(line), line[1].is_data_ref) for line in lines + ] + return "\n".join( + "".join( + (self.STYLE_INVERT if is_data_ref else "") + + self.apply(x.ljust(self.column_width)) + for x in row + ) + for (row, is_data_ref) in rows + ) + + +@dataclass +class HtmlFormatter(Formatter): + rotation_formats: int = 9 + + def apply_format(self, chunk: str, f: Format) -> str: + chunk = html.escape(chunk) + if f == BasicFormat.NONE: + return chunk + if isinstance(f, BasicFormat): + class_name = f.name.lower().replace("_", "-") + data_attr = "" + elif isinstance(f, RotationFormat): + class_name = f"rotation-{f.index % self.rotation_formats}" + rotation_key = html.escape(f"{f.group};{f.key}", quote=True) + data_attr = f'data-rotation="{rotation_key}"' + else: + static_assert_unreachable(f) + return f"{chunk}" + + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + def table_row(line: Tuple[Text, ...], is_data_ref: bool, cell_el: str) -> str: + tr_attrs = " class='data-ref'" if is_data_ref else "" + output_row = f" " + for cell in line: + cell_html = self.apply(cell) + output_row += f"<{cell_el}>{cell_html}" + output_row += "\n" + return output_row + + output = "\n" + output += " \n" + output += table_row(meta.headers, False, "th") + output += " \n" + output += " \n" + output += "".join( + table_row(self.outputline_texts(line), line[1].is_data_ref, "td") + for line in lines + ) + output += " \n" + output += "
\n" + return output + + +@dataclass +class JsonFormatter(Formatter): + arch_str: str + + def apply_format(self, chunk: str, f: Format) -> str: + # This method is unused by this formatter + return NotImplemented + + def table(self, meta: TableMetadata, rows: List[Tuple["OutputLine", ...]]) -> str: + def serialize_format(s: str, f: Format) -> Dict[str, Any]: + if f == BasicFormat.NONE: + return {"text": s} + elif isinstance(f, BasicFormat): + return {"text": s, "format": f.name.lower()} + elif isinstance(f, RotationFormat): + attrs = asdict(f) + attrs.update( + { + "text": s, + "format": "rotation", + } + ) + return attrs + else: + static_assert_unreachable(f) + + def serialize(text: Optional[Text]) -> List[Dict[str, Any]]: + if text is None: + return [] + return [serialize_format(s, f) for s, f in text.segments] + + is_threeway = len(meta.headers) == 3 + + output: Dict[str, Any] = {} + output["arch_str"] = self.arch_str + output["header"] = { + name: serialize(h) + for h, name in zip(meta.headers, ("base", "current", "previous")) + } + output["current_score"] = meta.current_score + output["max_score"] = meta.max_score + if meta.previous_score is not None: + output["previous_score"] = meta.previous_score + output_rows: List[Dict[str, Any]] = [] + for row in rows: + output_row: Dict[str, Any] = {} + output_row["key"] = row[0].key2 + output_row["is_data_ref"] = row[1].is_data_ref + iters = [ + ("base", row[0].base, row[0].line1), + ("current", row[1].fmt2, row[1].line2), + ] + if is_threeway: + iters.append(("previous", row[2].fmt2, row[2].line2)) + if all(line is None for _, _, line in iters): + # Skip rows that were only for displaying source code + continue + for column_name, text, line in iters: + column: Dict[str, Any] = {} + column["text"] = serialize(text) + if line: + if line.line_num is not None: + column["line"] = line.line_num + if line.branch_target is not None: + column["branch"] = line.branch_target + if line.source_lines: + column["src"] = line.source_lines + if line.comment is not None: + column["src_comment"] = line.comment + if line.source_line_num is not None: + column["src_line"] = line.source_line_num + if line or column["text"]: + output_row[column_name] = column + output_rows.append(output_row) + output["rows"] = output_rows + return json.dumps(output) + + +def format_fields( + pat: Pattern[str], + out1: Text, + out2: Text, + color1: FormatFunction, + color2: Optional[FormatFunction] = None, +) -> Tuple[Text, Text]: + diffs = [ + of.group() != nf.group() + for (of, nf) in zip(out1.finditer(pat), out2.finditer(pat)) + ] + + it = iter(diffs) + + def maybe_color(color: FormatFunction, s: str) -> Text: + return Text(s, color(s)) if next(it, False) else Text(s) + + out1 = out1.sub(pat, lambda m: maybe_color(color1, m.group())) + it = iter(diffs) + out2 = out2.sub(pat, lambda m: maybe_color(color2 or color1, m.group())) + + return out1, out2 + + +def symbol_formatter(group: str, base_index: int) -> FormatFunction: + symbol_formats: Dict[str, Format] = {} + + def symbol_format(s: str) -> Format: + # TODO: it would be nice to use a unique Format for each symbol, so we could + # add extra UI elements in the HTML version + f = symbol_formats.get(s) + if f is None: + index = len(symbol_formats) + base_index + f = RotationFormat(key=s, index=index, group=group) + symbol_formats[s] = f + return f + + return symbol_format + + +# ==== LOGIC ==== + +ObjdumpCommand = Tuple[List[str], str, Optional[str]] + + +def maybe_eval_int(expr: str) -> Optional[int]: + try: + ret = ast.literal_eval(expr) + if not isinstance(ret, int): + raise Exception("not an integer") + return ret + except Exception: + return None + + +def eval_int(expr: str, emsg: str) -> int: + ret = maybe_eval_int(expr) + if ret is None: + fail(emsg) + return ret + + +def eval_line_num(expr: str) -> Optional[int]: + expr = expr.strip().replace(":", "") + if expr == "": + return None + return int(expr, 16) + + +def run_make(target: str, project: ProjectSettings) -> None: + subprocess.check_call(project.build_command + [target]) + + +def run_make_capture_output( + target: str, project: ProjectSettings +) -> "subprocess.CompletedProcess[bytes]": + return subprocess.run( + project.build_command + [target], + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + ) + + +def restrict_to_function(dump: str, fn_name: str) -> str: + try: + ind = dump.index("\n", dump.index(f"<{fn_name}>:")) + return dump[ind + 1 :] + except ValueError: + return "" + + +def serialize_data_references(references: List[Tuple[int, int, str]]) -> str: + return "".join( + f"DATAREF {text_offset} {from_offset} {from_section}\n" + for (text_offset, from_offset, from_section) in references + ) + + +def maybe_get_objdump_source_flags(config: Config) -> List[str]: + flags = [] + + if config.show_line_numbers or config.show_source: + flags.append("--line-numbers") + + if config.show_source: + flags.append("--source") + + if not config.source_old_binutils: + flags.append("--source-comment=│ ") + + if config.inlines: + flags.append("--inlines") + + return flags + + +def run_objdump(cmd: ObjdumpCommand, config: Config, project: ProjectSettings) -> str: + flags, target, restrict = cmd + try: + out = subprocess.run( + [project.objdump_executable] + config.arch.arch_flags + flags + [target], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + ).stdout + except subprocess.CalledProcessError as e: + print(e.stdout) + print(e.stderr) + if "unrecognized option '--source-comment" in e.stderr: + fail("** Try using --source-old-binutils instead of --source **") + raise e + + obj_data: Optional[bytes] = None + if config.diff_obj: + with open(target, "rb") as f: + obj_data = f.read() + + return preprocess_objdump_out(restrict, obj_data, out, config) + + +def preprocess_objdump_out( + restrict: Optional[str], obj_data: Optional[bytes], objdump_out: str, config: Config +) -> str: + """ + Preprocess the output of objdump into a format that `process()` expects. + This format is suitable for saving to disk with `--write-asm`. + + - Optionally filter the output to a single function (`restrict`) + - Otherwise, strip objdump header (7 lines) + - Prepend .data references ("DATAREF" lines) when working with object files + """ + out = objdump_out + + if restrict is not None: + out = restrict_to_function(out, restrict) + else: + for i in range(7): + out = out[out.find("\n") + 1 :] + out = out.rstrip("\n") + + if obj_data: + out = serialize_data_references(parse_elf_data_references(obj_data, config)) + out + + return out + + +def search_map_file( + fn_name: str, project: ProjectSettings, config: Config +) -> Tuple[Optional[str], Optional[int]]: + if not project.mapfile: + fail(f"No map file configured; cannot find function {fn_name}.") + + try: + with open(project.mapfile) as f: + contents = f.read() + except Exception: + fail(f"Failed to open map file {project.mapfile} for reading.") + + if project.map_format == "gnu": + lines = contents.split("\n") + + try: + cur_objfile = None + ram_to_rom = None + cands = [] + last_line = "" + for line in lines: + if line.startswith(" " + config.diff_section): + cur_objfile = line.split()[3] + if "load address" in line: + tokens = last_line.split() + line.split() + ram = int(tokens[1], 0) + rom = int(tokens[5], 0) + ram_to_rom = rom - ram + if line.endswith(" " + fn_name): + ram = int(line.split()[0], 0) + if cur_objfile is not None and ram_to_rom is not None: + cands.append((cur_objfile, ram + ram_to_rom)) + last_line = line + except Exception as e: + traceback.print_exc() + fail(f"Internal error while parsing map file") + + if len(cands) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(cands) == 1: + return cands[0] + elif project.map_format == "mw": + section_pattern = re.escape(config.diff_section) + find = re.findall( + re.compile( + # ram elf rom + r" \S+ \S+ (\S+) (\S+) . " + + fn_name + # object name + + r"(?: \(entry of " + section_pattern + r"\))? \t(\S+)" + ), + contents, + ) + if len(find) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(find) == 1: + rom = int(find[0][1], 16) + objname = find[0][2] + # The metrowerks linker map format does not contain the full object path, + # so we must complete it manually. + objfiles = [ + os.path.join(dirpath, f) + for dirpath, _, filenames in os.walk(project.mw_build_dir) + for f in filenames + if f == objname + ] + if len(objfiles) > 1: + all_objects = "\n".join(objfiles) + fail( + f"Found multiple objects of the same name {objname} in {project.mw_build_dir}, " + f"cannot determine which to diff against: \n{all_objects}" + ) + if len(objfiles) == 1: + objfile = objfiles[0] + # TODO Currently the ram-rom conversion only works for diffing ELF + # executables, but it would likely be more convenient to diff DOLs. + # At this time it is recommended to always use -o when running the diff + # script as this mode does not make use of the ram-rom conversion. + return objfile, rom + else: + fail(f"Linker map format {project.map_format} unrecognised.") + return None, None + + +def parse_elf_data_references(data: bytes, config: Config) -> List[Tuple[int, int, str]]: + e_ident = data[:16] + if e_ident[:4] != b"\x7FELF": + return [] + + SHT_SYMTAB = 2 + SHT_REL = 9 + SHT_RELA = 4 + + is_32bit = e_ident[4] == 1 + is_little_endian = e_ident[5] == 1 + str_end = "<" if is_little_endian else ">" + str_off = "I" if is_32bit else "Q" + sym_size = {"B": 1, "H": 2, "I": 4, "Q": 8} + + def read(spec: str, offset: int) -> Tuple[int, ...]: + spec = spec.replace("P", str_off) + size = struct.calcsize(spec) + return struct.unpack(str_end + spec, data[offset : offset + size]) + + ( + e_type, + e_machine, + e_version, + e_entry, + e_phoff, + e_shoff, + e_flags, + e_ehsize, + e_phentsize, + e_phnum, + e_shentsize, + e_shnum, + e_shstrndx, + ) = read("HHIPPPIHHHHHH", 16) + if e_type != 1: # relocatable + return [] + assert e_shoff != 0 + assert e_shnum != 0 # don't support > 0xFF00 sections + assert e_shstrndx != 0 + + @dataclass + class Section: + sh_name: int + sh_type: int + sh_flags: int + sh_addr: int + sh_offset: int + sh_size: int + sh_link: int + sh_info: int + sh_addralign: int + sh_entsize: int + + sections = [ + Section(*read("IIPPPPIIPP", e_shoff + i * e_shentsize)) for i in range(e_shnum) + ] + shstr = sections[e_shstrndx] + sec_name_offs = [shstr.sh_offset + s.sh_name for s in sections] + sec_names = [data[offset : data.index(b"\0", offset)] for offset in sec_name_offs] + + symtab_sections = [i for i in range(e_shnum) if sections[i].sh_type == SHT_SYMTAB] + assert len(symtab_sections) == 1 + symtab = sections[symtab_sections[0]] + + section_name = config.diff_section.encode("utf-8") + text_sections = [i for i in range(e_shnum) if sec_names[i] == section_name and sections[i].sh_size != 0] + if len(text_sections) != 1: + return [] + text_section = text_sections[0] + + ret: List[Tuple[int, int, str]] = [] + for s in sections: + if s.sh_type == SHT_REL or s.sh_type == SHT_RELA: + if s.sh_info == text_section: + # Skip section_name -> section_name references + continue + sec_name = sec_names[s.sh_info].decode("latin1") + if sec_name == ".mwcats.text": + # Skip Metrowerks CATS Utility section + continue + sec_base = sections[s.sh_info].sh_offset + for i in range(0, s.sh_size, s.sh_entsize): + if s.sh_type == SHT_REL: + r_offset, r_info = read("PP", s.sh_offset + i) + else: + r_offset, r_info, r_addend = read("PPP", s.sh_offset + i) + + if is_32bit: + r_sym = r_info >> 8 + r_type = r_info & 0xFF + sym_offset = symtab.sh_offset + symtab.sh_entsize * r_sym + st_name, st_value, st_size, st_info, st_other, st_shndx = read( + "IIIBBH", sym_offset + ) + else: + r_sym = r_info >> 32 + r_type = r_info & 0xFFFFFFFF + sym_offset = symtab.sh_offset + symtab.sh_entsize * r_sym + st_name, st_info, st_other, st_shndx, st_value, st_size = read( + "IBBHQQ", sym_offset + ) + if st_shndx == text_section: + if s.sh_type == SHT_REL: + if e_machine == 8 and r_type == 2: # R_MIPS_32 + (r_addend,) = read("I", sec_base + r_offset) + else: + continue + text_offset = (st_value + r_addend) & 0xFFFFFFFF + ret.append((text_offset, r_offset, sec_name)) + return ret + + +def dump_elf( + start: str, + end: Optional[str], + diff_elf_symbol: str, + config: Config, + project: ProjectSettings, +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if not project.baseimg or not project.myimg: + fail("Missing myimg/baseimg in config.") + if config.base_shift: + fail("--base-shift not compatible with -e") + + start_addr = eval_int(start, "Start address must be an integer expression.") + + if end is not None: + end_addr = eval_int(end, "End address must be an integer expression.") + else: + end_addr = start_addr + config.max_function_size_bytes + + flags1 = [ + f"--start-address={start_addr}", + f"--stop-address={end_addr}", + ] + + if project.disassemble_all: + disassemble_flag = "-D" + else: + disassemble_flag = "-d" + + flags2 = [ + f"--disassemble={diff_elf_symbol}", + ] + + objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] + return ( + project.myimg, + (objdump_flags + flags1, project.baseimg, None), + ( + objdump_flags + flags2 + maybe_get_objdump_source_flags(config), + project.myimg, + None, + ), + ) + + +def dump_objfile( + start: str, end: Optional[str], config: Config, project: ProjectSettings +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if config.base_shift: + fail("--base-shift not compatible with -o") + if end is not None: + fail("end address not supported together with -o") + if start.startswith("0"): + fail("numerical start address not supported with -o; pass a function name") + + objfile, _ = search_map_file(start, project, config) + if not objfile: + fail("Not able to find .o file for function.") + + if config.make: + run_make(objfile, project) + + if not os.path.isfile(objfile): + fail(f"Not able to find .o file for function: {objfile} is not a file.") + + refobjfile = "expected/" + objfile + if not os.path.isfile(refobjfile): + fail(f'Please ensure an OK .o file exists at "{refobjfile}".') + + if project.disassemble_all: + disassemble_flag = "-D" + else: + disassemble_flag = "-d" + + objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] + return ( + objfile, + (objdump_flags, refobjfile, start), + (objdump_flags + maybe_get_objdump_source_flags(config), objfile, start), + ) + + +def dump_binary( + start: str, end: Optional[str], config: Config, project: ProjectSettings +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if not project.baseimg or not project.myimg: + fail("Missing myimg/baseimg in config.") + if config.make: + run_make(project.myimg, project) + start_addr = maybe_eval_int(start) + if start_addr is None: + _, start_addr = search_map_file(start, project, config) + if start_addr is None: + fail("Not able to find function in map file.") + if end is not None: + end_addr = eval_int(end, "End address must be an integer expression.") + else: + end_addr = start_addr + config.max_function_size_bytes + objdump_flags = ["-Dz", "-bbinary"] + ["-EB" if config.arch.big_endian else "-EL"] + flags1 = [ + f"--start-address={start_addr + config.base_shift}", + f"--stop-address={end_addr + config.base_shift}", + ] + flags2 = [f"--start-address={start_addr}", f"--stop-address={end_addr}"] + return ( + project.myimg, + (objdump_flags + flags1, project.baseimg, None), + (objdump_flags + flags2, project.myimg, None), + ) + +# Example: "ldr r4, [pc, #56] ; (4c )" +ARM32_LOAD_POOL_PATTERN = r"(ldr\s+r([0-9]|1[0-3]),\s+\[pc,.*;\s*)(\([a-fA-F0-9]+.*\))" + + +# The base class is a no-op. +class AsmProcessor: + def __init__(self, config: Config) -> None: + self.config = config + + def process_reloc(self, row: str, prev: str) -> str: + return prev + + def normalize(self, mnemonic: str, row: str) -> str: + """This should be called exactly once for each line.""" + arch = self.config.arch + row = self._normalize_arch_specific(mnemonic, row) + if self.config.ignore_large_imms and mnemonic not in arch.branch_instructions: + row = re.sub(self.config.arch.re_large_imm, "", row) + return row + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + return row + + def post_process(self, lines: List["Line"]) -> None: + return + + +class AsmProcessorMIPS(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> str: + arch = self.config.arch + if "R_MIPS_NONE" in row: + # GNU as emits no-op relocations immediately after real ones when + # assembling with -mabi=64. Return without trying to parse 'imm' as an + # integer. + return prev + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + if imm != "0": + # MIPS uses relocations with addends embedded in the code as immediates. + # If there is an immediate, show it as part of the relocation. Ideally + # we'd show this addend in both %lo/%hi, but annoyingly objdump's output + # doesn't include enough information to pair up %lo's and %hi's... + # TODO: handle unambiguous cases where all addends for a symbol are the + # same, or show "+???". + mnemonic = prev.split()[0] + if ( + mnemonic in arch.instructions_with_address_immediates + and not imm.startswith("0x") + ): + imm = "0x" + imm + repl += "+" + imm if int(imm, 0) > 0 else imm + if "R_MIPS_LO16" in row: + repl = f"%lo({repl})" + elif "R_MIPS_HI16" in row: + # Ideally we'd pair up R_MIPS_LO16 and R_MIPS_HI16 to generate a + # correct addend for each, but objdump doesn't give us the order of + # the relocations, so we can't find the right LO16. :( + repl = f"%hi({repl})" + elif "R_MIPS_26" in row: + # Function calls + pass + elif "R_MIPS_PC16" in row: + # Branch to glabel. This gives confusing output, but there's not much + # we can do here. + pass + elif "R_MIPS_GPREL16" in row: + repl = f"%gp_rel({repl})" + else: + assert False, f"unknown relocation type '{row}' for line '{prev}'" + return before + repl + after + + +class AsmProcessorPPC(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> str: + arch = self.config.arch + assert any( + r in row for r in ["R_PPC_REL24", "R_PPC_ADDR16", "R_PPC_EMB_SDA21"] + ), f"unknown relocation type '{row}' for line '{prev}'" + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + if "R_PPC_REL24" in row: + # function calls + pass + elif "R_PPC_ADDR16_HI" in row: + # absolute hi of addr + repl = f"{repl}@h" + elif "R_PPC_ADDR16_HA" in row: + # adjusted hi of addr + repl = f"{repl}@ha" + elif "R_PPC_ADDR16_LO" in row: + # lo of addr + repl = f"{repl}@l" + elif "R_PPC_ADDR16" in row: + # 16-bit absolute addr + if "+0x7" in repl: + # remove the very large addends as they are an artifact of (label-_SDA(2)_BASE_) + # computations and are unimportant in a diff setting. + if int(repl.split("+")[1], 16) > 0x70000000: + repl = repl.split("+")[0] + elif "R_PPC_EMB_SDA21" in row: + # small data area + pass + return before + repl + after + + +class AsmProcessorARM32(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> str: + arch = self.config.arch + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + return before + repl + after + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + if self.config.ignore_addr_diffs: + row = self._normalize_bl(mnemonic, row) + row = self._normalize_data_pool(row) + return row + + def _normalize_bl(self, mnemonic: str, row: str) -> str: + if mnemonic != "bl": + return row + + row, _ = split_off_address(row) + return row + "" + + def _normalize_data_pool(self, row: str) -> str: + pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) + return pool_match.group(1) if pool_match else row + + def post_process(self, lines: List["Line"]) -> None: + lines_by_line_number = {} + for line in lines: + lines_by_line_number[line.line_num] = line + for line in lines: + if line.data_pool_addr is None: + continue + + # Add data symbol and its address to the line. + line_original = lines_by_line_number[line.data_pool_addr].original + value = line_original.split()[1] + addr = "{:x}".format(line.data_pool_addr) + line.original = line.normalized_original + f"={value} ({addr})" + + +class AsmProcessorAArch64(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + self._adrp_pair_registers: Set[str] = set() + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + if self.config.ignore_addr_diffs: + row = self._normalize_adrp_differences(mnemonic, row) + row = self._normalize_bl(mnemonic, row) + return row + + def _normalize_bl(self, mnemonic: str, row: str) -> str: + if mnemonic != "bl": + return row + + row, _ = split_off_address(row) + return row + "" + + def _normalize_adrp_differences(self, mnemonic: str, row: str) -> str: + """Identifies ADRP + LDR/ADD pairs that are used to access the GOT and + suppresses any immediate differences. + + Whenever an ADRP is seen, the destination register is added to the set of registers + that are part of an ADRP + LDR/ADD pair. Registers are removed from the set as soon + as they are used for an LDR or ADD instruction which completes the pair. + + This method is somewhat crude but should manage to detect most such pairs. + """ + row_parts = row.split("\t", 1) + if mnemonic == "adrp": + self._adrp_pair_registers.add(row_parts[1].strip().split(",")[0]) + row, _ = split_off_address(row) + return row + "" + elif mnemonic == "ldr": + for reg in self._adrp_pair_registers: + # ldr xxx, [reg] + # ldr xxx, [reg, ] + if f", [{reg}" in row_parts[1]: + self._adrp_pair_registers.remove(reg) + return normalize_imms(row, AARCH64_SETTINGS) + elif mnemonic == "add": + for reg in self._adrp_pair_registers: + # add reg, reg, + if row_parts[1].startswith(f"{reg}, {reg}, "): + self._adrp_pair_registers.remove(reg) + return normalize_imms(row, AARCH64_SETTINGS) + + return row + + +@dataclass +class ArchSettings: + name: str + re_int: Pattern[str] + re_comment: Pattern[str] + re_reg: Pattern[str] + re_sprel: Pattern[str] + re_large_imm: Pattern[str] + re_imm: Pattern[str] + re_reloc: Pattern[str] + branch_instructions: Set[str] + instructions_with_address_immediates: Set[str] + forbidden: Set[str] = field(default_factory=lambda: set(string.ascii_letters + "_")) + arch_flags: List[str] = field(default_factory=list) + branch_likely_instructions: Set[str] = field(default_factory=set) + proc: Type[AsmProcessor] = AsmProcessor + big_endian: Optional[bool] = True + delay_slot_instructions: Set[str] = field(default_factory=set) + +MIPS_BRANCH_LIKELY_INSTRUCTIONS = { + "beql", + "bnel", + "beqzl", + "bnezl", + "bgezl", + "bgtzl", + "blezl", + "bltzl", + "bc1tl", + "bc1fl", +} +MIPS_BRANCH_INSTRUCTIONS = MIPS_BRANCH_LIKELY_INSTRUCTIONS.union( + { + "b", + "beq", + "bne", + "beqz", + "bnez", + "bgez", + "bgtz", + "blez", + "bltz", + "bc1t", + "bc1f", + } +) + +ARM32_PREFIXES = {"b", "bl"} +ARM32_CONDS = { + "", + "eq", + "ne", + "cs", + "cc", + "mi", + "pl", + "vs", + "vc", + "hi", + "ls", + "ge", + "lt", + "gt", + "le", + "al", +} +ARM32_SUFFIXES = {"", ".n", ".w"} +ARM32_BRANCH_INSTRUCTIONS = { + f"{prefix}{cond}{suffix}" + for prefix in ARM32_PREFIXES + for cond in ARM32_CONDS + for suffix in ARM32_SUFFIXES +} + +AARCH64_BRANCH_INSTRUCTIONS = { + "b", + "b.eq", + "b.ne", + "b.cs", + "b.hs", + "b.cc", + "b.lo", + "b.mi", + "b.pl", + "b.vs", + "b.vc", + "b.hi", + "b.ls", + "b.ge", + "b.lt", + "b.gt", + "b.le", + "cbz", + "cbnz", + "tbz", + "tbnz", +} + +PPC_BRANCH_INSTRUCTIONS = { + "b", + "beq", + "beq+", + "beq-", + "bne", + "bne+", + "bne-", + "blt", + "blt+", + "blt-", + "ble", + "ble+", + "ble-", + "bdnz", + "bdnz+", + "bdnz-", + "bge", + "bge+", + "bge-", + "bgt", + "bgt+", + "bgt-", +} + +MIPS_SETTINGS = ArchSettings( + name="mips", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"<.*?>"), + re_reg=re.compile( + r"\$?\b(a[0-7]|t[0-9]|s[0-8]|at|v[01]|f[12]?[0-9]|f3[01]|kt?[01]|fp|ra|zero)\b" + ), + re_sprel=re.compile(r"(?<=,)([0-9]+|0x[0-9a-f]+)\(sp\)"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(\b|-)([0-9]+|0x[0-9a-fA-F]+)\b(?!\(sp)|%(lo|hi)\([^)]*\)"), + re_reloc=re.compile(r"R_MIPS_"), + arch_flags=["-m", "mips:4300"], + branch_likely_instructions=MIPS_BRANCH_LIKELY_INSTRUCTIONS, + branch_instructions=MIPS_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=MIPS_BRANCH_INSTRUCTIONS.union({"jal", "j"}), + delay_slot_instructions=MIPS_BRANCH_INSTRUCTIONS.union({"j", "jal", "jr", "jalr"}), + proc=AsmProcessorMIPS, +) + +MIPSEL_SETTINGS = replace(MIPS_SETTINGS, name="mipsel", big_endian=False) + +ARM32_SETTINGS = ArchSettings( + name="arm32", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"(<.*?>|//.*$)"), + # Includes: + # - General purpose registers: r0..13 + # - Frame pointer registers: lr (r14), pc (r15) + # - VFP/NEON registers: s0..31, d0..31, q0..15, fpscr, fpexc, fpsid + # SP should not be in this list. + re_reg=re.compile( + r"\$?\b([rq][0-9]|[rq]1[0-5]|pc|lr|[ds][12]?[0-9]|[ds]3[01]|fp(scr|exc|sid))\b" + ), + re_sprel=re.compile(r"sp, #-?(0x[0-9a-fA-F]+|[0-9]+)\b"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(?|//.*$)"), + # GPRs and FP registers: X0-X30, W0-W30, [BHSDVQ]0..31 + # (FP registers may be followed by data width and number of elements, e.g. V0.4S) + # The zero registers and SP should not be in this list. + re_reg=re.compile(r"\$?\b([bhsdvq]([12]?[0-9]|3[01])(\.\d\d?[bhsdvq])?|[xw][12]?[0-9]|[xw]30)\b"), + re_sprel=re.compile(r"sp, #-?(0x[0-9a-fA-F]+|[0-9]+)\b"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(?|//.*$)"), + re_reg=re.compile(r"\$?\b([rf][0-9]+)\b"), + re_sprel=re.compile(r"(?<=,)(-?[0-9]+|-?0x[0-9a-f]+)\(r1\)"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(\b|-)([0-9]+|0x[0-9a-fA-F]+)\b(?!\(r1)|[^@]*@(ha|h|lo)"), + re_reloc=re.compile(r"R_PPC_"), + branch_instructions=PPC_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=PPC_BRANCH_INSTRUCTIONS.union({"bl"}), + proc=AsmProcessorPPC, +) + +ARCH_SETTINGS = [ + MIPS_SETTINGS, + MIPSEL_SETTINGS, + ARM32_SETTINGS, + ARMEL_SETTINGS, + AARCH64_SETTINGS, + PPC_SETTINGS, +] + + +def hexify_int(row: str, pat: Match[str], arch: ArchSettings) -> str: + full = pat.group(0) + if len(full) <= 1: + # leave one-digit ints alone + return full + start, end = pat.span() + if start and row[start - 1] in arch.forbidden: + return full + if end < len(row) and row[end] in arch.forbidden: + return full + return hex(int(full)) + + +def parse_relocated_line(line: str) -> Tuple[str, str, str]: + for c in ",\t ": + if c in line: + ind2 = line.rindex(c) + break + else: + raise Exception(f"failed to parse relocated line: {line}") + before = line[: ind2 + 1] + after = line[ind2 + 1 :] + ind2 = after.find("(") + if ind2 == -1: + imm, after = after, "" + else: + imm, after = after[:ind2], after[ind2:] + if imm == "0x0": + imm = "0" + return before, imm, after + + +def pad_mnemonic(line: str) -> str: + if "\t" not in line: + return line + mn, args = line.split("\t", 1) + return f"{mn:<7s} {args}" + + +@dataclass +class Line: + mnemonic: str + diff_row: str + original: str + normalized_original: str + scorable_line: str + line_num: Optional[int] = None + branch_target: Optional[int] = None + data_pool_addr: Optional[int] = None + source_filename: Optional[str] = None + source_line_num: Optional[int] = None + source_lines: List[str] = field(default_factory=list) + comment: Optional[str] = None + + +def process(dump: str, config: Config) -> List[Line]: + arch = config.arch + processor = arch.proc(config) + skip_next = False + source_lines = [] + source_filename = None + source_line_num = None + + i = 0 + num_instr = 0 + data_refs: Dict[int, Dict[str, List[int]]] = defaultdict(lambda: defaultdict(list)) + output: List[Line] = [] + stop_after_delay_slot = False + lines = dump.split("\n") + while i < len(lines): + row = lines[i] + i += 1 + + if not row: + continue + + if re.match(r"^[0-9a-f]+ <.*>:$", row): + continue + + if row.startswith("DATAREF"): + parts = row.split(" ", 3) + text_offset = int(parts[1]) + from_offset = int(parts[2]) + from_section = parts[3] + data_refs[text_offset][from_section].append(from_offset) + continue + + if config.diff_obj and num_instr >= config.max_function_size_lines: + output.append( + Line( + mnemonic="...", + diff_row="...", + original="...", + normalized_original="...", + scorable_line="...", + ) + ) + break + + if not re.match(r"^\s+[0-9a-f]+:\s+", row): + # This regex is conservative, and assumes the file path does not contain "weird" + # characters like colons, tabs, or angle brackets. + if re.match( + r"^[^ \t<>:][^\t<>:]*:[0-9]+( \(discriminator [0-9]+\))?$", row + ): + source_filename, _, tail = row.rpartition(":") + source_line_num = int(tail.partition(" ")[0]) + source_lines.append(row) + continue + + # If the instructions loads a data pool symbol, extract the address of + # the symbol. + data_pool_addr = None + pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) + if pool_match: + offset = pool_match.group(3).split(" ")[0][1:] + data_pool_addr = int(offset, 16) + + m_comment = re.search(arch.re_comment, row) + comment = m_comment[0] if m_comment else None + row = re.sub(arch.re_comment, "", row) + line_num_str = row.split(":")[0] + row = row.rstrip() + tabs = row.split("\t") + row = "\t".join(tabs[2:]) + line_num = eval_line_num(line_num_str.strip()) + + if line_num in data_refs: + refs = data_refs[line_num] + ref_str = "; ".join( + section_name + "+" + ",".join(hex(off) for off in offs) + for section_name, offs in refs.items() + ) + output.append( + Line( + mnemonic="", + diff_row="", + original=ref_str, + normalized_original=ref_str, + scorable_line="", + ) + ) + + if "\t" in row: + row_parts = row.split("\t", 1) + else: + # powerpc-eabi-objdump doesn't use tabs + row_parts = [part.lstrip() for part in row.split(" ", 1)] + mnemonic = row_parts[0].strip() + + if mnemonic not in arch.instructions_with_address_immediates: + row = re.sub(arch.re_int, lambda m: hexify_int(row, m, arch), row) + + # Let 'original' be 'row' with relocations applied, while we continue + # transforming 'row' into a coarser version that ignores registers and + # immediates. + original = row + + while i < len(lines): + reloc_row = lines[i] + if re.search(arch.re_reloc, reloc_row): + original = processor.process_reloc(reloc_row, original) + else: + break + i += 1 + + normalized_original = processor.normalize(mnemonic, original) + + scorable_line = normalized_original + if not config.score_stack_differences: + scorable_line = re.sub(arch.re_sprel, "addr(sp)", scorable_line) + if mnemonic in arch.branch_instructions: + # Replace the final argument with "" + scorable_line = re.sub(r"[^, \t]+$", "", scorable_line) + + if skip_next: + skip_next = False + row = "" + mnemonic = "" + scorable_line = "" + if mnemonic in arch.branch_likely_instructions: + skip_next = True + + row = re.sub(arch.re_reg, "", row) + row = re.sub(arch.re_sprel, "addr(sp)", row) + row_with_imm = row + if mnemonic in arch.instructions_with_address_immediates: + row = row.strip() + row, _ = split_off_address(row) + row += "" + else: + row = normalize_imms(row, arch) + + branch_target = None + if mnemonic in arch.branch_instructions: + branch_target = int(row_parts[1].strip().split(",")[-1], 16) + if mnemonic in arch.branch_likely_instructions: + branch_target -= 4 + + output.append( + Line( + mnemonic=mnemonic, + diff_row=row, + original=original, + normalized_original=normalized_original, + scorable_line=scorable_line, + line_num=line_num, + branch_target=branch_target, + data_pool_addr=data_pool_addr, + source_filename=source_filename, + source_line_num=source_line_num, + source_lines=source_lines, + comment=comment, + ) + ) + num_instr += 1 + source_lines = [] + + if config.stop_jrra and mnemonic == "jr" and row_parts[1].strip() == "ra": + stop_after_delay_slot = True + elif stop_after_delay_slot: + break + + processor.post_process(output) + return output + + +def normalize_imms(row: str, arch: ArchSettings) -> str: + return re.sub(arch.re_imm, "", row) + + +def normalize_stack(row: str, arch: ArchSettings) -> str: + return re.sub(arch.re_sprel, "addr(sp)", row) + + +def imm_matches_everything(row: str, arch: ArchSettings) -> bool: + # (this should probably be arch-specific) + return "(." in row + + +def split_off_address(line: str) -> Tuple[str, str]: + """Split e.g. 'beqz $r0,1f0' into 'beqz $r0,' and '1f0'.""" + parts = line.split(",") + if len(parts) < 2: + parts = line.split(None, 1) + off = len(line) - len(parts[-1]) + return line[:off], line[off:] + + +def diff_sequences_difflib( + seq1: List[str], seq2: List[str] +) -> List[Tuple[str, int, int, int, int]]: + differ = difflib.SequenceMatcher(a=seq1, b=seq2, autojunk=False) + return differ.get_opcodes() + + +def diff_sequences( + seq1: List[str], seq2: List[str], algorithm: str +) -> List[Tuple[str, int, int, int, int]]: + if ( + algorithm != "levenshtein" + or len(seq1) * len(seq2) > 4 * 10 ** 8 + or len(seq1) + len(seq2) >= 0x110000 + ): + return diff_sequences_difflib(seq1, seq2) + + # The Levenshtein library assumes that we compare strings, not lists. Convert. + # (Per the check above we know we have fewer than 0x110000 unique elements, so chr() works.) + remapping: Dict[str, str] = {} + + def remap(seq: List[str]) -> str: + seq = seq[:] + for i in range(len(seq)): + val = remapping.get(seq[i]) + if val is None: + val = chr(len(remapping)) + remapping[seq[i]] = val + seq[i] = val + return "".join(seq) + + rem1 = remap(seq1) + rem2 = remap(seq2) + import Levenshtein + + ret: List[Tuple[str, int, int, int, int]] = Levenshtein.opcodes(rem1, rem2) + return ret + + +def diff_lines( + lines1: List[Line], + lines2: List[Line], + algorithm: str, +) -> List[Tuple[Optional[Line], Optional[Line]]]: + ret = [] + for (tag, i1, i2, j1, j2) in diff_sequences( + [line.mnemonic for line in lines1], + [line.mnemonic for line in lines2], + algorithm, + ): + for line1, line2 in itertools.zip_longest(lines1[i1:i2], lines2[j1:j2]): + if tag == "replace": + if line1 is None: + tag = "insert" + elif line2 is None: + tag = "delete" + elif tag == "insert": + assert line1 is None + elif tag == "delete": + assert line2 is None + ret.append((line1, line2)) + + return ret + + +def score_diff_lines( + lines: List[Tuple[Optional[Line], Optional[Line]]], config: Config +) -> int: + # This logic is copied from `scorer.py` from the decomp permuter project + # https://github.com/simonlindholm/decomp-permuter/blob/main/src/scorer.py + score = 0 + deletions = [] + insertions = [] + + def lo_hi_match(old: str, new: str) -> bool: + # TODO: Make this arch-independent, like `imm_matches_everything()` + old_lo = old.find("%lo") + old_hi = old.find("%hi") + new_lo = new.find("%lo") + new_hi = new.find("%hi") + + if old_lo != -1 and new_lo != -1: + old_idx = old_lo + new_idx = new_lo + elif old_hi != -1 and new_hi != -1: + old_idx = old_hi + new_idx = new_hi + else: + return False + + if old[:old_idx] != new[:new_idx]: + return False + + old_inner = old[old_idx + 4 : -1] + new_inner = new[new_idx + 4 : -1] + return old_inner.startswith(".") or new_inner.startswith(".") + + def diff_sameline(old: str, new: str) -> None: + nonlocal score + if old == new: + return + + if lo_hi_match(old, new): + return + + ignore_last_field = False + if config.score_stack_differences: + oldsp = re.search(config.arch.re_sprel, old) + newsp = re.search(config.arch.re_sprel, new) + if oldsp and newsp: + oldrel = int(oldsp.group(1) or "0", 0) + newrel = int(newsp.group(1) or "0", 0) + score += abs(oldrel - newrel) * config.penalty_stackdiff + ignore_last_field = True + + # Probably regalloc difference, or signed vs unsigned + + # Compare each field in order + newfields, oldfields = new.split(","), old.split(",") + if ignore_last_field: + newfields = newfields[:-1] + oldfields = oldfields[:-1] + for nf, of in zip(newfields, oldfields): + if nf != of: + score += config.penalty_regalloc + # Penalize any extra fields + score += abs(len(newfields) - len(oldfields)) * config.penalty_regalloc + + def diff_insert(line: str) -> None: + # Reordering or totally different codegen. + # Defer this until later when we can tell. + insertions.append(line) + + def diff_delete(line: str) -> None: + deletions.append(line) + + # Find the end of the last long streak of matching mnemonics, if it looks + # like the objdump output was truncated. This is used to skip scoring + # misaligned lines at the end of the diff. + last_mismatch = -1 + max_index = None + lines_were_truncated = False + for index, (line1, line2) in enumerate(lines): + if (line1 and line1.original == "...") or (line2 and line2.original == "..."): + lines_were_truncated = True + if line1 and line2 and line1.mnemonic == line2.mnemonic: + if index - last_mismatch >= 50: + max_index = index + else: + last_mismatch = index + if not lines_were_truncated: + max_index = None + + for index, (line1, line2) in enumerate(lines): + if max_index is not None and index > max_index: + break + if line1 and line2 and line1.mnemonic == line2.mnemonic: + diff_sameline(line1.scorable_line, line2.scorable_line) + else: + if line1: + diff_delete(line1.scorable_line) + if line2: + diff_insert(line2.scorable_line) + + insertions_co = Counter(insertions) + deletions_co = Counter(deletions) + for item in insertions_co + deletions_co: + ins = insertions_co[item] + dels = deletions_co[item] + common = min(ins, dels) + score += ( + (ins - common) * config.penalty_insertion + + (dels - common) * config.penalty_deletion + + config.penalty_reordering * common + ) + + return score + + +@dataclass(frozen=True) +class OutputLine: + base: Optional[Text] = field(compare=False) + fmt2: Text = field(compare=False) + key2: Optional[str] + boring: bool = field(compare=False) + is_data_ref: bool = field(compare=False) + line1: Optional[Line] = field(compare=False) + line2: Optional[Line] = field(compare=False) + + +@dataclass(frozen=True) +class Diff: + lines: List[OutputLine] + score: int + max_score: int + + +def trim_nops(lines: List[Line], arch: ArchSettings) -> List[Line]: + lines = lines[:] + while lines and lines[-1].mnemonic == "nop" and (len(lines) == 1 or lines[-2].mnemonic not in arch.delay_slot_instructions): + lines.pop() + return lines + +def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff: + if config.show_source: + import cxxfilt + arch = config.arch + fmt = config.formatter + output: List[OutputLine] = [] + + sc1 = symbol_formatter("base-reg", 0) + sc2 = symbol_formatter("my-reg", 0) + sc3 = symbol_formatter("base-stack", 4) + sc4 = symbol_formatter("my-stack", 4) + sc5 = symbol_formatter("base-branch", 0) + sc6 = symbol_formatter("my-branch", 0) + bts1: Set[int] = set() + bts2: Set[int] = set() + + if config.show_branches: + for (lines, btset, sc) in [ + (lines1, bts1, sc5), + (lines2, bts2, sc6), + ]: + for line in lines: + bt = line.branch_target + if bt is not None: + btset.add(bt) + sc(str(bt)) + + lines1 = trim_nops(lines1, arch) + lines2 = trim_nops(lines2, arch) + + diffed_lines = diff_lines(lines1, lines2, config.algorithm) + score = score_diff_lines(diffed_lines, config) + max_score = len(lines1) * config.penalty_deletion + + line_num_base = -1 + line_num_offset = 0 + line_num_2to1 = {} + for (line1, line2) in diffed_lines: + if line1 is not None and line1.line_num is not None: + line_num_base = line1.line_num + line_num_offset = 0 + else: + line_num_offset += 1 + if line2 is not None and line2.line_num is not None: + line_num_2to1[line2.line_num] = (line_num_base, line_num_offset) + + for (line1, line2) in diffed_lines: + line_color1 = line_color2 = sym_color = BasicFormat.NONE + line_prefix = " " + is_data_ref = False + out1 = Text() if not line1 else Text(pad_mnemonic(line1.original)) + out2 = Text() if not line2 else Text(pad_mnemonic(line2.original)) + if line1 and line2 and line1.diff_row == line2.diff_row: + if line1.diff_row == "": + if line1.normalized_original != line2.normalized_original: + line_prefix = "i" + sym_color = BasicFormat.DIFF_CHANGE + out1 = out1.reformat(sym_color) + out2 = out2.reformat(sym_color) + is_data_ref = True + elif ( + line1.normalized_original == line2.normalized_original + and line2.branch_target is None + ): + # Fast path: no coloring needed. We don't include branch instructions + # in this case because we need to check that their targets line up in + # the diff, and don't just happen to have the are the same address + # by accident. + pass + elif line1.diff_row == "": + # Don't draw attention to differing branch-likely delay slots: they + # typically mirror the branch destination - 1 so the real difference + # is elsewhere. Still, do mark them as different to avoid confusion. + # No need to consider branches because delay slots can't branch. + out1 = out1.reformat(BasicFormat.DELAY_SLOT) + out2 = out2.reformat(BasicFormat.DELAY_SLOT) + else: + mnemonic = line1.original.split()[0] + branchless1, address1 = out1.plain(), "" + branchless2, address2 = out2.plain(), "" + if mnemonic in arch.instructions_with_address_immediates: + branchless1, address1 = split_off_address(branchless1) + branchless2, address2 = split_off_address(branchless2) + + out1 = Text(branchless1) + out2 = Text(branchless2) + out1, out2 = format_fields( + arch.re_imm, out1, out2, lambda _: BasicFormat.IMMEDIATE + ) + + if line2.branch_target is not None: + target = line2.branch_target + line2_target = line_num_2to1.get(line2.branch_target) + if line2_target is None: + # If the target is outside the disassembly, extrapolate. + # This only matters near the bottom. + assert line2.line_num is not None + line2_line = line_num_2to1[line2.line_num] + line2_target = (line2_line[0] + (target - line2.line_num), 0) + + # Set the key for three-way diffing to a normalized version. + norm2, norm_branch2 = split_off_address(line2.normalized_original) + if norm_branch2 != "": + line2.normalized_original = norm2 + str(line2_target) + same_target = line2_target == (line1.branch_target, 0) + else: + # Do a naive comparison for non-branches (e.g. function calls). + same_target = address1 == address2 + + if normalize_imms(branchless1, arch) == normalize_imms( + branchless2, arch + ): + if imm_matches_everything(branchless2, arch): + # ignore differences due to %lo(.rodata + ...) vs symbol + out1 = out1.reformat(BasicFormat.NONE) + out2 = out2.reformat(BasicFormat.NONE) + elif line2.branch_target is not None and same_target: + # same-target branch, don't color + pass + else: + # must have an imm difference (or else we would have hit the + # fast path) + sym_color = BasicFormat.IMMEDIATE + line_prefix = "i" + else: + out1, out2 = format_fields(arch.re_sprel, out1, out2, sc3, sc4) + if normalize_stack(branchless1, arch) == normalize_stack( + branchless2, arch + ): + # only stack differences (luckily stack and imm + # differences can't be combined in MIPS, so we + # don't have to think about that case) + sym_color = BasicFormat.STACK + line_prefix = "s" + else: + # reg differences and maybe imm as well + out1, out2 = format_fields(arch.re_reg, out1, out2, sc1, sc2) + line_color1 = line_color2 = sym_color = BasicFormat.REGISTER + line_prefix = "r" + + if same_target: + address_imm_fmt = BasicFormat.NONE + else: + address_imm_fmt = BasicFormat.IMMEDIATE + out1 += Text(address1, address_imm_fmt) + out2 += Text(address2, address_imm_fmt) + elif line1 and line2: + line_prefix = "|" + line_color1 = line_color2 = sym_color = BasicFormat.DIFF_CHANGE + out1 = out1.reformat(line_color1) + out2 = out2.reformat(line_color2) + elif line1: + line_prefix = "<" + line_color1 = sym_color = BasicFormat.DIFF_REMOVE + out1 = out1.reformat(line_color1) + out2 = Text() + elif line2: + line_prefix = ">" + line_color2 = sym_color = BasicFormat.DIFF_ADD + out1 = Text() + out2 = out2.reformat(line_color2) + + if config.show_source and line2 and line2.comment: + out2 += f" {line2.comment}" + + def format_part( + out: Text, + line: Optional[Line], + line_color: Format, + btset: Set[int], + sc: FormatFunction, + ) -> Optional[Text]: + if line is None: + return None + if line.line_num is None: + return out + in_arrow = Text(" ") + out_arrow = Text() + if config.show_branches: + if line.line_num in btset: + in_arrow = Text("~>", sc(str(line.line_num))) + if line.branch_target is not None: + out_arrow = " " + Text("~>", sc(str(line.branch_target))) + formatted_line_num = Text(hex(line.line_num)[2:] + ":", line_color) + return formatted_line_num + " " + in_arrow + " " + out + out_arrow + + part1 = format_part(out1, line1, line_color1, bts1, sc5) + part2 = format_part(out2, line2, line_color2, bts2, sc6) + + if config.show_source and line2: + for source_line in line2.source_lines: + line_format = BasicFormat.SOURCE_OTHER + if config.source_old_binutils: + if source_line and re.fullmatch(".*\.c(?:pp)?:\d+", source_line): + line_format = BasicFormat.SOURCE_FILENAME + elif source_line and source_line.endswith("():"): + line_format = BasicFormat.SOURCE_FUNCTION + try: + source_line = cxxfilt.demangle( + source_line[:-3], external_only=False + ) + except: + pass + else: + # File names and function names + if source_line and source_line[0] != "│": + line_format = BasicFormat.SOURCE_FILENAME + # Function names + if source_line.endswith("():"): + line_format = BasicFormat.SOURCE_FUNCTION + try: + source_line = cxxfilt.demangle( + source_line[:-3], external_only=False + ) + except: + pass + padding = " " * 7 if config.show_line_numbers else " " * 2 + output.append( + OutputLine( + base=None, + fmt2=padding + Text(source_line, line_format), + key2=source_line, + boring=True, + is_data_ref=False, + line1=None, + line2=None, + ) + ) + + key2 = line2.normalized_original if line2 else None + boring = False + if line_prefix == " ": + boring = True + elif config.compress and config.compress.same_instr and line_prefix in "irs": + boring = True + + if config.show_line_numbers: + if line2 and line2.source_line_num is not None: + num_color = ( + BasicFormat.SOURCE_LINE_NUM + if sym_color == BasicFormat.NONE + else sym_color + ) + num2 = Text(f"{line2.source_line_num:5}", num_color) + else: + num2 = Text(" " * 5) + else: + num2 = Text() + + fmt2 = Text(line_prefix, sym_color) + num2 + " " + (part2 or Text()) + + output.append( + OutputLine( + base=part1, + fmt2=fmt2, + key2=key2, + boring=boring, + is_data_ref=is_data_ref, + line1=line1, + line2=line2, + ) + ) + + output = output[config.skip_lines :] + return Diff(lines=output, score=score, max_score=max_score) + + +def chunk_diff_lines( + diff: List[OutputLine], +) -> List[Union[List[OutputLine], OutputLine]]: + """Chunk a diff into an alternating list like A B A B ... A, where: + * A is a List[OutputLine] of insertions, + * B is a single non-insertion OutputLine, with .base != None.""" + cur_right: List[OutputLine] = [] + chunks: List[Union[List[OutputLine], OutputLine]] = [] + for output_line in diff: + if output_line.base is not None: + chunks.append(cur_right) + chunks.append(output_line) + cur_right = [] + else: + cur_right.append(output_line) + chunks.append(cur_right) + return chunks + + +def compress_matching( + li: List[Tuple[OutputLine, ...]], context: int +) -> List[Tuple[OutputLine, ...]]: + ret: List[Tuple[OutputLine, ...]] = [] + matching_streak: List[Tuple[OutputLine, ...]] = [] + context = max(context, 0) + + def flush_matching() -> None: + if len(matching_streak) <= 2 * context + 1: + ret.extend(matching_streak) + else: + ret.extend(matching_streak[:context]) + skipped = len(matching_streak) - 2 * context + filler = OutputLine( + base=Text(f"<{skipped} lines>", BasicFormat.SOURCE_OTHER), + fmt2=Text(), + key2=None, + boring=False, + is_data_ref=False, + line1=None, + line2=None, + ) + columns = len(matching_streak[0]) + ret.append(tuple([filler] * columns)) + if context > 0: + ret.extend(matching_streak[-context:]) + matching_streak.clear() + + for line in li: + if line[0].boring: + matching_streak.append(line) + else: + flush_matching() + ret.append(line) + + flush_matching() + return ret + + +def align_diffs( + old_diff: Diff, new_diff: Diff, config: Config +) -> Tuple[TableMetadata, List[Tuple[OutputLine, ...]]]: + meta: TableMetadata + diff_lines: List[Tuple[OutputLine, ...]] + padding = " " * 7 if config.show_line_numbers else " " * 2 + + if config.threeway: + meta = TableMetadata( + headers=( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + Text(f"{padding}PREVIOUS ({old_diff.score})"), + ), + current_score=new_diff.score, + max_score=new_diff.max_score, + previous_score=old_diff.score, + ) + old_chunks = chunk_diff_lines(old_diff.lines) + new_chunks = chunk_diff_lines(new_diff.lines) + diff_lines = [] + empty = OutputLine(Text(), Text(), None, True, False, None, None) + assert len(old_chunks) == len(new_chunks), "same target" + for old_chunk, new_chunk in zip(old_chunks, new_chunks): + if isinstance(old_chunk, list): + assert isinstance(new_chunk, list) + if not old_chunk and not new_chunk: + # Most of the time lines sync up without insertions/deletions, + # and there's no interdiffing to be done. + continue + differ = difflib.SequenceMatcher( + a=old_chunk, b=new_chunk, autojunk=False + ) + for (tag, i1, i2, j1, j2) in differ.get_opcodes(): + if tag in ["equal", "replace"]: + for i, j in zip(range(i1, i2), range(j1, j2)): + diff_lines.append((empty, new_chunk[j], old_chunk[i])) + if tag in ["insert", "replace"]: + for j in range(j1 + i2 - i1, j2): + diff_lines.append((empty, new_chunk[j], empty)) + if tag in ["delete", "replace"]: + for i in range(i1 + j2 - j1, i2): + diff_lines.append((empty, empty, old_chunk[i])) + else: + assert isinstance(new_chunk, OutputLine) + # old_chunk.base and new_chunk.base have the same text since + # both diffs are based on the same target, but they might + # differ in color. Use the new version. + diff_lines.append((new_chunk, new_chunk, old_chunk)) + diff_lines = [ + (base, new, old if old != new else empty) for base, new, old in diff_lines + ] + else: + meta = TableMetadata( + headers=( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + ), + current_score=new_diff.score, + max_score=new_diff.max_score, + previous_score=None, + ) + diff_lines = [(line, line) for line in new_diff.lines] + if config.compress: + diff_lines = compress_matching(diff_lines, config.compress.context) + return meta, diff_lines + + +def debounced_fs_watch( + targets: List[str], + outq: "queue.Queue[Optional[float]]", + config: Config, + project: ProjectSettings, +) -> None: + import watchdog.events + import watchdog.observers + + class WatchEventHandler(watchdog.events.FileSystemEventHandler): + def __init__( + self, queue: "queue.Queue[float]", file_targets: List[str] + ) -> None: + self.queue = queue + self.file_targets = file_targets + + def on_modified(self, ev: object) -> None: + if isinstance(ev, watchdog.events.FileModifiedEvent): + self.changed(ev.src_path) + + def on_moved(self, ev: object) -> None: + if isinstance(ev, watchdog.events.FileMovedEvent): + self.changed(ev.dest_path) + + def should_notify(self, path: str) -> bool: + for target in self.file_targets: + if os.path.normpath(path) == target: + return True + if config.make and any( + path.endswith(suffix) for suffix in project.source_extensions + ): + return True + return False + + def changed(self, path: str) -> None: + if self.should_notify(path): + self.queue.put(time.time()) + + def debounce_thread() -> NoReturn: + listenq: "queue.Queue[float]" = queue.Queue() + file_targets: List[str] = [] + event_handler = WatchEventHandler(listenq, file_targets) + observer = watchdog.observers.Observer() + observed = set() + for target in targets: + if os.path.isdir(target): + observer.schedule(event_handler, target, recursive=True) + else: + file_targets.append(os.path.normpath(target)) + target = os.path.dirname(target) or "." + if target not in observed: + observed.add(target) + observer.schedule(event_handler, target) + observer.start() + while True: + t = listenq.get() + more = True + while more: + delay = t + DEBOUNCE_DELAY - time.time() + if delay > 0: + time.sleep(delay) + # consume entire queue + more = False + try: + while True: + t = listenq.get(block=False) + more = True + except queue.Empty: + pass + outq.put(t) + + th = threading.Thread(target=debounce_thread, daemon=True) + th.start() + + +class Display: + basedump: str + mydump: str + last_refresh_key: object + config: Config + emsg: Optional[str] + last_diff_output: Optional[Diff] + pending_update: Optional[str] + ready_queue: "queue.Queue[None]" + watch_queue: "queue.Queue[Optional[float]]" + less_proc: "Optional[subprocess.Popen[bytes]]" + + def __init__(self, basedump: str, mydump: str, config: Config) -> None: + self.config = config + self.base_lines = process(basedump, config) + self.mydump = mydump + self.emsg = None + self.last_refresh_key = None + self.last_diff_output = None + + def run_diff(self) -> Tuple[str, object]: + if self.emsg is not None: + return (self.emsg, self.emsg) + + my_lines = process(self.mydump, self.config) + diff_output = do_diff(self.base_lines, my_lines, self.config) + last_diff_output = self.last_diff_output or diff_output + if self.config.threeway != "base" or not self.last_diff_output: + self.last_diff_output = diff_output + + meta, diff_lines = align_diffs(last_diff_output, diff_output, self.config) + output = self.config.formatter.table(meta, diff_lines) + refresh_key = ( + [line.key2 for line in diff_output.lines], + diff_output.score, + ) + return (output, refresh_key) + + def run_less( + self, output: str + ) -> "Tuple[subprocess.Popen[bytes], subprocess.Popen[bytes]]": + # Pipe the output through 'tail' and only then to less, to ensure the + # write call doesn't block. ('tail' has to buffer all its input before + # it starts writing.) This also means we don't have to deal with pipe + # closure errors. + buffer_proc = subprocess.Popen( + BUFFER_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + less_proc = subprocess.Popen(LESS_CMD, stdin=buffer_proc.stdout) + assert buffer_proc.stdin + assert buffer_proc.stdout + buffer_proc.stdin.write(output.encode()) + buffer_proc.stdin.close() + buffer_proc.stdout.close() + return (buffer_proc, less_proc) + + def run_sync(self) -> None: + output, _ = self.run_diff() + proca, procb = self.run_less(output) + procb.wait() + proca.wait() + + def run_async(self, watch_queue: "queue.Queue[Optional[float]]") -> None: + self.watch_queue = watch_queue + self.ready_queue = queue.Queue() + self.pending_update = None + output, refresh_key = self.run_diff() + self.last_refresh_key = refresh_key + dthread = threading.Thread(target=self.display_thread, args=(output,)) + dthread.start() + self.ready_queue.get() + + def display_thread(self, initial_output: str) -> None: + proca, procb = self.run_less(initial_output) + self.less_proc = procb + self.ready_queue.put(None) + while True: + ret = procb.wait() + proca.wait() + self.less_proc = None + if ret != 0: + # fix the terminal + os.system("tput reset") + if ret != 0 and self.pending_update is not None: + # killed by program with the intent to refresh + output = self.pending_update + self.pending_update = None + proca, procb = self.run_less(output) + self.less_proc = procb + self.ready_queue.put(None) + else: + # terminated by user, or killed + self.watch_queue.put(None) + self.ready_queue.put(None) + break + + def progress(self, msg: str) -> None: + # Write message to top-left corner + sys.stdout.write("\x1b7\x1b[1;1f{}\x1b8".format(msg + " ")) + sys.stdout.flush() + + def update(self, text: str, error: bool) -> None: + if not error and not self.emsg and text == self.mydump: + self.progress("Unchanged. ") + return + if not error: + self.mydump = text + self.emsg = None + else: + self.emsg = text + output, refresh_key = self.run_diff() + if refresh_key == self.last_refresh_key: + self.progress("Unchanged. ") + return + self.last_refresh_key = refresh_key + self.pending_update = output + if not self.less_proc: + return + self.less_proc.kill() + self.ready_queue.get() + + def terminate(self) -> None: + if not self.less_proc: + return + self.less_proc.kill() + self.ready_queue.get() + + +def main() -> None: + args = parser.parse_args() + + # Apply project-specific configuration. + settings: Dict[str, Any] = {} + diff_settings.apply(settings, args) # type: ignore + project = create_project_settings(settings) + + try: + config = create_config(args, project) + except ValueError as e: + fail(str(e)) + + if config.algorithm == "levenshtein": + try: + import Levenshtein + except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + + if config.show_source: + try: + import cxxfilt + except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + + if config.threeway and not args.watch: + fail("Threeway diffing requires -w.") + + if args.diff_elf_symbol: + make_target, basecmd, mycmd = dump_elf( + args.start, args.end, args.diff_elf_symbol, config, project + ) + elif config.diff_obj: + make_target, basecmd, mycmd = dump_objfile( + args.start, args.end, config, project + ) + else: + make_target, basecmd, mycmd = dump_binary(args.start, args.end, config, project) + + map_build_target_fn = getattr(diff_settings, "map_build_target", None) + if map_build_target_fn: + make_target = map_build_target_fn(make_target=make_target) + + if args.write_asm is not None: + mydump = run_objdump(mycmd, config, project) + with open(args.write_asm, "w") as f: + f.write(mydump) + print(f"Wrote assembly to {args.write_asm}.") + sys.exit(0) + + if args.base_asm is not None: + with open(args.base_asm) as f: + basedump = f.read() + else: + basedump = run_objdump(basecmd, config, project) + + mydump = run_objdump(mycmd, config, project) + + display = Display(basedump, mydump, config) + + if args.no_pager or args.format in ("html", "json"): + print(display.run_diff()[0]) + elif not args.watch: + display.run_sync() + else: + if not args.make: + yn = input( + "Warning: watch-mode (-w) enabled without auto-make (-m). " + "You will have to run make manually. Ok? (Y/n) " + ) + if yn.lower() == "n": + return + if args.make: + watch_sources = None + watch_sources_for_target_fn = getattr( + diff_settings, "watch_sources_for_target", None + ) + if watch_sources_for_target_fn: + watch_sources = watch_sources_for_target_fn(make_target) + watch_sources = watch_sources or project.source_directories + if not watch_sources: + fail("Missing source_directories config, don't know what to watch.") + else: + watch_sources = [make_target] + q: "queue.Queue[Optional[float]]" = queue.Queue() + debounced_fs_watch(watch_sources, q, config, project) + display.run_async(q) + last_build = 0.0 + try: + while True: + t = q.get() + if t is None: + break + if t < last_build: + continue + last_build = time.time() + if args.make: + display.progress("Building...") + ret = run_make_capture_output(make_target, project) + if ret.returncode != 0: + display.update( + ret.stderr.decode("utf-8-sig", "replace") + or ret.stdout.decode("utf-8-sig", "replace"), + error=True, + ) + continue + mydump = run_objdump(mycmd, config, project) + display.update(mydump, error=False) + except KeyboardInterrupt: + display.terminate() + + +if __name__ == "__main__": + main() diff --git a/lib/ultralib/tools/asm_differ/diff_settings.py b/lib/ultralib/tools/asm_differ/diff_settings.py new file mode 100644 index 0000000..183b96b --- /dev/null +++ b/lib/ultralib/tools/asm_differ/diff_settings.py @@ -0,0 +1,11 @@ +def apply(config, args): + config["baseimg"] = "target.bin" + config["myimg"] = "source.bin" + config["mapfile"] = "build.map" + config["source_directories"] = ["."] + # config["show_line_numbers_default"] = True + # config["arch"] = "mips" + # config["map_format"] = "gnu" # gnu or mw + # config["mw_build_dir"] = "build/" # only needed for mw map format + # config["makeflags"] = [] + # config["objdump_executable"] = "" diff --git a/lib/ultralib/tools/asm_differ/mypy.ini b/lib/ultralib/tools/asm_differ/mypy.ini new file mode 100644 index 0000000..138b939 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/mypy.ini @@ -0,0 +1,17 @@ +[mypy] +check_untyped_defs = True +disallow_any_generics = True +disallow_incomplete_defs = True +disallow_untyped_calls = True +disallow_untyped_decorators = True +disallow_untyped_defs = True +no_implicit_optional = True +warn_redundant_casts = True +warn_return_any = True +warn_unused_ignores = True +ignore_missing_imports = True +python_version = 3.6 +files = diff.py + +[mypy-diff_settings] +ignore_errors = True diff --git a/lib/ultralib/tools/asm_differ/screenshot.png b/lib/ultralib/tools/asm_differ/screenshot.png new file mode 100644 index 0000000..3230555 Binary files /dev/null and b/lib/ultralib/tools/asm_differ/screenshot.png differ diff --git a/lib/ultralib/tools/compile_sjis.py b/lib/ultralib/tools/compile_sjis.py new file mode 100755 index 0000000..136bdc7 --- /dev/null +++ b/lib/ultralib/tools/compile_sjis.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +import sys, os +from shiftjis_conv import sjis_process + +os.chdir("../../") +WORKING_DIR = os.getcwd() + +fb = [] +original_c_file = [i for i in sys.argv if ".c" in i][0] +CC = [i for i in sys.argv if "-D__CC=" in i][0][7:] +build_dir = [i for i in sys.argv if "-D__BUILD_DIR" in i][0][14:] + +output_c_file = original_c_file + +sys.argv[sys.argv.index(original_c_file)] = output_c_file + +original_c_file = "src/voice/" + original_c_file + +with open(original_c_file) as f: + fb = f.read() + +os.chdir(build_dir + "/src/voice") + +with open(output_c_file, "w+") as outf: + sjis_process(fb, outf) + +os.system("%s %s" % (CC, " ".join(sys.argv[1:]))) diff --git a/lib/ultralib/tools/disassemble_elf.py b/lib/ultralib/tools/disassemble_elf.py new file mode 100755 index 0000000..1fa58a8 --- /dev/null +++ b/lib/ultralib/tools/disassemble_elf.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +# +# ELF disassembler that attempts to be matching +# + +import argparse, struct, sys + +from libelf import * +from mdebug import * +from mips_isa import * +from util import * + +def debug_log(msg): + print(msg, file=sys.stderr) + +class MipsDisasm: + """ + """ + + def __init__(self, elf_file) -> None: + self.elf_file = elf_file + mdebug_section = elf_file.find_section_by_type(SHT_MIPS_DEBUG) + if mdebug_section is not None: + self.mdebug = mdebug_section + self.has_mdebug = True + else: + self.has_mdebug = False + self.cur_file = None + self.comment_section_pos = 1 + self.section_local_labels = {} + + def add_section_local_label(self, section, offset): + if section not in self.section_local_labels: + self.section_local_labels.update({section : set()}) + self.section_local_labels[section].add(offset) + + def advance_file(self): + seen_cur_file = False + for sym in self.elf_file.symtab.symbol_entries: + if sym.type == ST_FILE: + if seen_cur_file or self.cur_file is None: + self.cur_file = sym + break + elif self.cur_file == sym: + seen_cur_file = True + return self.cur_file is not None + + def disassemble_all_sections(self): + print(MipsDisasm.asm_prelude()) + + # debug_log("Name Type Addr Off Size ES Flg Lk Inf Al") + for section in self.elf_file.sections: + local_labels = self.section_local_labels.get(section.name, None) + # debug_log(section) + if section.name in ['', '.strtab', '.shstrtab', '.symtab', '.reginfo', '.comment', '.note', '.options', '.mdebug', '.gptab.data', '.gptab.bss'] or \ + (section.sh_type == SHT_REL or section.sh_type == SHT_RELA): + continue + if section.sh_size == 0: + continue + print("") + print(MipsDisasm.begin_section(section)) + if section.is_executable(): + self.disassemble_exec(section) + elif section.sh_type == SHT_PROGBITS: + # TODO kmc as doesn't support incbin, byte array this + # print(f".incbin \"libultra.a\", 0x{section.sh_offset:08X}, 0x{section.sh_size:X}") + first = True + for i,b in enumerate(section.data): + if local_labels is not None and i in local_labels: + if not first: + print("") + print(f".{section.name[1].upper()}_{i:08X}:") + print(" .byte ", end='') + first = True + elif first: + print(" .byte ", end='') + if not first: + print(", ", end='') + print(f"0x{int(b):02X}", end='') + first = False + print("") + elif section.sh_type == SHT_NOBITS: + print(f".skip 0x{section.sh_size:X}") + else: + assert False, f"Unhandled section: {section.name}" + # debug_log("/// UNHANDLED ///") + + def pass_section(self, section): + pass + + @staticmethod + def asm_prelude(): + return f""".include "macro.inc" +#include "regdef.h" + +// assembler directives +.set noat // allow manual use of $at +.set noreorder // don't insert nops after branches""" + + @staticmethod + def begin_section(section): + section_flags = section.flags_str().lower().replace(' ', '') + if section_flags != "": + section_flags = f", \"{section_flags}\"" + section_type = "" + if section.sh_type == SHT_PROGBITS: + section_type = ", @progbits" + elif section.sh_type == SHT_NOBITS: + section_type = ", @nobits" + if section_type != "" and section_flags == "": + section_flags = ", \"\"" + + return f""".section {section.name}{section_flags}{section_type} +.balign {section.sh_addralign} +""" + + def get_label_name(self, addr, pdr=None, optional=False): + if pdr is not None: + sym = pdr.lookup_sym(addr, EcoffSt.LABEL) + if sym is not None: + return sym.name + if not optional: + return f".L{addr:08X}" + else: + return None + + def get_comment_string(self, start): + comment_section = self.elf_file.find_section_by_name(".comment") + end = comment_section.data.find(b'\0', start) + if end == -1: + return None, None + comment = comment_section.data[start:end].decode("ASCII") + return comment, end + 1 + + def print_end(self, vaddr, eof): + ends = eof.get(vaddr, None) + if ends is not None: + for sym in ends: + print(f" .type {sym.name}, @{'function' if sym.type == ST_FUNC else 'object'}") + if sym.st_size != 0: + print(f" .size {sym.name}, . - {sym.name}") + print(f" .end {sym.name}\n") + + def disassemble_exec(self, section): + raw_insns = as_word_list(section.data) + insns = [decode_insn(raw, section.sh_addr + j * 4) for j,raw in enumerate(raw_insns)] + + # enumerate branch labels + branch_labels = set() + + for i,insn in enumerate(insns): + if insn.id in MIPS_BRANCH_INSNS or insn.id == MIPS_INS_J: + branch_labels.add(insn.target if insn.id == MIPS_INS_J else insn.offset) + + eof = {} # vaddr : name + def add_end(vaddr, sym): + if vaddr not in eof: + eof[vaddr] = set() + eof[vaddr].add(sym) + + cur_fdr = None + cur_pdr = None + for i,insn in enumerate(insns): + mnemonic = insn.mnemonic + op_str = insn.op_str + + # Update mdebug info + src_inf = "" + if self.has_mdebug: + # Get new fdr if there is one + fdr = self.mdebug.fdr_foraddr(i * 4, extensions=('.c', '.s')) + if fdr is not None: + # debug_log(fdr.name) + cur_fdr = fdr + + # Get new pdr if there is one + if cur_fdr is not None: + pdr = cur_fdr.pdr_foraddr(i * 4) + if pdr is not None: + # debug_log(pdr) + cur_pdr = pdr + + # Line numbers + if cur_pdr is not None: + asm_line = i - cur_pdr.addr//4 + if asm_line < len(cur_pdr.lines): + src_inf = f" {cur_pdr.lines[asm_line]:4}" + else: + src_inf = " PADDING" + + # Symbols for this address + syms = section.get_sym(i * 4) + # if len(syms) != 0: + # debug_log("\n".join([str(sym) for sym in syms])) + + # Print end + self.print_end(insn.vaddr, eof) + + # Print symbol + for sym in syms: + if sym.name == "gcc2_compiled.": + print(f"// compiler generated") + if self.cur_file is None: + print(f".version \"01.01\"") + if self.advance_file(): + print(f".file 1 \"{self.cur_file.name}\"") + + comment_string = None + while comment_string != "\"GCC: (GNU) 2.7.2\"": + comment_string, self.comment_section_pos = self.get_comment_string(self.comment_section_pos) + if comment_string is None: + break + print(f".ident \"{comment_string}\"") + + if sym.bind == SB_GLOBAL: + print(f"glabel {sym.name}") + else: + print(f"{sym.name}:") + + if sym.st_size != 0: + print(f" .ent {sym.name}") + add_end(insn.vaddr + sym.st_size, sym) + else: + print(f" .type {sym.name}, @{'function' if sym.type == ST_FUNC else 'object'}\n") + + # Print branch labels + lbl = self.get_label_name(insn.vaddr, pdr=cur_pdr, optional=not insn.vaddr in branch_labels) + if lbl is not None: + print(f"{lbl}:") + + # Relocations for this address + rels = section.get_rel(i * 4) + assert len(rels) < 2 # There should never be more than 1 relocation for a single address, right? + # if len(rels) != 0: + # debug_log("\n".join([str(rel) for rel in rels])) + + # Apply relocation + if len(rels) != 0: + rel = rels[0] + if rel.rel_type == R_MIPS_26: + if insn.id == MIPS_INS_JAL: + op_str = rel.relocated_symbol.name + if op_str == ".text" and cur_fdr is not None: + pdr = cur_fdr.pdr_foraddr(insn.target) + if pdr is not None: + op_str = pdr.name + elif insn.id != MIPS_INS_J: # Branch labels for j instructions are also R_MIPS_26 relocations + assert False , f"Got unexpected R_MIPS_26 relocation {insn.id}" + elif rel.rel_type == R_MIPS_HI16: + assert insn.id in [MIPS_INS_LUI] + rel_name = rel.relocated_symbol.name + if rel.relocated_symbol.type == ST_SECTION: + rel_name = f".{rel_name[1].upper()}_00000000" + if cur_fdr is not None: + pass + + op_str = f"{insn.abi.gpr_names[insn.rt]}, %hi({rel_name})" + elif rel.rel_type == R_MIPS_LO16: + # Ideally this should be in the elf code so the relocations don't look identical + addend = insn.imm + rel_name = rel.relocated_symbol.name + if rel.relocated_symbol.type == ST_SECTION: + rel_name = f".{rel_name[1].upper()}_{addend:08X}" + self.add_section_local_label(rel.relocated_symbol.name, addend) + addend = 0 + addend_str = f" + 0x{addend:X}" if addend != 0 else "" + + if insn.id == MIPS_INS_ADDIU: + op_str = f"{insn.abi.gpr_names[insn.rt]}, {insn.abi.gpr_names[insn.rs]}, %lo({rel_name}{addend_str})" + elif insn.id in MIPS_LOAD_STORE_INSNS: + if insn.id in MIPS_FP_LOAD_STORE_INSNS: + op_str = f"{insn.abi.cop1_names[insn.ft]}, " + else: + op_str = f"{insn.abi.gpr_names[insn.rt]}, " + op_str += f"%lo({rel_name}{addend_str})({insn.abi.gpr_names[insn.base]})" + else: + assert False + else: + assert False + + # Apply branch labels + if insn.id in MIPS_BRANCH_INSNS: + op_str_parts = [] + for field in insn.fields: + if field == 'offset': + op_str_parts.append(self.get_label_name(insn.offset, cur_pdr)) + else: + op_str_parts.append(insn.format_field(field)) + op_str = ", ".join(op_str_parts) + elif insn.id == MIPS_INS_J: + op_str = self.get_label_name(insn.target, cur_pdr) + + print(f"/* {section.sh_offset + i * 4:06X} {insn.vaddr:08X} {insn.raw:08X}{src_inf} */ {mnemonic:12}{op_str:35}".rstrip()) + self.print_end(section.sh_addr + section.sh_size, eof) + +def main(): + parser = argparse.ArgumentParser(description="Disassemble relocatable ELF object.") + parser.add_argument("filepath", help="path to the ELF file") + # TODO unimplemented optionals + parser.add_argument("--compiler", help="original compiler that produced the ELF (IDO or GCC, IDO default)", default="IDO") + parser.add_argument("--strenc", help="string encoding, default is EUC-JP for IDO and SJIS for GCC") + args = parser.parse_args() + + elf_file = None + with open(args.filepath, "rb") as elf: + elf_file = ElfFile(bytearray(elf.read())) + + disassembler = MipsDisasm(elf_file) + disassembler.disassemble_all_sections() + +if __name__ == '__main__': + main() diff --git a/lib/ultralib/tools/fix_objfile.py b/lib/ultralib/tools/fix_objfile.py new file mode 100755 index 0000000..52a79bc --- /dev/null +++ b/lib/ultralib/tools/fix_objfile.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +# +# Fixes garbage data between sections and optionally rodata section flags +# + +import argparse +from libelf import * + +def fix_section_flags(elf): + for section in elf.sections: + # Unset Alloc flag in .rodata section + if section.name == ".rodata": + section.sh_flags &= ~SHF_ALLOC + +def fix_garbage(elf, original): + # Begin with the original data, and paste header and section data over it + result = original + if len(original) < len(elf.data): + result.extend([0]*(len(elf.data) - len(original))) + else: + result = result[:len(elf.data)] + + # NOTE: This only supports the elf header, program headers, section headers and section data at this time + + # emplace elf header + hdr = elf.elf_header.to_bin() + result[0:len(hdr)] = hdr + + # emplace program headers + for i,proghdr in enumerate(elf.progheaders): + offset = elf.elf_header.e_phoff + i * elf.elf_header.e_phentsize + result[offset:offset+elf.elf_header.e_phentsize] = proghdr.to_bin() + + # emplace section headers and section data + for i,section in enumerate(elf.sections): + offset = elf.elf_header.e_shoff + i * elf.elf_header.e_shentsize + section_header, section_data = section.to_bin() + result[offset:offset+elf.elf_header.e_shentsize] = section_header + if section_data is not None: + result[section.sh_offset:section.sh_offset+section.sh_size] = section_data + + return result + +def main(): + parser = argparse.ArgumentParser(description="Disassemble relocatable ELF object.") + parser.add_argument("compiled", help="path to the compiled ELF file") + parser.add_argument("original", help="path to the original ELF file") + parser.add_argument("--fix-section-flags", help="", action="store_true") + args = parser.parse_args() + + elf = None + with open(args.compiled, "rb") as elf_file: + elf = ElfFile(bytearray(elf_file.read())) + + original = None + with open(args.original, "rb") as original_file: + original = bytearray(original_file.read()) + + if args.fix_section_flags: + fix_section_flags(elf) + + result_data = fix_garbage(elf, original) + + with open(args.compiled, "wb") as elf_file: + elf_file.write(result_data) + +if __name__ == '__main__': + main() diff --git a/lib/ultralib/tools/libdiff.py b/lib/ultralib/tools/libdiff.py new file mode 100755 index 0000000..ac6b139 --- /dev/null +++ b/lib/ultralib/tools/libdiff.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +from typing import Any, Dict, Optional +import json +import logging +import subprocess +import tempfile +import pathlib +import sys +import queue + +import asm_differ.diff as asm_differ + +MAX_FUNC_SIZE_LINES = 5000 + +class AsmDifferWrapper: + @staticmethod + def create_config(arch: asm_differ.ArchSettings) -> asm_differ.Config: + return asm_differ.Config( + arch=arch, + # Build/objdump options + diff_obj=True, + make=False, + source_old_binutils=True, + diff_section=".text", + inlines=False, + max_function_size_lines=MAX_FUNC_SIZE_LINES, + max_function_size_bytes=MAX_FUNC_SIZE_LINES * 4, + # Display options + formatter=asm_differ.AnsiFormatter(column_width=50), + threeway=None, + base_shift=0, + skip_lines=0, + compress=None, + show_branches=True, + show_line_numbers=False, + show_source=False, + stop_jrra=False, + ignore_large_imms=False, + ignore_addr_diffs=False, + algorithm="levenshtein", + ) + + @staticmethod + def run_objdump(target_data: bytes, config: asm_differ.Config, label: Optional[str]) -> Optional[str]: + flags = [ + "--disassemble", + "--disassemble-zeroes", + "--line-numbers", + "--reloc", + ] + + with tempfile.TemporaryDirectory() as tempdir: + target_path = pathlib.Path(tempdir) / "out.s" + target_path.write_bytes(target_data) + + start_addr = 0 + + if label: + nm_command = "mips-linux-gnu-nm" + + if nm_command: + try: + nm_proc = subprocess.run( + [nm_command] + [target_path], + capture_output=True, + universal_newlines=True + ) + except subprocess.CalledProcessError as e: + logger.error(f"Error running nm: {e}") + logger.error(e.stderr) + + if nm_proc.stdout: + for line in nm_proc.stdout.splitlines(): + if label in line: + start_addr = int(line.split()[0], 16) + break + else: + # logger.error(f"No nm command for {platform}") + return None + + flags.append(f"--start-address={start_addr}") + + objdump_command = "mips-linux-gnu-objdump" + cmds = [objdump_command] + config.arch.arch_flags + flags + [target_path] + + try: + objdump_proc = subprocess.run( + [objdump_command] + config.arch.arch_flags + flags + [target_path], + capture_output=True, + universal_newlines=True + ) + except subprocess.CalledProcessError as e: + # logger.error(e) + # logger.error(e.stderr) + return None + + out = objdump_proc.stdout + return out + + @staticmethod + def diff(target_elf: bytes, compiled_elf: bytes, diff_label:Optional[str]) -> Dict[str, Any]: + arch = asm_differ.get_arch("mips") + + config = AsmDifferWrapper.create_config(arch) + + # Base + if len(target_elf) == 0: + print("Base asm empty") + return + + basedump = AsmDifferWrapper.run_objdump(target_elf, config, diff_label) + if not basedump: + print("Error running asm-differ on basedump") + return + + if len(compiled_elf) == 0: + print("Creation of compilation elf_object failed") + return + + mydump = AsmDifferWrapper.run_objdump(compiled_elf, config, diff_label) + if not mydump: + print("Error running asm-differ") + return + + # Preprocess the dumps + basedump = asm_differ.preprocess_objdump_out(None, target_elf, basedump, config) + mydump = asm_differ.preprocess_objdump_out(None, compiled_elf, mydump, config) + + try: + display = asm_differ.Display(basedump, mydump, config) + except Exception: + print("Error running asm-differ") + return + + # Print the output + display.run_sync() + +if __name__ == "__main__": + if len(sys.argv) != 3 and len(sys.argv) != 4: + print(f"Usage: {sys.argv[0]} [path/to/target.o] [path/to/compiled.o] [function name (optional)]") + sys.exit(0) + target = pathlib.Path(sys.argv[1]) + compiled = pathlib.Path(sys.argv[2]) + if len(sys.argv) == 4: + label = sys.argv[3] + else: + label = None + target_bytes = target.read_bytes() + compiled_bytes = compiled.read_bytes() + AsmDifferWrapper.diff(target_bytes, compiled_bytes, label) diff --git a/lib/ultralib/tools/libelf.py b/lib/ultralib/tools/libelf.py new file mode 100755 index 0000000..11c4c03 --- /dev/null +++ b/lib/ultralib/tools/libelf.py @@ -0,0 +1,1181 @@ +#!/usr/bin/env python3 +# +# MIPS ELF library +# + +import struct + +from mdebug import EcoffHDRR, EcoffFdr, EcoffPdr, EcoffLiner, EcoffSymr + +# ===================================================================================================== +# Utility +# ===================================================================================================== + +def align_as(value, align): + if align == 0: + return value + while (value % align != 0): + value += 1 + return value + +# ===================================================================================================== +# ELF Identity +# ===================================================================================================== + +# Offsets into e_ident +EI_MAG0 = 0x00 # Magic char 0 , 0x7F +EI_MAG1 = 0x01 # Magic char 1 , 0x45 +EI_MAG2 = 0x02 # Magic char 2 , 0x4C +EI_MAG3 = 0x03 # Magic char 3 , 0x46 +EI_CLASS = 0x04 # +EI_DATA = 0x05 # +EI_VERSION = 0x06 # +EI_OSABI = 0x07 # +EI_ABIVERSION = 0x08 # +EI_PAD = 0x09 # +EI_NIDENT = 0x10 # + +# Values for e_ident[EI_DATA] +EI_DATA_LE = 1 # little endian +EI_DATA_BE = 2 # big endian + +EI_DATA_V = { + EI_DATA_LE : 'Little Endian', + EI_DATA_BE : 'Big Endian' +} + +# Values for e_ident[EI_CLASS] +EI_CLASS_32 = 1 # 32-bit +EI_CLASS_64 = 2 # 64-bit + +EI_CLASS_V = { + EI_CLASS_32 : 'ELF32', + EI_CLASS_64 : 'ELF64' +} + +# Values for e_ident[EI_OSABI] +EI_OSABI_V = { + 0x00 : 'UNIX / System V', + 0x01 : 'HP-UX', + 0x02 : 'NetBSD', + 0x03 : 'Linux', + 0x04 : 'GNU Hurd', + 0x06 : 'Solaris', + 0x07 : 'AIX', + 0x08 : 'IRIX', + 0x09 : 'FreeBSD', + 0x0A : 'Tru64', + 0x0B : 'Novell Modesto', + 0x0C : 'OpenBSD', + 0x0D : 'OpenVMS', + 0x0E : 'NonStop Kernel', + 0x0F : 'AROS', + 0x10 : 'Fenix OS', + 0x11 : 'CloudABI', + 0x12 : 'Stratus Technologies OpenVOS' +} + +# ===================================================================================================== +# ELF Types +# ===================================================================================================== + +ET_NONE = 0x0000 # +ET_REL = 0x0001 # relocatable +ET_EXEC = 0x0002 # +ET_DYN = 0x0003 # +ET_CORE = 0x0004 # +ET_LOOS = 0xFE00 # +ET_HIOS = 0xFEFF # +ET_LOPROC = 0xFF00 # +ET_HIPROC = 0xFFFF # + +E_TYPE = { + ET_NONE : 'ET_NONE', + ET_REL : 'ET_REL', + ET_EXEC : 'ET_EXEC', + ET_DYN : 'ET_DYN', + ET_CORE : 'ET_CORE', + ET_LOOS : 'ET_LOOS', + ET_HIOS : 'ET_HIOS', + ET_LOPROC : 'ET_LOPROC', + ET_HIPROC : 'ET_HIPROC' +} + +# ===================================================================================================== +# ELF Machines +# ===================================================================================================== + +EM_UNSPECIFIED = 0x00 +EM_ATNT_WE_32100 = 0x01 +EM_SPARC = 0x02 +EM_X86 = 0x03 +EM_MOTOROLA_68000 = 0x04 +EM_MOTOROLA_88000 = 0x05 +EM_INTEL_MCU = 0x06 +EM_INTEL_80860 = 0x07 +EM_MIPS = 0x08 +EM_IBM_SYSTEM_370 = 0x09 +EM_MIPS_RS3000_LE = 0x0A +EM_RESERVED_xB = 0x0B +EM_RESERVED_xC = 0x0C +EM_RESERVED_xD = 0x0D +EM_HEWLETT_PACKARD = 0x0E +EM_RESERVED_xF = 0x0F +EM_INTEL_80960 = 0x13 +EM_POWERPC = 0x14 +EM_POWERPC_64 = 0x15 +EM_5390 = 0x16 +EM_ARM = 0x28 +EM_SUPERH = 0x2A +EM_IA64 = 0x32 +EM_AMD64 = 0x3E +EM_TMS320C6000 = 0x8C +EM_ARM64 = 0xB7 +EM_RISC_V = 0xF3 + +E_MACHINE = { + EM_UNSPECIFIED : 'Unspecified', + EM_ATNT_WE_32100 : 'AT&T WE 32100', + EM_SPARC : 'SPARC', + EM_X86 : 'x86', + EM_MOTOROLA_68000 : 'Motorola 68000 (M68K)', + EM_MOTOROLA_88000 : 'Motorola 88000 (M88K)', + EM_INTEL_MCU : 'Intel MCU', + EM_INTEL_80860 : 'Intel 80860', + EM_MIPS : 'MIPS', + EM_IBM_SYSTEM_370 : 'IBM_System/370', + EM_MIPS_RS3000_LE : 'MIPS RS3000 Little-endian', + EM_RESERVED_xB : 'Reserved', + EM_RESERVED_xC : 'Reserved', + EM_RESERVED_xD : 'Reserved', + EM_HEWLETT_PACKARD : 'Hewlett-Packard PA-RISC', + EM_RESERVED_xF : 'Reserved', + EM_INTEL_80960 : 'Intel 80960', + EM_POWERPC : 'PowerPC', + EM_POWERPC_64 : 'PowerPC (64-bit)', + EM_5390 : 'S390, including S390x', + EM_ARM : 'ARM (up to ARMv7/Aarch32)', + EM_IA64 : 'SuperH', + EM_IA64 : 'IA-64', + EM_AMD64 : 'amd64', + EM_TMS320C6000 : 'TMS320C6000 Family', + EM_ARM64 : 'ARM 64-bits (ARMv8/Aarch64)', + EM_RISC_V : 'RISC-V' +} + +# ===================================================================================================== +# Program Types +# ===================================================================================================== + +PT_NULL = 0x00000000 # Program header table entry unused +PT_LOAD = 0x00000001 # Loadable segment +PT_DYNAMIC = 0x00000002 # Dynamic linking information +PT_INTERP = 0x00000003 # Interpreter information +PT_NOTE = 0x00000004 # Auxiliary information +PT_SHLIB = 0x00000005 # Reserved +PT_PHDR = 0x00000006 # Segment containing the program header table itself +PT_TLS = 0x00000007 # Thread-Local storage template +PT_LOOS = 0x60000000 # Inclusive reserved range for processor-specific semantics +PT_HIOS = 0x6FFFFFFF # ^ +PT_LOPROC = 0x70000000 # Inclusive reserved range for processor-specific semantics +PT_HIPROC = 0x7FFFFFFF # ^ + +P_TYPE = { + PT_NULL : 'PT_NULL' , + PT_LOAD : 'PT_LOAD' , + PT_DYNAMIC : 'PT_DYNAMIC', + PT_INTERP : 'PT_INTERP' , + PT_NOTE : 'PT_NOTE' , + PT_SHLIB : 'PT_SHLIB' , + PT_PHDR : 'PT_PHDR' , + PT_TLS : 'PT_TLS' , + PT_LOOS : 'PT_LOOS' , + PT_HIOS : 'PT_HIOS' , + PT_LOPROC : 'PT_LOPROC' , + PT_HIPROC : 'PT_HIPROC' +} + +# ===================================================================================================== +# Program Flags ( May be platform specific ! ) +# ===================================================================================================== + +PF_E = 1 << 0 # Execute +PF_W = 1 << 1 # Write +PF_R = 1 << 2 # Read + +# ===================================================================================================== +# Symbol Info +# ===================================================================================================== + +# Symbol Types + +ST_NOTYPE = 0 +ST_OBJECT = 1 +ST_FUNC = 2 +ST_SECTION = 3 +ST_FILE = 4 + +SYM_TYPE = { + ST_NOTYPE : 'NOTYPE', + ST_OBJECT : 'OBJECT', + ST_FUNC : 'FUNC', + ST_SECTION : 'SECTION', + ST_FILE : 'FILE' +} + +# Symbol Bind + +SB_LOCAL = 0 +SB_GLOBAL = 1 +SB_WEAK = 2 + +SYM_BIND = { + SB_LOCAL : 'LOCAL', + SB_GLOBAL : 'GLOBAL', + SB_WEAK : 'WEAK' +} + +# Symbol Visibility + +SV_DEFAULT = 0 + +SYM_VIS = { + SV_DEFAULT : 'DEFAULT' +} + +# NDX + +SHN_UND = 0x0000 +SHN_ABS = 0xFFF1 +SHN_COMMON = 0xFFF2 +SHN_XINDEX = 0xFFFF +SHN_LORESERVE = 0xFF00 + +SYM_NDX = { + SHN_UND : 'UND', + SHN_ABS : 'ABS', + SHN_COMMON : 'COMMON', + SHN_XINDEX : 'XINDEX', + SHN_LORESERVE : 'LORESERVE' +} + +# ===================================================================================================== +# Relocation Type +# ===================================================================================================== + +# EM_MIPS +R_MIPS_32 = 2 # Write the 32 bit address of the symbol +R_MIPS_26 = 4 # Write the 26 bit address of the symbol divided by four (for relocating branch instructions). Fail if address won't fit +R_MIPS_HI16 = 5 # Write the high 16 bits of the address of the symbol +R_MIPS_LO16 = 6 # Write the low 16 bits of the address of the symbol + +# EM_POWERPC +R_PPC_NONE = 0 # Do nothing. Skip this entry +R_PPC_ADDR32 = 1 # Write the 32 bit address of the symbol +R_PPC_ADDR24 = 2 # Write the 24 bit address of the symbol divided by four shifted up 2 bits to the 32 bit value (for relocating branch instructions). Fail if address won't fit +R_PPC_ADDR16 = 3 # Write the 16 bit address of the symbol. Fail if address more than 16 bits +R_PPC_ADDR16_LO = 4 # Write the low 16 bits of the address of the symbol +R_PPC_ADDR16_HI = 5 # Write the high 16 bits of the address of the symbol +R_PPC_ADDR16_HA = 6 # Write the high 16 bits of the address of the symbol plus 0x8000 +R_PPC_ADDR14 = 7 # Write the 14 bits of the address of the symbol divided by four shifted up 2 bits to the 32 bit value (for relocating conditional branch instructions). Fail if address won't fit +R_PPC_REL24 = 10 # Write the 24 bit address of the symbol minus the address of the relocation divided by four shifted up 2 bits to the 32 bit value (for relocating relative branch instructions). Fail if address won't fit +R_PPC_REL14 = 11 # Write the 14 bit address of the symbol minus the address of the relocation divided by four shifted up 2 bits to the 32 bit value (for relocating conditional relative branch instructions). Fail if address won't fit +R_PPC_EMB_SDA21 = 109 # Small Data Area + +# Gamecube/Wii custom relocations +R_DOLPHIN_NOP = 201 # Do nothing. Skip this entry. Carry the address of the symbol to the next entry +R_DOLPHIN_SECTION = 202 # Change which section relocations are being applied to. Set the offset into the section to 0 +R_DOLPHIN_END = 203 # Stop parsing the relocation table +R_DOLPHIN_MRKREF = 204 # Unknown + +RELOC_TYPE = { + EM_MIPS : { + R_MIPS_32 : 'R_MIPS_32', + R_MIPS_26 : 'R_MIPS_26', + R_MIPS_HI16 : 'R_MIPS_HI16', + R_MIPS_LO16 : 'R_MIPS_LO16' + }, + EM_POWERPC : { + R_PPC_NONE : 'R_PPC_NONE', + R_PPC_ADDR32 : 'R_PPC_ADDR32', + R_PPC_ADDR24 : 'R_PPC_ADDR24', + R_PPC_ADDR16 : 'R_PPC_ADDR16', + R_PPC_ADDR16_LO : 'R_PPC_ADDR16_LO', + R_PPC_ADDR16_HI : 'R_PPC_ADDR16_HI', + R_PPC_ADDR16_HA : 'R_PPC_ADDR16_HA', + R_PPC_ADDR14 : 'R_PPC_ADDR14', + 8 : 'R_PPC_ADDR14', + 9 : 'R_PPC_ADDR14', + R_PPC_REL24 : 'R_PPC_REL24', + R_PPC_REL14 : 'R_PPC_REL14', + 12 : 'R_PPC_REL14', + 13 : 'R_PPC_REL14', + R_PPC_EMB_SDA21 : 'R_PPC_EMB_SDA21', + R_DOLPHIN_NOP : 'R_DOLPHIN_NOP', + R_DOLPHIN_SECTION : 'R_DOLPHIN_SECTION', + R_DOLPHIN_END : 'R_DOLPHIN_END', + R_DOLPHIN_MRKREF : 'R_DOLPHIN_MRKREF' + } +} + +# ===================================================================================================== +# Section Types +# ===================================================================================================== + +SHT_NULL = 0x00000000 # Section header table entry unused +SHT_PROGBITS = 0x00000001 # Program data +SHT_SYMTAB = 0x00000002 # Symbol table +SHT_STRTAB = 0x00000003 # String table +SHT_RELA = 0x00000004 # Relocation entries with addends +SHT_HASH = 0x00000005 # Symbol hash table +SHT_DYNAMIC = 0x00000006 # Dynamic linking information +SHT_NOTE = 0x00000007 # Notes +SHT_NOBITS = 0x00000008 # Program space with no data (bss) +SHT_REL = 0x00000009 # Relocation entries, no addends +SHT_SHLIB = 0x0000000A # Reserved +SHT_DYNSYM = 0x0000000B # Dynamic linker symbol table +SHT_INIT_ARRAY = 0x0000000E # Array of constructors +SHT_FINI_ARRAY = 0x0000000F # Array of destructors +SHT_PREINIT_ARRAY = 0x00000010 # Array of pre-constructors +SHT_GROUP = 0x00000011 # Section group +SHT_SYMTAB_SHNDX = 0x00000012 # Extended section indices +SHT_NUM = 0x00000013 # Number of defined types. +SHT_LOOS = 0x60000000 # Start OS-specific. + +# MIPS specific +SHT_MIPS_DEBUG = 0x70000005 # .mdebug +SHT_MIPS_REGINFO = 0x70000006 # .reginfo +SHT_MIPS_OPTIONS = 0x7000000D # .options + +SH_TYPE = { + SHT_NULL : 'SHT_NULL', + SHT_PROGBITS : 'SHT_PROGBITS', + SHT_SYMTAB : 'SHT_SYMTAB', + SHT_STRTAB : 'SHT_STRTAB', + SHT_RELA : 'SHT_RELA', + SHT_HASH : 'SHT_HASH', + SHT_DYNAMIC : 'SHT_DYNAMIC', + SHT_NOTE : 'SHT_NOTE', + SHT_NOBITS : 'SHT_NOBITS', + SHT_REL : 'SHT_REL', + SHT_SHLIB : 'SHT_SHLIB', + SHT_DYNSYM : 'SHT_DYNSYM', + SHT_INIT_ARRAY : 'SHT_INIT_ARRAY', + SHT_FINI_ARRAY : 'SHT_FINI_ARRAY', + SHT_PREINIT_ARRAY : 'SHT_PREINIT_ARRAY', + SHT_GROUP : 'SHT_GROUP', + SHT_SYMTAB_SHNDX : 'SHT_SYMTAB_SHNDX', + SHT_NUM : 'SHT_NUM', + SHT_LOOS : 'SHT_LOOS', + + SHT_MIPS_DEBUG : 'SHT_MIPS_DEBUG', + SHT_MIPS_REGINFO : 'SHT_MIPS_REGINFO', + SHT_MIPS_OPTIONS : 'SHT_MIPS_OPTIONS', +} + +# ===================================================================================================== +# Section Flags +# ===================================================================================================== + +SHF_WRITE = 1 << 0 # Writable +SHF_ALLOC = 1 << 1 # Occupies memory during execution +SHF_EXECINSTR = 1 << 2 # Executable +SHF_MERGE = 1 << 4 # Might be merged +SHF_STRINGS = 1 << 5 # Contains null-terminated strings +SHF_INFO_LINK = 1 << 6 # 'sh_info' contains SHT index +SHF_LINK_ORDER = 1 << 7 # Preserve order after combining +SHF_OS_NONCONFORMING = 1 << 8 # Non-standard OS specific handling required +SHF_GROUP = 1 << 9 # Section is member of a group +SHF_TLS = 1 << 10 # Section hold thread-local data + +SHF_MASKOS = 0x0ff00000 # OS-specific +SHF_MASKPROC = 0xf0000000 # Processor-specific +SHF_ORDERED = 0x04000000 # Special ordering requirement (Solaris) +SHF_EXCLUDE = 0x08000000 # Section is excluded unless referenced or allocated (Solaris) + +SH_FLAG = { + SHF_WRITE : 'SHF_WRITE', + SHF_ALLOC : 'SHF_ALLOC', + SHF_EXECINSTR : 'SHF_EXECINSTR', + SHF_MERGE : 'SHF_MERGE', + SHF_STRINGS : 'SHF_STRINGS', + SHF_INFO_LINK : 'SHF_INFO_LINK', + SHF_LINK_ORDER : 'SHF_LINK_ORDER', + SHF_OS_NONCONFORMING : 'SHF_OS_NONCONFORMING', + SHF_GROUP : 'SHF_GROUP', + SHF_TLS : 'SHF_TLS', + SHF_MASKOS : 'SHF_MASKOS', + SHF_MASKPROC : 'SHF_MASKPROC', + SHF_ORDERED : 'SHF_ORDERED', + SHF_EXCLUDE : 'SHF_EXCLUDE' +} + +# ===================================================================================================== +# ELF Header +# ===================================================================================================== + +ELF32_BIG_STRUCT = '>HHIIIIIHHHHHH' +ELF32_LITTLE_STRUCT = 'IIIBBH', data) + assert self.st_shndx != SHN_XINDEX, "too many sections (SHN_XINDEX not supported)" + self.bind = st_info >> 4 + self.type = st_info & 0xF + self.visibility = self.st_other & 3 + self.parent_section = elf_file.sections[self.st_shndx] if self.st_shndx < SHN_LORESERVE else None + + self.name = name + if self.type == ST_SECTION: + self.name = elf_file.shstrtab.lookup_str(self.parent_section.sh_name) + if self.name == None: + self.name = elf_file.symtab.strtab.lookup_str(self.st_name) + + @staticmethod + def from_parts(st_name, st_value, st_size, st_info, st_other, st_shndx, strtab, name): + header = struct.pack('>IIIBBH', st_name, st_value, st_size, st_info, st_other, st_shndx) + return Symbol(header, strtab, name) + + def to_bin(self): + st_info = (self.bind << 4) | self.type + return struct.pack('>IIIBBH', self.st_name, self.st_value, self.st_size, st_info, self.st_other, self.st_shndx) + + def section_offset(self): + return self.st_value - self.parent_section.sh_addr + + def padded_size_n(self, n): + return align_as(self.st_size, n) + + def padded_size(self): + return self.padded_size_n(self.parent_section.sh_addralign) + + def __str__(self): + # Num: Value Size Type Bind Vis Ndx Name + ndx = ' ' + (SYM_NDX[self.st_shndx] if self.st_shndx in SYM_NDX.keys() else self.parent_section.name) + out = f"{self.st_value:08X} {self.st_size:06X} {SYM_TYPE[self.type]:7} {SYM_BIND[self.bind]:6} {SYM_VIS[self.visibility]:7} {ndx:12} {self.name}" + return out + +# ===================================================================================================== +# Relocation +# ===================================================================================================== + +class Relocation: + """ + typedef struct { + Elf32_Word r_offset; + struct { + Elf32_Word sym_index : 24; + Elf32_Word rel_type : 8; + } r_info; + Elf32_Word r_addend; + } Elf32_Reloc; + """ + + def __init__(self, data, elf_file, target_section, sh_type): + self.sh_type = sh_type + if sh_type == SHT_REL: + self.r_offset, self.r_info = struct.unpack('>II', data) + self.r_addend = 0 + else: + self.r_offset, self.r_info, self.r_addend = struct.unpack('>III', data) + self.sym_index = self.r_info >> 8 + self.rel_type = self.r_info & 0xff + self.relocated_symbol = elf_file.symtab.symbol_entries[self.sym_index] + self.elf_machine = elf_file.elf_header.e_machine + self.target_section = target_section + # TODO obtain the addend if the target section is executable + + def to_bin(self): + self.r_info = (self.sym_index << 8) | self.rel_type + if self.sh_type == SHT_REL: + return struct.pack('>II', self.r_offset, self.r_info) + else: + return struct.pack('>III', self.r_offset, self.r_info, self.r_addend) + + def relocated_symbol_in_section(self, symtab, section): + return symtab.lookup_symbol_in_section(symtab.symbol_entries[self.sym_index].st_value, section) + + def __str__(self): + relocated_symbol = self.relocated_symbol + # Offset Info Type Sym.Value Sym. Name + Addend + # 80135560 00091201 R_MY_RELOC_TYPE 800f39e0 ...data.0 + 0 + out = f"{self.r_offset:08X} {self.r_info:08X} {RELOC_TYPE[self.elf_machine][self.rel_type]:17} {relocated_symbol.st_value:08X} {relocated_symbol.name} + 0x{self.r_addend:X}" + return out + +# ===================================================================================================== +# Section +# ===================================================================================================== + +class Section: + """ + Describes a section + + typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; + } Elf32_Shdr; + +x00 x00 4 4 sh_name Offset to string in the .shstrtab section representing this section's name + +x04 x04 4 4 sh_type See SH_TYPE + +x08 x08 4 8 sh_flags See SH_FLAG + +x0C x10 4 8 sh_addr Virtual address of the section in memory (for loaded sections) + +x10 x18 4 8 sh_offset Offset of the section in the file image + +x14 x20 4 8 sh_size Size in bytes of the section in the file image + +x18 x28 4 4 sh_link Contains the section index of an associated section. This field is used for several purposes depending on section type + +x1C x2C 4 4 sh_info Contains extra information about the section. This field is used for several purposes, depending on section type + +x20 x30 4 8 sh_addralign Contains the required alignment of the section. This field must be a power of two + +x24 x38 4 8 sh_entsize Contains the size, in bytes, of each entry, for sections that contain fixed-size entries. Zero otherwise + +x28 x40 END + """ + + def __init__(self, header, elf_file, index): + self.late_init_done = False + self.sh_name, self.sh_type, \ + self.sh_flags, self.sh_addr, \ + self.sh_offset, self.sh_size, \ + self.sh_link, self.sh_info, \ + self.sh_addralign, self.sh_entsize = struct.unpack('>IIIIIIIIII', header) + assert not self.sh_flags & SHF_LINK_ORDER + if self.sh_entsize != 0: + assert self.sh_size % self.sh_entsize == 0 + if self.sh_type in [SHT_NULL, SHT_NOBITS]: + self.data = None + else: + self.data = elf_file.data[self.sh_offset:][:self.sh_size] + self.index = index + self.relocated_by = [] + self.elf_file = elf_file + + def late_init(self): + self.late_init_done = True + + @staticmethod + def from_parts(sh_name, sh_type, sh_flags, sh_link, sh_info, sh_addralign, sh_entsize, sh_addr, sh_offset, data, index): + header = struct.pack('>IIIIIIIIII', sh_name, sh_type, sh_flags, sh_addr, sh_offset, \ + len(data), sh_link, sh_info, sh_addralign, sh_entsize) + return Section(header, data, index) + + def to_bin(self): + if self.sh_type not in [SHT_NULL, SHT_NOBITS]: + self.sh_size = len(self.data) + header = struct.pack('>IIIIIIIIII', self.sh_name, self.sh_type, self.sh_flags, self.sh_addr, self.sh_offset, self.sh_size, self.sh_link, self.sh_info, self.sh_addralign, self.sh_entsize) + return header, self.data + + def get_rel(self, addr): + relocs = [] + for reloc_section in self.relocated_by: + reloc = reloc_section.find_reloc(addr) + if reloc is not None: + relocs.append(reloc) + return relocs + + def get_sym(self, addr): + symtab = self.elf_file.symtab + symbols = [] + for symbol in symtab.symbol_entries: + if symbol.st_value == addr and symbol.st_shndx == self.index and symbol.type != ST_SECTION: + symbols.append(symbol) + return symbols + + def is_rel(self): + return self.sh_type == SHT_REL or self.sh_type == SHT_RELA + + def is_allocable(self): + return (self.sh_flags & SHF_ALLOC) == SHF_ALLOC + + def is_executable(self): + return (self.sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR + + def is_writable(self): + return (self.sh_flags & SHF_WRITE) == SHF_WRITE + + def padded_size(self): + return align_as(self.sh_size, self.sh_addralign) + + def padded_size_4(self): + return align_as(self.sh_size, 4) + + def flags_str(self): + flags = "" + flags += "W" if self.is_writable() else " " + flags += "A" if self.is_allocable() else " " + flags += "X" if self.is_executable() else " " + return flags + + def __str__(self): + s_type = SH_TYPE[self.sh_type].replace('SHT_','') if self.sh_type in SH_TYPE.keys() else str(self.sh_type) + out = f"{self.name:12}{s_type:12} " + out += f"{self.sh_addr:08X} " + out += f"{self.sh_offset:06X} " + out += f"{self.sh_size:06X} " + out += f"{self.sh_entsize:2X} " + out += f"{self.flags_str():3} " + out += f"{self.sh_link:2} " + out += f"{self.sh_info:3} " + out += f"{self.sh_addralign:5X} " + return out + +class SymtabSection(Section): + """ + Symbol Table Section + """ + + def __init__(self, header, elf_file, index): + super().__init__(header, elf_file, index) + assert self.sh_entsize == 16 + + def late_init(self): + if self.late_init_done: + return + super().late_init() + self.strtab = self.elf_file.sections[self.sh_link] + self.symbol_entries = [] + for i in range(0, self.sh_size, self.sh_entsize): + self.symbol_entries.append(Symbol(self.data[i:i+self.sh_entsize], self.elf_file)) + + def to_bin(self): + header, _ = super().to_bin() + data = bytearray() + for sym in self.symbol_entries: + data.extend(sym.to_bin()) + return header, data + + def find_symbol(self, name): + for s in self.symbol_entries: + if s.name == name: + return (s.st_shndx, s.st_value) + return None + + def lookup_symbol(self, vaddr): + found = [] + for s in self.symbol_entries: + if s.st_value == vaddr and s.type != ST_SECTION: + found.append(s) + if len(found) != 0: + found.sort(reverse=True, key=(lambda s : s.type)) + return found[0] + return None + + def lookup_symbol_for_section(self, vaddr, shndx): + found = [] + for s in self.symbol_entries: + if s.st_value == vaddr and s.type != ST_SECTION and s.st_shndx == shndx: + found.append(s) + if len(found) != 0: + found.sort(reverse=True, key=(lambda s : s.type)) + return found[0] + return None + + def lookup_symbol_in_section(self, vaddr, section): + found = [] + for s in self.symbol_entries: + if s.st_value == vaddr and s.type != ST_SECTION and s.st_shndx == section.index: + found.append(s) + if len(found) != 0: + found.sort(reverse=True, key=(lambda s : s.type)) + return found[0] + return None + + def find_symbol_in_section(self, name, section): + pos = self.find_symbol(name) + assert pos is not None + assert pos[0] == section.index + return pos[1] + + def local_symbols(self): + return self.symbol_entries[:self.sh_info] + + def global_symbols(self): + return self.symbol_entries[self.sh_info:] + +class StrtabSection(Section): + """ + String Table Section + """ + def __init__(self, header, data, index): + super().__init__(header, data, index) + + def lookup_str(self, index): + to = self.data.find(b'\0', index) + assert to != -1 + return self.data[index:to].decode('latin1') + +class RelocationSection(Section): + """ + Relocation Section + """ + def __init__(self, header, data, index): + super().__init__(header, data, index) + + def late_init(self): + if self.late_init_done: + return + super().late_init() + self.rel_target = self.elf_file.sections[self.sh_info] + self.rel_target.relocated_by.append(self) + self.relocations = [] + for i in range(0, self.sh_size, self.sh_entsize): + self.relocations.append(Relocation(self.data[i:][:self.sh_entsize], self.elf_file, self.rel_target, self.sh_type)) + + def to_bin(self): + header, _ = super().to_bin() + data = bytearray() + for rel in self.relocations: + data.extend(rel.to_bin()) + return header, data + + def lookup_reloc(self, vaddr): + for r in self.relocations: + if r.r_offset - r.r_offset % 4 == vaddr: + return r + return None + + def find_reloc(self, vaddr): + for r in self.relocations: + if r.r_offset == vaddr: + return r + return None + + def lookup_jtbl_reloc(self, vaddr, symtab): + for r in self.relocations: + r_sym = r.relocated_symbol(symtab) + if r_sym.st_value + r.r_addend == vaddr: + return r + return None + +class MdebugSection(Section): + """ + MIPS Debugging Section + """ + def __init__(self, header, elf_file, index): + super().__init__(header, elf_file, index) + self.parent = self.elf_file + self.hdrr = EcoffHDRR(self.data) + + self.fdrs = [] + for i in range(self.hdrr.ifdMax): + fdr = EcoffFdr.from_binary(self, i) + self.fdrs.append(fdr) + + def late_init(self): + if self.late_init_done: + return + super().late_init() + for fdr in self.fdrs: + fdr.late_init() + + def fdr_forname(self, filename): + for fdr in self.fdrs: + # remove path and file ext + normalized_name = ".".join(fdr.name.split("/")[-1].split(".")[:-1]) + + if normalized_name == filename: + return fdr + return None + + def fdr_foraddr(self, addr, extensions=('.c')): + for fdr in self.fdrs: + if fdr.adr == addr and any((fdr.name.endswith(ext) for ext in extensions)): + return fdr + return None + + def read_string(self, index): + to = self.elf_file.data.find(b'\0', self.hdrr.cbSsOffset + index) + assert to != -1 + return self.elf_file.data[self.hdrr.cbSsOffset + index:to].decode("ASCII") + + def read_ext_string(self, index): + to = self.elf_file.data.find(b'\0', self.hdrr.cbSsExtOffset + index) + assert to != -1 + return self.elf_file.data[self.hdrr.cbSsExtOffset + index:to].decode("ASCII") + +class ReginfoSection(Section): + """ + MIPS Register Information Section + """ + def __init__(self, header, elf_file, index): + super().__init__(header, elf_file, index) + +# ===================================================================================================== +# Elf File +# ===================================================================================================== + +class ElfFile: + def __init__(self, data): + def init_section(i): + offset = self.elf_header.e_shoff + i * self.elf_header.e_shentsize + section_type = struct.unpack(">I", data[offset + 4:][:4])[0] + header_data = data[offset:][:self.elf_header.e_shentsize] + + if section_type == SHT_REL or section_type == SHT_RELA: + return RelocationSection(header_data, self, i) + elif section_type == SHT_SYMTAB: + return SymtabSection(header_data, self, i) + elif section_type == SHT_STRTAB: + return StrtabSection(header_data, self, i) + elif section_type == SHT_MIPS_DEBUG: + return MdebugSection(header_data, self, i) + elif section_type == SHT_MIPS_REGINFO: + return ReginfoSection(header_data, self, i) + else: + return Section(header_data, self, i) + + self.data = data + self.elf_header = ElfHeader(data[0:52]) + + num_progheaders = self.elf_header.e_phnum + num_sections = self.elf_header.e_shnum + + # Init program headers + self.progheaders = [] + for i in range(num_progheaders): + offset = self.elf_header.e_phoff + i * self.elf_header.e_phentsize + self.progheaders.append(ProgramHeader(data[offset:][:self.elf_header.e_phentsize], self.elf_header.e_ident[EI_CLASS])) + + # Init sections + self.sections = [] + for i in range(num_sections): + self.sections.append(init_section(i)) + + # Init shstrtab and name sections + self.shstrtab = self.sections[self.elf_header.e_shstrndx] + assert isinstance(self.shstrtab, StrtabSection) + + for s in self.sections: + s.name = self.shstrtab.lookup_str(s.sh_name) + + # Init symtab + symtab = None + for s in self.sections: + if s.sh_type == SHT_SYMTAB: + assert not symtab , "Found more than one symtab section?" + symtab = s + self.symtab = symtab + if self.symtab is not None: + self.symtab.late_init() + + # Late Init sections + for s in self.sections: + s.late_init() + + def find_section_by_name(self, name): + for s in self.sections: + if s.name == name: + return s + return None + + def find_section_by_type(self, type): + for s in self.sections: + if s.sh_type == type: + return s + return None + +### Tests + +if __name__ == "__main__": + import sys + + elf_file = None + + with open(sys.argv[1], "rb") as elf: + elf_file = ElfFile(bytearray(elf.read())) + + # Header Info Test + print(elf_file.elf_header) + # Program Headers Info Test + print("") + print("Program Headers:") + print(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align") + for phdr in elf_file.progheaders: + print(phdr) + # Section Headers Info Test + print("") + print("Section Headers:") + print(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al") + for i,s in enumerate(elf_file.sections,0): + print(f" [{i:2}] {s}") + # Symbols Info Test + if elf_file.symtab is not None: + print("") + print(f"Symbol table '{elf_file.symtab.name}' contains {len(elf_file.symtab.symbol_entries)} entries") + print(" Num: Value Size Type Bind Vis Ndx Name") + for i,sym in enumerate(elf_file.symtab.symbol_entries,0): + print(f"{i:6}: {sym}") + # Relocations Info Test + print("") + for s in elf_file.sections: + if s.is_rel(): + print(f"\nRelocation section '{s.name}' at offset 0x{s.sh_offset:06X} contains {len(s.relocations)} entries:") + print(" Offset Info Type Sym.Value Sym.Name + Addend") + for reloc in s.relocations: + print(f"{reloc}") + # mdebug Info Test + print("") + mdebug_section = elf_file.find_section_by_type(SHT_MIPS_DEBUG) + if mdebug_section is not None: + """ + for fdr in mdebug_section.fdrs: + print(fdr) + for symr in fdr.symrs: + print(symr) + for pdr in fdr.pdrs: + print(pdr) + for symr in pdr.symrs: + print(symr) + for liner in pdr.lines: + print(liner) + """ + for fdr in mdebug_section.fdrs: + print(fdr.c_str()) diff --git a/lib/ultralib/tools/m2ctx.py b/lib/ultralib/tools/m2ctx.py new file mode 100755 index 0000000..39c5dc5 --- /dev/null +++ b/lib/ultralib/tools/m2ctx.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys +import subprocess +import tempfile + +script_dir = os.path.dirname(os.path.realpath(__file__)) +root_dir = os.path.abspath(os.path.join(script_dir, "..")) +src_dir = root_dir + "src/" + +# Project-specific +CPP_FLAGS = [ + "-Iinclude", + "-Iinclude/PR", + "-Iinclude/gcc", + "-Isrc", + "-Isrc/libc", + "-Iver/current/build/include", + "-D_LANGUAGE_C", + "-DF3DEX_GBI_2", + "-D_MIPS_SZLONG=32", + "-DSCRIPT(...)={}" + "-D__attribute__(...)=", + "-D__asm__(...)=", + "-ffreestanding", + "-DM2CTX", +] + +def import_c_file(in_file) -> str: + in_file = os.path.relpath(in_file, root_dir) + cpp_command = ["gcc", "-E", "-P", "-dM", *CPP_FLAGS, in_file] + cpp_command2 = ["gcc", "-E", "-P", *CPP_FLAGS, in_file] + + with tempfile.NamedTemporaryFile(suffix=".c") as tmp: + stock_macros = subprocess.check_output(["gcc", "-E", "-P", "-dM", tmp.name], cwd=root_dir, encoding="utf-8") + + out_text = "" + try: + out_text += subprocess.check_output(cpp_command, cwd=root_dir, encoding="utf-8") + out_text += subprocess.check_output(cpp_command2, cwd=root_dir, encoding="utf-8") + except subprocess.CalledProcessError: + print( + "Failed to preprocess input file, when running command:\n" + + cpp_command, + file=sys.stderr, + ) + sys.exit(1) + + if not out_text: + print("Output is empty - aborting") + sys.exit(1) + + for line in stock_macros.strip().splitlines(): + out_text = out_text.replace(line + "\n", "") + return out_text + +def main(): + parser = argparse.ArgumentParser( + description="""Create a context file which can be used for mips_to_c""" + ) + parser.add_argument( + "c_file", + help="""File from which to create context""", + ) + args = parser.parse_args() + + output = import_c_file(args.c_file) + + with open(os.path.join(root_dir, "ctx.c"), "w", encoding="UTF-8") as f: + f.write(output) + + +if __name__ == "__main__": + main() diff --git a/lib/ultralib/tools/mdebug.py b/lib/ultralib/tools/mdebug.py new file mode 100644 index 0000000..6f061ec --- /dev/null +++ b/lib/ultralib/tools/mdebug.py @@ -0,0 +1,938 @@ +#!/usr/bin/env python3 +# +# .mdebug section +# + +""" +References: +https://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf +https://web.archive.org/web/20010628021622/http://reality.sgi.com/davea/objectinfo.html +https://github.com/astrelsky/ghidra_mdebug +https://github.com/Rozelette/print-mdebug/blob/master/print_mdebug.py +https://opensource.apple.com/source/gcc_legacy/gcc_legacy-938/gcc/mips-tdump.c.auto.html +https://github.com/uhhpctools/openuh/blob/master/osprey-gcc-4.2.0/gcc/mips-tdump.c +https://github.com/bminor/binutils-gdb/blob/master/gdb/mdebugread.c + +(stabs docs): +https://sourceware.org/gdb/current/onlinedocs/stabs.html + +(ecoff docs): +https://web.archive.org/web/20160305114748/http://h41361.www4.hp.com/docs/base_doc/DOCUMENTATION/V50A_ACRO_SUP/OBJSPEC.PDF +https://chromium.googlesource.com/native_client/nacl-toolchain/+/refs/tags/gcc-4.4.3/binutils/gas/ecoff.c +https://kernel.googlesource.com/pub/scm/linux/kernel/git/hjl/binutils/+/hjl/secondary/include/coff/sym.h +https://kernel.googlesource.com/pub/scm/linux/kernel/git/hjl/binutils/+/hjl/secondary/include/coff/symconst.h +""" + +from enum import IntEnum +import struct + +class EcoffBt(IntEnum): # Basic Type + NIL = 0 # + ADR = 1 # pointer-sized integer type + CHAR = 2 # char + UCHAR = 3 # unsigned char + SHORT = 4 # short + USHORT = 5 # unsigned short + INT = 6 # int + UINT = 7 # unsigned int + LONG = 8 # long + ULONG = 9 # unsigned long + FLOAT = 10 # float + DOUBLE = 11 # double + STRUCT = 12 # struct + UNION = 13 # union + ENUM = 14 # enum + TYPEDEF = 15 # type definition + RANGE = 16 # subrange of int + SET = 17 # pascal set + COMPLEX = 18 # FORTRAN complex + DCOMPLEX = 19 # FORTRAN double com[plex + INDIRECT = 20 # forward or unnamed typedef + FIXEDDEC = 21 # Fixed point decimal + FLOATDEC = 22 # Floating point decimal + STRING = 23 # Varying length character string + BIT = 24 # Aligned bit tring + PICTURE = 25 # picture + VOID = 26 # void + LONGLONG = 27 # long long int + ULONGLONG = 28 # unsigned long long int + LONG64 = 30 # + ULONG64 = 31 # + LONGLONG64 = 32 # + ULONGLONG64 = 33 # + ADR64 = 34 # + INT64 = 35 # + UINT64 = 36 # + + AGGREGATE = 63 # not a basic type + MAX = 64 # + +class EcoffSc(IntEnum): + NIL = 0 + TEXT = 1 # .text symbol + DATA = 2 # .data symbol + BSS = 3 # .bss symbol + REGISTER = 4 # value of symbol is register number + ABS = 5 # value of symbol is absolute + UNDEFINED = 6 # value of symbol is undefined + CDBLOCAL = 7 # variable value is in se->va.?? + BITS = 8 # variable is a bit field + CDBSYSTEM = 9 # variable value is in cdb address space + REGIMAGE = 10 # register value is saved on stack + INFO = 11 # symbol contains debugger information + USERSTRUCT = 12 # address in struct user for current process + SDATA = 13 # load time only small data + SBSS = 14 # load time only small common + RDATA = 15 # load time only read-only data + VAR = 16 # var parameter (FORTRAN, Pascal) + COMMON = 17 # common variable + SCOMMON = 18 # small common + VARREGISTER = 19 # var parameter in a register + VARIANT = 20 # variant record + SUNDEFINED = 21 # small undefined (external) data + INIT = 22 # .init section symbol + BASEDVAR = 23 # FORTRAN or PL/1 ptr based var + XDATA = 24 # exception handling data + PDATA = 25 # procedure section + FINI = 26 # .fini section + RCONST = 27 # .rconst section + MAX = 32 # + +class EcoffSt(IntEnum): + NIL = 0 # + GLOBAL = 1 # external symbol + STATIC = 2 # static symbol + PARAM = 3 # procedure argument + LOCAL = 4 # local variable + LABEL = 5 # label + PROC = 6 # procedure + BLOCK = 7 # beginning of block + END = 8 # end of something + MEMBER = 9 # member of struct/union/enum/.. + TYPEDEF = 10 # type definition + FILE = 11 # filename + REGRELOC = 12 # register relocation + FORWARD = 13 # forwarding address + STATICPROC = 14 # load time only static procedures + # (CONSTANT and STAPARAM are in different orders between different sources...) + CONSTANT = 15 # constant + STAPARAM = 16 # FORTRAN static parameters + STRUCT = 26 # structure + UNION = 27 # union + ENUM = 28 # enum + INDIRECT = 34 # + +class EcoffTq(IntEnum): # Type qualifier + NIL = 0 # + PTR = 1 # pointer + PROC = 2 # procedure + ARRAY = 3 # array + FAR = 4 # longer addressing + VOL = 5 # volatile + CONST = 6 # constant + MAX = 8 # + + UNK7 = 7 # invalid + UNK9 = 9 # invalid + UNK10 = 10 # invalid + UNK11 = 11 # invalid + UNK12 = 12 # invalid + UNK13 = 13 # invalid + UNK14 = 14 # invalid + UNK = 15 # invalid + +class EcoffLanguageCode(IntEnum): + C = 0 + PASCAL = 1 + FORTRAN = 2 + ASM = 3 + MACHINE = 4 + NIL = 5 + ADA = 6 + PL1 = 7 + COBOL = 8 + STDC = 9 + CPLUSPLUSV2 = 10 + MAX = 11 + +def get_bitrange(value, start, length): + return (value >> start) & ((1 << length) - 1) + +def sign_extend_16(value): + return (value & 0x7FFF) - (value & 0x8000) + +def sign_extend_4(value): + return (value & 0x7) - (value & 0x8) + +class EcoffLiner: + """ + ECOFF Line Numbers Mapping + + typedef struct sLINER { + s32 count : 4; + s32 delta : 4; + } tLINER, *pLINER; + """ + + def __init__(self, data) -> None: + self.count = get_bitrange(data[0], 0, 4) + 1 + self.delta = get_bitrange(data[0], 4, 4) + + if self.delta == 8: + self.is_extended = True + self.delta = sign_extend_16((data[1] << 8) | data[2]) + self.data = data[:3] + else: + self.is_extended = False + self.delta = sign_extend_4(self.delta) + self.data = data[:1] + + def __str__(self) -> str: + return f"""= EcoffLiner ============= +delta = {self.delta} +count = {self.count} +extended = {self.is_extended}""" + +class EcoffTir: + """ + ECOFF Type Information Record + + typedef struct { +#ifdef LITTLE_ENDIAN + u32 tq3 : 4; + u32 tq2 : 4; + u32 tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ + u32 tq0 : 4; + /* ---- 16 bit boundary ---- */ + u32 tq5 : 4; + u32 tq4 : 4; + u32 bt : 6; /* basic type */ + u32 continued : 1; /* indicates additional TQ info in next AUX */ + u32 fBitfield : 1; /* set if bit width is specified */ +#else + u32 fBitfield : 1; /* set if bit width is specified */ + u32 continued : 1; /* indicates additional TQ info in next AUX */ + u32 bt : 6; /* basic type */ + u32 tq4 : 4; + u32 tq5 : 4; + /* ---- 16 bit boundary ---- */ + u32 tq0 : 4; + u32 tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ + u32 tq2 : 4; + u32 tq3 : 4; +#endif + } TIR, *pTIR; // size = 4 + """ + SIZE = 4 + + def __init__(self, data, endian) -> None: + if endian == 1: + self.tq3 = EcoffTq(get_bitrange(data, 0, 4)) + self.tq2 = EcoffTq(get_bitrange(data, 4, 4)) + self.tq1 = EcoffTq(get_bitrange(data, 8, 4)) + self.tq0 = EcoffTq(get_bitrange(data, 12, 4)) + self.tq5 = EcoffTq(get_bitrange(data, 16, 4)) + self.tq4 = EcoffTq(get_bitrange(data, 20, 4)) + self.bt = EcoffBt(get_bitrange(data, 24, 6)) + self.continued = get_bitrange(data, 30, 1) + self.fBitfield = get_bitrange(data, 31, 1) + else: + self.fBitfield = get_bitrange(data, 0, 1) + self.continued = get_bitrange(data, 1, 1) + self.bt = EcoffBt(get_bitrange(data, 2, 6)) + self.tq4 = EcoffTq(get_bitrange(data, 8, 4)) + self.tq5 = EcoffTq(get_bitrange(data, 12, 4)) + self.tq0 = EcoffTq(get_bitrange(data, 16, 4)) + self.tq1 = EcoffTq(get_bitrange(data, 20, 4)) + self.tq2 = EcoffTq(get_bitrange(data, 24, 4)) + self.tq3 = EcoffTq(get_bitrange(data, 28, 4)) + self.tqs = (self.tq0, self.tq1, self.tq2, self.tq3, self.tq4, self.tq5) + + def __str__(self) -> str: + return f"""= EcoffTIR ============== +fBitfield = {self.fBitfield} +continued = {self.continued} +bt = {self.bt.name} +tq4 = {self.tq4} +tq5 = {self.tq5} +tq0 = {self.tq0} +tq1 = {self.tq1} +tq2 = {self.tq2} +tq3 = {self.tq3}""" + +class EcoffRNDXR: + """ + typedef struct { +#ifdef LITTLE_ENDIAN + u32 index : 20; /* index int sym/aux/iss tables */ + u32 rfd : 12; /* index into the file indirect table */ +#else + u32 rfd : 12; /* index into the file indirect table */ + u32 index : 20; /* index int sym/aux/iss tables */ +#endif + } RNDXR, *pRNDXR; // size = 4 + """ + SIZE = 4 + + def __init__(self, data, endian) -> None: + if endian == 1: + self.index = get_bitrange(data, 0, 20) + self.rfd = get_bitrange(data, 20, 12) + else: + self.rfd = get_bitrange(data, 0, 12) + self.index = get_bitrange(data, 12, 20) + + def __str__(self) -> str: + return f"""= EcoffRNDXR ============== +index = {self.index} +rfd = {self.rfd}""" + +class EcoffAux: + """ + typedef union __sgi_auxu_u { + TIR ti; /* type information record */ + RNDXR rndx; /* relative index into symbol table */ + long_i dnLow; /* low dimension of array */ + long_i dnHigh; /* high dimension of array */ + long_i isym; /* symbol table index (end of proc) */ + long_i iss; /* index into string space (not used) */ + long_i width; /* width for non-default sized struct fields */ + long_i count; /* count of ranges for variant arm */ + } AUXU, *pAUXU; // size = 4 + """ + SIZE = 4 + + def __init__(self, fdr, data, endian) -> None: + data = struct.unpack((">" if endian == 1 else "<") + "I", data)[0] + self.ti = EcoffTir(data, endian) + self.rndx = EcoffRNDXR(data, endian) + self.dnLow = self.dnHigh = self.isym = self.iss = self.width = self.count = data + self.fdr = fdr + + def __str__(self) -> str: + return f"""= EcoffAux ============== +ti = {{ +{self.ti} +}} +rndx = {{ +{self.rndx} +}} +dnLow = {self.dnLow:04X} +dnHigh = {self.dnHigh:04X} +isym = {self.isym:04X} +iss = {self.iss:04X} +width = {self.width:04X} +count = {self.count:04X}""" + +class EcoffSymr: + """ + ECOFF Local Symbol + + typedef struct sSymr { + s32 iss; /* index into String Space of name */ + s32 value; /* symbol value */ + /* value can be an address, size or frame offset depending on symbol type */ + EcoffSt st : 6; /* symbol type */ + EcoffSc sc : 5; /* storage class - text, data, etc */ + s32 _reserved : 1; /* reserved bit */ + s32 index : 20; /* index into sym/aux table */ + } tSymr, *pSymr; // size = 0xC + """ + SIZE = 0xC + + def __init__(self, parent, idx, data): + self.idx = idx + self.parent = parent # can be either Fdr or Pdr + self.pdr = parent if type(parent) == EcoffPdr else None + self.fdr = self.pdr.parent if self.pdr is not None else parent + + self.data = data[:EcoffSymr.SIZE] + + self.iss, self.value, bits = struct.unpack(">III", self.data) + self.st = EcoffSt(get_bitrange(bits, 26, 6)) + self.sc = EcoffSc(get_bitrange(bits, 21, 5)) + self._reserved = get_bitrange(bits, 20, 1) + self.index = get_bitrange(bits, 0, 20) + + self.name = self.fdr.read_string(self.iss) + self.type_name = None + + self.c_repr = None + + assert self._reserved == 0 # Sanity check + + def link_syms(self): + if self.st == EcoffSt.END: + self.start_sym = self.fdr.symrs[self.index] + elif self.st in [EcoffSt.BLOCK, EcoffSt.FILE, EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + self.end_sym = self.fdr.symrs[self.index - 1] + elif self.st in [EcoffSt.PROC, EcoffSt.STATICPROC]: + aux = self.fdr.auxs[self.index] + self.end_sym = self.fdr.symrs[aux.isym - 1] + elif self.st in [EcoffSt.GLOBAL, EcoffSt.STATIC, EcoffSt.PARAM, EcoffSt.LOCAL, EcoffSt.MEMBER, EcoffSt.TYPEDEF, EcoffSt.FORWARD]: + pass + + def late_init(self): + if self.st == EcoffSt.END: + """ + END symbols index the associated begin symbol + """ + self.start_sym = self.fdr.symrs[self.index] + if self.start_sym.st == EcoffSt.BLOCK: + self.c_repr = "}" + elif self.start_sym.st == EcoffSt.FILE: + self.c_repr = f"// end of file: \"{self.start_sym.name}\"" + elif self.start_sym.st in [EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + self.c_repr = "}" + if len(self.start_sym.type_name) != 0: + self.c_repr += " " + self.start_sym.type_name + self.c_repr += f";" + elif self.st in [EcoffSt.BLOCK, EcoffSt.FILE, EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + """ + These symbols index the first symbol after their associated END symbol + """ + self.end_sym = self.fdr.symrs[self.index - 1] + if self.st == EcoffSt.BLOCK: + self.c_repr = "{" + elif self.st == EcoffSt.FILE: + self.c_repr = f"#line 1 \"{self.name}\"" + elif self.st in [EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + keyword = "" + self.type_name = "" + next_sym = self.fdr.symrs[self.index] + if next_sym.st == EcoffSt.TYPEDEF: + # possible typedef struct/union/enum + # TODO check this by ensuring the typedef symbol references this symbol + keyword += "typedef " + self.type_name = next_sym.name + + if self.st == EcoffSt.UNION: + keyword += "union" + elif self.st == EcoffSt.ENUM: + keyword += "enum" + else: + keyword += "struct" + + name = self.name + if len(name) != 0: + name = ' ' + name + + self.c_repr = f"{keyword}{name} {{" + elif self.st in [EcoffSt.PROC, EcoffSt.STATICPROC]: + aux1 = self.fdr.auxs[self.index] + self.end_sym = self.fdr.symrs[aux1.isym - 1] + + self.c_repr = "" + if self.st == EcoffSt.STATICPROC: + self.c_repr += "static " + + self.return_type, _ = self.process_type_information(1) + self.c_repr += self.return_type + if len(self.return_type) != 0: + self.c_repr += " " + self.c_repr += self.name + self.c_repr += "()" + elif self.st in [EcoffSt.GLOBAL, EcoffSt.STATIC, EcoffSt.PARAM, EcoffSt.LOCAL, EcoffSt.MEMBER, EcoffSt.FORWARD]: + self.c_repr = "" + if self.st == EcoffSt.MEMBER: + # value of a stMember is the offset in bits + self.c_repr += f"/* 0x{self.value//8:X} */ " + + type_str, bitwidth = self.process_type_information(0) + self.c_repr += type_str + if len(self.c_repr) != 0: + self.c_repr += " " + self.c_repr += f"{self.name}{f' : {bitwidth}' if bitwidth is not None else ''};" + elif self.st == EcoffSt.TYPEDEF: + # TODO the typedef may already be absorbed into a struct or similar, check before emitting + type_str, _ = self.process_type_information(0) + self.c_repr = f"typedef {type_str} {self.name};" + elif self.st == EcoffSt.LABEL: + self.c_repr = f"{self.name}:" + + def process_type_information(self, ind): + c_bt_names = { + EcoffBt.NIL : None, + EcoffBt.ADR : None, + EcoffBt.CHAR : "signed char", + EcoffBt.UCHAR : "char", + EcoffBt.SHORT : "short", + EcoffBt.USHORT : "unsigned short", + EcoffBt.INT : "int", + EcoffBt.UINT : "unsigned int", + EcoffBt.LONG : "long", + EcoffBt.ULONG : "unsigned long", + EcoffBt.FLOAT : "float", + EcoffBt.DOUBLE : "double", + EcoffBt.STRUCT : "struct", + EcoffBt.UNION : "union", + EcoffBt.ENUM : "enum", + EcoffBt.TYPEDEF : "typedef", + EcoffBt.RANGE : None, + EcoffBt.SET : None, + EcoffBt.COMPLEX : "complex", + EcoffBt.DCOMPLEX : "double complex", + EcoffBt.INDIRECT : None, + EcoffBt.FIXEDDEC : None, + EcoffBt.FLOATDEC : None, + EcoffBt.STRING : "const char*", + EcoffBt.BIT : None, + EcoffBt.PICTURE : None, + EcoffBt.VOID : "void", + EcoffBt.LONGLONG : "long long", + EcoffBt.ULONGLONG : "unsigned long long", + EcoffBt.LONG64 : "long", + EcoffBt.ULONG64 : "unsigned long", + EcoffBt.LONGLONG64 : "long long", + EcoffBt.ULONGLONG64 : "unsigned long long", + EcoffBt.ADR64 : None, + EcoffBt.INT64 : None, + EcoffBt.UINT64 : None, + } + c_tq_str = { + EcoffTq.NIL : "", + EcoffTq.PTR : "*", + EcoffTq.PROC : "()", + EcoffTq.ARRAY : "[]", + EcoffTq.FAR : "/* FAR */", + EcoffTq.VOL : "volatile", + EcoffTq.CONST : "const", + } + + if self.index == 0xFFFFF: + # no type info + return "", None + + aux = self.fdr.auxs[self.index + ind] + ind += 1 + type_str = "" + + bit_width = None + if aux.ti.fBitfield == 1: + bit_width = self.fdr.auxs[self.index + ind].isym + ind += 1 + + if aux.ti.bt in [EcoffBt.STRUCT, EcoffBt.UNION, EcoffBt.ENUM, EcoffBt.TYPEDEF]: + type_ref_aux = self.fdr.auxs[self.index + ind] + ind += 1 + + fd_ref_idx = type_ref_aux.rndx.rfd + if fd_ref_idx == 4095: + fd_ref_idx = self.fdr.auxs[self.index + ind].isym + ind += 1 + + fdr_ref = self.fdr.parent.fdrs[fd_ref_idx] + sym_ref = fdr_ref.symrs[type_ref_aux.rndx.index] + # now we have the reference to the stStruct, stUnion, stEnum, or stTypeDef + type_str += f"{sym_ref.type_name if sym_ref.type_name is not None else sym_ref.name}" + else: + type_str += f"{c_bt_names[aux.ti.bt]}" + + # TODO improve emitting qualified types + tqs = "" + for tq in aux.ti.tqs: + if tq == EcoffTq.NIL: + continue + if tq == EcoffTq.ARRAY: + ind += 2 # skips over some info such as the type of index (always int for C) + array_low_aux = self.fdr.auxs[self.index + ind] + array_high_aux = self.fdr.auxs[self.index + ind + 1] + stride_aux = self.fdr.auxs[self.index + ind + 2] + ind += 3 + tqs += "[" + if array_high_aux.dnHigh != 0xFFFFFFFF: + tqs += '%d' % (array_high_aux.dnHigh + 1) + tqs += "]" + else: + tqs += c_tq_str[tq] + tqs += " " + tqs = tqs.strip() + if len(tqs) != 0: + type_str += " " + tqs + + return type_str, bit_width + + def __str__(self) -> str: + return f"""= EcoffSymr ============== {self.idx} +iss = 0x{self.iss:08X} +value = 0x{self.value:08X} +st = st{self.st.name} +sc = sc{self.sc.name} +_reserved = {self._reserved} +index = 0x{self.index:05X} +name = {self.name}""" + +class EcoffPdr: + """ + ECOFF Procedure Descriptor + + typedef struct sPDR { + s32 addr; /* memory address of start of procedure */ + s32 isym; /* start of local symbol entries */ + s32 iline; /* start of line number entries */ + s32 regmask; /* save register mask */ + s32 regoffset; /* save register offset */ + s32 iopt; /* start of optimization symbol entries */ + s32 fregmask; /* save floating point register mask */ + s32 fregoffset; /* save floating point register offset */ + s32 frameoffset; /* frame size */ + u16 framereg; /* frame pointer register */ + u16 pcreg; /* offset or reg of return pc */ + s32 lnLow; /* lowest line in the procedure */ + s32 lnHigh; /* highest line in the procedure */ + s32 cbLineOffset; /* byte offset for this procedure from the fd base */ +#ifdef 64_BIT + // TODO there's a bitfield in here + s32 gpPrologue; /* byte size of GP prologue */ + s32 gpUsed; /* true if the procedure uses GP */ + s32 regFrame; /* true if register frame procedure */ + s32 prof; /* true if compiled with -pg */ + s32 localOffset; /* offset of local variables from vfp */ +#endif + } tPDR, *pPDR; // size = 0x34 + """ + SIZE = 0x34 + + def __init__(self, fdr, data) -> None: + self.parent = fdr + self.data = data[:EcoffPdr.SIZE] + + self.addr, self.isym, self.iline, self.regmask, \ + self.regoffset, self.iopt, self.fregmask, self.fregoffset, \ + self.frameoffset, self.framereg, self.pcreg, self.lnLow, \ + self.lnHigh, self.cbLineOffset = struct.unpack(">IIIIIIIIIHHIII", self.data) + + self.symrs = [] + + i = self.isym + symr = self.parent.symrs[i] + assert symr.st == EcoffSt.PROC or symr.st == EcoffSt.STATICPROC + # Inherit procedure name from procedure symbol + self.name = symr.name + + self.symrs.append(symr) + while not (symr.st == EcoffSt.END and symr.name == self.symrs[0].name): + i += 1 + symr = self.parent.symrs[i] + self.symrs.append(symr) + + assert symr.st == EcoffSt.END and symr.sc == EcoffSc.TEXT + self.size = symr.value # value field of an stEND and scTEXT symbol is the procedure size + assert self.size % 4 == 0 + + # indexed by asm word offset from proc start + self.lines = [] + + # ilineMax = self.parent.parent.hdrr.ilineMax + # cbLine = self.parent.parent.hdrr.cbLine + # cbLineOffset = self.parent.parent.hdrr.cbLineOffset + # ilineBase = self.parent.ilineBase + # cline = self.parent.cline + # cbLineOffset = self.parent.cbLineOffset + # cbLine = self.parent.cbLine + # lnLow = self.lnLow + # lnHigh = self.lnHigh + # iline = self.iline + + elf_data = self.parent.parent.parent.data + + line_no = self.lnLow # first line in the procedure + line_data = self.parent.parent.hdrr.cbLineOffset + self.parent.cbLineOffset + self.cbLineOffset + # line_end = self.parent.parent.hdrr.cbLineOffset + self.parent.cbLineOffset + self.parent.cbLine + + # print(self) + # print(f"{self.name} [{self.lnLow}:{self.lnHigh}]") + # print(self.size//4) + while len(self.lines) < self.size//4: + # assert line_data < line_end , "Overflow in line numbers table" + + liner = EcoffLiner(elf_data[line_data:]) + line_no += liner.delta + # if line_no < self.lnLow or line_no > self.lnHigh: + # break + + # print(liner) + for i in range(liner.count): + # print(f"[{len(self.lines)}] {line_no}") + self.lines.append(line_no) + + line_data += len(liner.data) + + def lookup_sym(self, value, type=-1): + for sym in self.symrs: + if sym.value == value and (type == -1 or type == sym.st): + return sym + return None + + def __str__(self) -> str: + return f"""= EcoffPdr =============== +addr = 0x{self.addr:08X} +isym = 0x{self.isym:08X} +iline = 0x{self.iline:08X} +regmask = 0b{self.regmask:032b} +regoffset = 0x{self.regoffset:08X} +iopt = 0x{self.iopt:08X} +fregmask = 0b{self.fregmask:032b} +fregoffset = 0x{self.fregoffset:08X} +frameoffset = 0x{self.frameoffset:08X} +framereg = ${self.framereg} +pcreg = ${self.pcreg} +lnLow = {self.lnLow} +lnHigh = {self.lnHigh} +cbLineOffset = 0x{self.cbLineOffset:08X} +name = {self.name}""" + +class EcoffFdr: + """ + ECOFF File Descriptor + + typedef struct sFDR { + u32 adr; /* memory address of beginning of file */ + s32 rss; /* file name (of source, if known) */ + s32 issBase; /* file's string space */ + s32 cbSs; /* number of bytes in the ss */ + s32 isymBase; /* beginning of symbols */ + s32 csym; /* count file's of symbols */ + s32 ilineBase; /* file's line symbols */ + s32 cline; /* count of file's line symbols */ + s32 ioptBase; /* file's optimization entries */ + s32 copt; /* count of file's optimization entries */ + u16 ipdFirst; /* start of procedures for this file */ + u16 cpd; /* count of procedures for this file */ + s32 iauxBase; /* file's auxiliary entries */ + s32 caux; /* count of file's auxiliary entries */ + s32 rfdBase; /* index into the file indirect table */ + s32 crfd; /* count file indirect entries */ + EcoffLanguageCode lang : 5; /* language for this file */ + u32 fMerge : 1; /* whether this file can be merged */ + u32 fReadin : 1; /* true if it was read in (not just created) */ + u32 fBigEndian : 1; /* true if AUXU's are big endian */ + u32 glevel : 2; /* level this file was compiled with */ + u32 _reserved : 20; /* reserved bits */ + s32 cbLineOffset; /* byte offset from header for this file ln's */ + s32 cbLine; /* size of lines for this file */ + } tFDR, *pFDR; // size = 0x48 + """ + SIZE = 0x48 + + @staticmethod + def from_binary(mdebug, i): + # Init + if 'init' not in EcoffFdr.from_binary.__dict__: + EcoffFdr.from_binary.cache = {} + EcoffFdr.from_binary.init = True + # Parent Init + if mdebug not in EcoffFdr.from_binary.cache: + EcoffFdr.from_binary.cache[mdebug] = {} + # Cache hit + if i in EcoffFdr.from_binary.cache[mdebug]: + return EcoffFdr.from_binary.cache[mdebug][i] + # Cache miss + cbFdOffset = mdebug.hdrr.cbFdOffset + elf_data = mdebug.parent.data + EcoffFdr.from_binary.cache[mdebug][i] = EcoffFdr(mdebug, elf_data[cbFdOffset+i*EcoffFdr.SIZE:cbFdOffset+(i+1)*EcoffFdr.SIZE]) + return EcoffFdr.from_binary.cache[mdebug][i] + + def __init__(self, mdebug, data) -> None: + self.parent = mdebug + self.data = data[:EcoffFdr.SIZE] + + self.adr, self.rss, self.issBase, self.cbSs, \ + self.isymBase, self.csym, self.ilineBase, self.cline, \ + self.ioptBase, self.copt, self.ipdFirst, self.cpd, \ + self.iauxBase, self.caux, self.rfdBase, self.crfd, \ + bits, self.cbLineOffset, self.cbLine = struct.unpack(">IIIIIIIIIIHHIIIIIII", self.data) + + self.lang = EcoffLanguageCode(get_bitrange(bits, 27, 5)) + self.fMerge = get_bitrange(bits, 26, 1) + self.fReadin = get_bitrange(bits, 25, 1) + self.fBigEndian = get_bitrange(bits, 24, 1) + self.glevel = get_bitrange(bits, 22, 2) + self._reserved = get_bitrange(bits, 2, 20) + + self.name = self.parent.read_string(self.issBase + self.rss) + + # print(self) + + hdrr = self.parent.hdrr + elf_data = self.parent.parent.data + + # Aux Symbols + self.auxs = [] + for i in range(self.caux): + i += self.iauxBase + assert i < hdrr.iauxMax , "Out of bounds in Auxiliary Symbol Table" + aux = EcoffAux(self, elf_data[hdrr.cbAuxOffset+i*EcoffAux.SIZE:][:EcoffAux.SIZE], self.fBigEndian) + self.auxs.append(aux) + + # Symbols + self.symrs = [] + for i in range(self.csym): + j = i + self.isymBase + assert j < hdrr.isymMax , "Out of bounds in Local Symbol Table" + symr = EcoffSymr(self, i, elf_data[hdrr.cbSymOffset+j*EcoffSymr.SIZE:hdrr.cbSymOffset+(j+1)*EcoffSymr.SIZE]) + self.symrs.append(symr) + for symr in self.symrs: + symr.link_syms() + + # PDRs + self.pdrs = [] + for i in range(self.cpd): + i += self.ipdFirst + assert i < hdrr.ipdMax , "Out of bounds in Procedure Descriptor Table" + pdr = EcoffPdr(self, elf_data[hdrr.cbPdOffset+i*EcoffPdr.SIZE:hdrr.cbPdOffset+(i+1)*EcoffPdr.SIZE]) + self.pdrs.append(pdr) + + self.size = sum([pdr.size for pdr in self.pdrs]) + + def late_init(self): + for symr in self.symrs: + symr.late_init() + + def pdr_forname(self, procedure_name): + for pdr in self.pdrs: + if pdr.name == procedure_name: + return pdr + return None + + def pdr_foranyaddr(self, addr): + for pdr in self.pdrs: + if pdr.addr <= addr and pdr.addr + pdr.size > addr: + return pdr + return None + + def pdr_foraddr(self, addr): + for pdr in self.pdrs: + if pdr.addr == addr: + return pdr + return None + + def read_string(self, index): + return self.parent.read_string(self.issBase + index) + + def c_str(self) -> str: + """ + C prettyprint file + """ + def print_symbol(symr): + return f"{symr.st.name} :: {symr.c_repr}" + + indent = 0 + out = f"File: {self.name}\n" + + for symr in self.symrs: + if symr.st in [EcoffSt.END]: + indent -= 2 + + out += " " * indent + out += print_symbol(symr) + out += "\n" + + if symr.st in [EcoffSt.FILE, EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.PROC, EcoffSt.STATICPROC, EcoffSt.BLOCK]: + indent += 2 + + return out + + def __str__(self) -> str: + return f"""= EcoffFdr =============== +adr = 0x{self.adr:08X} +rss = 0x{self.rss:08X} +issBase = 0x{self.issBase:08X} +cbSs = 0x{self.cbSs:08X} +isymBase = 0x{self.isymBase:08X} +csym = 0x{self.csym:08X} +ilineBase = 0x{self.ilineBase:08X} +cline = 0x{self.cline:08X} +ioptBase = 0x{self.ioptBase:08X} +copt = 0x{self.copt:08X} +ipdFirst = 0x{self.ipdFirst:08X} +cpd = 0x{self.cpd:08X} +iauxBase = 0x{self.iauxBase:08X} +caux = 0x{self.caux:08X} +rfdBase = 0x{self.rfdBase:08X} +crfd = 0x{self.crfd:08X} +lang = {self.lang.name} +fMerge = {bool(self.fMerge)} +fReadin = {bool(self.fReadin)} +fBigEndian = {bool(self.fBigEndian)} +glevel = {self.glevel} +_reserved = {self._reserved} +cbLineOffset = 0x{self.cbLineOffset:08X} +cbLine = 0x{self.cbLine:08X} +name = {self.name}""" + +class EcoffHDRR: + """ + Symbolic Header + + typedef struct sHDRR { + u16 magic; /* 0x7009 */ + u16 vstamp; /* version stamp */ + s32 ilineMax; /* number of line number entries */ + s32 cbLine; /* number of bytes for line number entries */ + s32 cbLineOffset; /* offset to start of line number entries */ + s32 idnMax; /* max index into dense number table */ + s32 cbDnOffset; /* offset to start dense number table */ + s32 ipdMax; /* number of procedures */ + s32 cbPdOffset; /* offset to procedure descriptor table */ + s32 isymMax; /* number of local symbols */ + s32 cbSymOffset; /* offset to start of local symbols */ + s32 ioptMax; /* max index into optimization symbol entries */ + s32 cbOptOffset; /* offset to optimization symbol entries */ + s32 iauxMax; /* number of auxillary symbol entries */ + s32 cbAuxOffset; /* offset to start of auxillary symbol entries */ + s32 issMax; /* max index into local strings */ + s32 cbSsOffset; /* offset to start of local strings */ + s32 issExtMax; /* max index into external strings */ + s32 cbSsExtOffset; /* offset to start of external strings */ + s32 ifdMax; /* number of file descriptor entries */ + s32 cbFdOffset; /* offset to file descriptor table */ + s32 crfd; /* number of relative file descriptor entries */ + s32 cbRfdOffset; /* offset to relative file descriptor table */ + s32 iextMax; /* max index into external symbols */ + s32 cbExtOffset; /* offset to start of external symbol entries */ + } tHDRR, *pHDRR; // size = 0x60 + """ + HDRR_MAGIC = 0x7009 + SIZE = 0x60 + + def __init__(self, data) -> None: + self.data = data[:EcoffHDRR.SIZE] + + self.magic, self.vstamp, self.ilineMax, self.cbLine, \ + self.cbLineOffset, self.idnMax, self.cbDnOffset, self.ipdMax, \ + self.cbPdOffset, self.isymMax, self.cbSymOffset, self.ioptMax, \ + self.cbOptOffset, self.iauxMax, self.cbAuxOffset, self.issMax, \ + self.cbSsOffset, self.issExtMax, self.cbSsExtOffset, self.ifdMax, \ + self.cbFdOffset, self.crfd, self.cbRfdOffset, self.iextMax, \ + self.cbExtOffset = struct.unpack(">HHIIIIIIIIIIIIIIIIIIIIIII", self.data) + + assert self.magic == EcoffHDRR.HDRR_MAGIC , f"Symbolic Header magic value is incorrect. Got 0x{self.magic:04X}, expected 0x{EcoffHDRR.HDRR_MAGIC:04X}" + + def __str__(self) -> str: + return f"""= EcoffHDRR ============== +magic = 0x{self.magic:04X} +vstamp = 0x{self.vstamp:04X} +ilineMax = 0x{self.ilineMax:08X} +cbLine = 0x{self.cbLine:08X} +cbLineOffset = 0x{self.cbLineOffset:08X} +idnMax = 0x{self.idnMax:08X} +cbDnOffset = 0x{self.cbDnOffset:08X} +ipdMax = 0x{self.ipdMax:08X} +cbPdOffset = 0x{self.cbPdOffset:08X} +isymMax = 0x{self.isymMax:08X} +cbSymOffset = 0x{self.cbSymOffset:08X} +ioptMax = 0x{self.ioptMax:08X} +cbOptOffset = 0x{self.cbOptOffset:08X} +iauxMax = 0x{self.iauxMax:08X} +cbAuxOffset = 0x{self.cbAuxOffset:08X} +issMax = 0x{self.issMax:08X} +cbSsOffset = 0x{self.cbSsOffset:08X} +issExtMax = 0x{self.issExtMax:08X} +cbSsExtOffset = 0x{self.cbSsExtOffset:08X} +ifdMax = 0x{self.ifdMax:08X} +cbFdOffset = 0x{self.cbFdOffset:08X} +crfd = 0x{self.crfd:08X} +cbRfdOffset = 0x{self.cbRfdOffset:08X} +iextMax = 0x{self.iextMax:08X} +cbExtOffset = 0x{self.cbExtOffset:08X}""" diff --git a/lib/ultralib/tools/mips_isa.py b/lib/ultralib/tools/mips_isa.py new file mode 100644 index 0000000..d99dcda --- /dev/null +++ b/lib/ultralib/tools/mips_isa.py @@ -0,0 +1,1309 @@ +# TODO enum these constants +from enum import IntEnum, auto + +# Register IDs +class MipsGPReg(IntEnum): + R0 = 0 # 0 + AT = auto() # 1 + V0 = auto() # 2 + V1 = auto() # 3 + A0 = auto() # 4 + A1 = auto() # 5 + A2 = auto() # 6 + A3 = auto() # 7 + T0 = auto() # 8 + T1 = auto() # 9 + T2 = auto() # 10 + T3 = auto() # 11 + T4 = auto() # 12 + T5 = auto() # 13 + T6 = auto() # 14 + T7 = auto() # 15 + S0 = auto() # 16 + S1 = auto() # 17 + S2 = auto() # 18 + S3 = auto() # 19 + S4 = auto() # 20 + S5 = auto() # 21 + S6 = auto() # 22 + S7 = auto() # 23 + T8 = auto() # 24 + T9 = auto() # 25 + K0 = auto() # 26 + K1 = auto() # 27 + GP = auto() # 28 + SP = auto() # 29 + FP = auto() # 30 + RA = auto() # 31 + +class MipsFPReg(IntEnum): + F0 = 0 # 0 + F1 = auto() # 1 + F2 = auto() # 2 + F3 = auto() # 3 + F4 = auto() # 4 + F5 = auto() # 5 + F6 = auto() # 6 + F7 = auto() # 7 + F8 = auto() # 8 + F9 = auto() # 9 + F10 = auto() # 10 + F11 = auto() # 11 + F12 = auto() # 12 + F13 = auto() # 13 + F14 = auto() # 14 + F15 = auto() # 15 + F16 = auto() # 16 + F17 = auto() # 17 + F18 = auto() # 18 + F19 = auto() # 19 + F20 = auto() # 20 + F21 = auto() # 21 + F22 = auto() # 22 + F23 = auto() # 23 + F24 = auto() # 24 + F25 = auto() # 25 + F26 = auto() # 26 + F27 = auto() # 27 + F28 = auto() # 28 + F29 = auto() # 29 + F30 = auto() # 30 + F31 = auto() # 31 + +# Instruction Unique IDs +MIPS_INS_SLL = 0 +MIPS_INS_SRL = 1 +MIPS_INS_SRA = 2 +MIPS_INS_SLLV = 3 +MIPS_INS_SRLV = 4 +MIPS_INS_SRAV = 5 +MIPS_INS_JR = 6 +MIPS_INS_JALR = 7 +MIPS_INS_SYSCALL = 8 +MIPS_INS_BREAK = 9 +MIPS_INS_SYNC = 10 +MIPS_INS_MFHI = 11 +MIPS_INS_MTHI = 12 +MIPS_INS_MFLO = 13 +MIPS_INS_MTLO = 14 +MIPS_INS_DSLLV = 15 +MIPS_INS_DSRLV = 16 +MIPS_INS_DSRAV = 17 +MIPS_INS_MULT = 18 +MIPS_INS_MULTU = 19 +MIPS_INS_DIV = 20 +MIPS_INS_DIVU = 21 +MIPS_INS_DMULT = 22 +MIPS_INS_DMULTU = 23 +MIPS_INS_DDIV = 24 +MIPS_INS_DDIVU = 25 +MIPS_INS_ADD = 26 +MIPS_INS_ADDU = 27 +MIPS_INS_SUB = 28 +MIPS_INS_SUBU = 29 +MIPS_INS_AND = 30 +MIPS_INS_OR = 31 +MIPS_INS_XOR = 32 +MIPS_INS_NOR = 33 +MIPS_INS_SLT = 34 +MIPS_INS_SLTU = 35 +MIPS_INS_DADD = 36 +MIPS_INS_DADDU = 37 +MIPS_INS_DSUB = 38 +MIPS_INS_DSUBU = 39 +MIPS_INS_TGE = 40 +MIPS_INS_TGEU = 41 +MIPS_INS_TLT = 42 +MIPS_INS_TLTU = 43 +MIPS_INS_TEQ = 44 +MIPS_INS_TNE = 45 +MIPS_INS_DSLL = 46 +MIPS_INS_DSRL = 47 +MIPS_INS_DSRA = 48 +MIPS_INS_DSLL32 = 49 +MIPS_INS_DSRL32 = 50 +MIPS_INS_DSRA32 = 51 +MIPS_INS_BLTZ = 52 +MIPS_INS_BGEZ = 53 +MIPS_INS_BLTZL = 54 +MIPS_INS_BGEZL = 55 +MIPS_INS_TGEI = 56 +MIPS_INS_TGEIU = 57 +MIPS_INS_TLTI = 58 +MIPS_INS_TLTIU = 59 +MIPS_INS_TEQI = 60 +MIPS_INS_TNEI = 61 +MIPS_INS_BLTZAL = 62 +MIPS_INS_BGEZAL = 63 +MIPS_INS_BLTZALL = 64 +MIPS_INS_BGEZALL = 65 +MIPS_INS_J = 66 +MIPS_INS_JAL = 67 +MIPS_INS_BEQ = 68 +MIPS_INS_BNE = 69 +MIPS_INS_BLEZ = 70 +MIPS_INS_BGTZ = 71 +MIPS_INS_ADDI = 72 +MIPS_INS_ADDIU = 73 +MIPS_INS_SLTI = 74 +MIPS_INS_SLTIU = 75 +MIPS_INS_ANDI = 76 +MIPS_INS_ORI = 77 +MIPS_INS_XORI = 78 +MIPS_INS_LUI = 79 +MIPS_INS_MFC0 = 80 +MIPS_INS_MTC0 = 81 +MIPS_INS_TLBR = 82 +MIPS_INS_TLBWI = 83 +MIPS_INS_TLBWR = 84 +MIPS_INS_TLBP = 85 +MIPS_INS_ERET = 86 +MIPS_INS_MFC1 = 87 +MIPS_INS_DMFC1 = 88 +MIPS_INS_CFC1 = 89 +MIPS_INS_MTC1 = 90 +MIPS_INS_DMTC1 = 91 +MIPS_INS_CTC1 = 92 +MIPS_INS_BC1F = 93 +MIPS_INS_BC1T = 94 +MIPS_INS_BC1FL = 95 +MIPS_INS_BC1TL = 96 +MIPS_INS_ADD_S = 97 +MIPS_INS_SUB_S = 98 +MIPS_INS_MUL_S = 99 +MIPS_INS_DIV_S = 100 +MIPS_INS_SQRT_S = 101 +MIPS_INS_ABS_S = 102 +MIPS_INS_MOV_S = 103 +MIPS_INS_NEG_S = 104 +MIPS_INS_ROUND_L_S = 105 +MIPS_INS_TRUNC_L_S = 106 +MIPS_INS_CEIL_L_S = 107 +MIPS_INS_FLOOR_L_S = 108 +MIPS_INS_ROUND_W_S = 109 +MIPS_INS_TRUNC_W_S = 110 +MIPS_INS_CEIL_W_S = 111 +MIPS_INS_FLOOR_W_S = 112 +MIPS_INS_CVT_D_S = 113 +MIPS_INS_CVT_W_S = 114 +MIPS_INS_CVT_L_S = 115 +MIPS_INS_C_F_S = 116 +MIPS_INS_C_UN_S = 117 +MIPS_INS_C_EQ_S = 118 +MIPS_INS_C_UEQ_S = 119 +MIPS_INS_C_OLT_S = 120 +MIPS_INS_C_ULT_S = 121 +MIPS_INS_C_OLE_S = 122 +MIPS_INS_C_ULE_S = 123 +MIPS_INS_C_SF_S = 124 +MIPS_INS_C_NGLE_S = 125 +MIPS_INS_C_SEQ_S = 126 +MIPS_INS_C_NGL_S = 127 +MIPS_INS_C_LT_S = 128 +MIPS_INS_C_NGE_S = 129 +MIPS_INS_C_LE_S = 130 +MIPS_INS_C_NGT_S = 131 +MIPS_INS_ADD_D = 132 +MIPS_INS_SUB_D = 133 +MIPS_INS_MUL_D = 134 +MIPS_INS_DIV_D = 135 +MIPS_INS_SQRT_D = 136 +MIPS_INS_ABS_D = 137 +MIPS_INS_MOV_D = 138 +MIPS_INS_NEG_D = 139 +MIPS_INS_ROUND_L_D = 140 +MIPS_INS_TRUNC_L_D = 141 +MIPS_INS_CEIL_L_D = 142 +MIPS_INS_FLOOR_L_D = 143 +MIPS_INS_ROUND_W_D = 144 +MIPS_INS_TRUNC_W_D = 145 +MIPS_INS_CEIL_W_D = 146 +MIPS_INS_FLOOR_W_D = 147 +MIPS_INS_CVT_S_D = 148 +MIPS_INS_CVT_W_D = 149 +MIPS_INS_CVT_L_D = 150 +MIPS_INS_C_F_D = 151 +MIPS_INS_C_UN_D = 152 +MIPS_INS_C_EQ_D = 153 +MIPS_INS_C_UEQ_D = 154 +MIPS_INS_C_OLT_D = 155 +MIPS_INS_C_ULT_D = 156 +MIPS_INS_C_OLE_D = 157 +MIPS_INS_C_ULE_D = 158 +MIPS_INS_C_SF_D = 159 +MIPS_INS_C_NGLE_D = 160 +MIPS_INS_C_SEQ_D = 161 +MIPS_INS_C_NGL_D = 162 +MIPS_INS_C_LT_D = 163 +MIPS_INS_C_NGE_D = 164 +MIPS_INS_C_LE_D = 165 +MIPS_INS_C_NGT_D = 166 +MIPS_INS_CVT_S_W = 167 +MIPS_INS_CVT_D_W = 168 +MIPS_INS_CVT_S_L = 169 +MIPS_INS_CVT_D_L = 170 +MIPS_INS_BEQL = 171 +MIPS_INS_BNEL = 172 +MIPS_INS_BLEZL = 173 +MIPS_INS_BGTZL = 174 +MIPS_INS_DADDI = 175 +MIPS_INS_DADDIU = 176 +MIPS_INS_LDL = 177 +MIPS_INS_LDR = 178 +MIPS_INS_LB = 179 +MIPS_INS_LH = 180 +MIPS_INS_LWL = 181 +MIPS_INS_LW = 182 +MIPS_INS_LBU = 183 +MIPS_INS_LHU = 184 +MIPS_INS_LWR = 185 +MIPS_INS_LWU = 186 +MIPS_INS_SB = 187 +MIPS_INS_SH = 188 +MIPS_INS_SWL = 189 +MIPS_INS_SW = 190 +MIPS_INS_SDL = 191 +MIPS_INS_SDR = 192 +MIPS_INS_SWR = 193 +MIPS_INS_CACHE = 194 +MIPS_INS_LL = 195 +MIPS_INS_LWC1 = 196 +MIPS_INS_LWC2 = 197 +MIPS_INS_LLD = 198 +MIPS_INS_LDC1 = 199 +MIPS_INS_LDC2 = 200 +MIPS_INS_LD = 201 +MIPS_INS_SC = 202 +MIPS_INS_SWC1 = 203 +MIPS_INS_SWC2 = 204 +MIPS_INS_SCD = 205 +MIPS_INS_SDC1 = 206 +MIPS_INS_SDC2 = 207 +MIPS_INS_SD = 208 + +# RSP COP2 +MIPS_INS_VMULF = 209 +MIPS_INS_VMULU = 210 +MIPS_INS_VRNDP = 211 +MIPS_INS_VMULQ = 212 +MIPS_INS_VMUDL = 213 +MIPS_INS_VMUDM = 214 +MIPS_INS_VMUDN = 215 +MIPS_INS_VMUDH = 216 +MIPS_INS_VMACF = 217 +MIPS_INS_VMACU = 218 +MIPS_INS_VRNDN = 219 +MIPS_INS_VMACQ = 220 +MIPS_INS_VMADL = 221 +MIPS_INS_VMADM = 222 +MIPS_INS_VMADN = 223 +MIPS_INS_VMADH = 224 +MIPS_INS_VADD = 225 +MIPS_INS_VSUB = 226 +MIPS_INS_VABS = 227 +MIPS_INS_VADDC = 228 +MIPS_INS_VSUBC = 229 +MIPS_INS_VSAR = 230 +MIPS_INS_VLT = 231 +MIPS_INS_VEQ = 232 +MIPS_INS_VNE = 233 +MIPS_INS_VGE = 234 +MIPS_INS_VCL = 235 +MIPS_INS_VCH = 236 +MIPS_INS_VCR = 237 +MIPS_INS_VMRG = 238 +MIPS_INS_VAND = 239 +MIPS_INS_VNAND = 240 +MIPS_INS_VOR = 241 +MIPS_INS_VNOR = 242 +MIPS_INS_VXOR = 243 +MIPS_INS_VNXOR = 244 +MIPS_INS_VRCP = 245 +MIPS_INS_VRCPL = 246 +MIPS_INS_VRCPH = 247 +MIPS_INS_VMOV = 248 +MIPS_INS_VRSQ = 249 +MIPS_INS_VRSQL = 250 +MIPS_INS_VRSQH = 251 +MIPS_INS_VNOP = 252 +MIPS_INS_LBV = 253 +MIPS_INS_LSV = 254 +MIPS_INS_LLV = 255 +MIPS_INS_LDV = 256 +MIPS_INS_LQV = 257 +MIPS_INS_LRV = 258 +MIPS_INS_LPV = 259 +MIPS_INS_LUV = 260 +MIPS_INS_LHV = 261 +MIPS_INS_LFV = 262 +MIPS_INS_LTV = 263 +MIPS_INS_SBV = 264 +MIPS_INS_SSV = 265 +MIPS_INS_SLV = 266 +MIPS_INS_SDV = 267 +MIPS_INS_SQV = 268 +MIPS_INS_SRV = 269 +MIPS_INS_SPV = 270 +MIPS_INS_SUV = 271 +MIPS_INS_SHV = 272 +MIPS_INS_SFV = 273 +MIPS_INS_SWV = 274 +MIPS_INS_STV = 275 +MIPS_INS_MFC2 = 276 +MIPS_INS_MTC2 = 277 +MIPS_INS_CFC2 = 278 +MIPS_INS_CTC2 = 279 + +# Pseudo-Instruction Unique IDs +MIPS_INS_BEQZ = 280 +MIPS_INS_BNEZ = 281 +MIPS_INS_B = 282 +MIPS_INS_NOP = 283 +MIPS_INS_MOVE = 284 +MIPS_INS_NEGU = 285 +MIPS_INS_NOT = 286 + +# Invalid Instruction Unique ID +MIPS_INS_INVALID = -1 + +# Op IDs +# MIPS_OP_RS = 0 +# MIPS_OP_RT = 0 +# MIPS_OP_RD = 0 +# MIPS_OP_IMM = 0 + +# Instruction Groups + +MIPS_BRANCH_LIKELY_INSNS = [ + MIPS_INS_BEQL, MIPS_INS_BGEZALL, + MIPS_INS_BGEZL, MIPS_INS_BGTZL, + MIPS_INS_BLEZL, MIPS_INS_BLTZALL, + MIPS_INS_BLTZL, MIPS_INS_BNEL, + MIPS_INS_BC1TL, MIPS_INS_BC1FL, +] + +MIPS_BRANCH_INSNS = [ + *MIPS_BRANCH_LIKELY_INSNS, + + MIPS_INS_BEQ, + MIPS_INS_BGEZ, MIPS_INS_BGEZAL, + MIPS_INS_BGTZ, + MIPS_INS_BNE, + MIPS_INS_BLTZ, MIPS_INS_BLTZAL, + MIPS_INS_BLEZ, + MIPS_INS_BC1T, MIPS_INS_BC1F, + + MIPS_INS_BEQZ, + MIPS_INS_BNEZ, + MIPS_INS_B, +] + +MIPS_JUMP_INSNS = [ + MIPS_INS_JAL, MIPS_INS_JALR, MIPS_INS_J, MIPS_INS_JR +] + +MIPS_DELAY_SLOT_INSNS = [ + *MIPS_BRANCH_INSNS, *MIPS_JUMP_INSNS +] + +MIPS_FP_LOAD_INSNS = [ + MIPS_INS_LWC1, MIPS_INS_LDC1 +] + +MIPS_LOAD_INSNS = [ + MIPS_INS_LB, MIPS_INS_LBU, + MIPS_INS_LH, MIPS_INS_LHU, + MIPS_INS_LW, MIPS_INS_LWL, MIPS_INS_LWR, MIPS_INS_LWU, + MIPS_INS_LD, MIPS_INS_LDL, MIPS_INS_LDR, + MIPS_INS_LL, MIPS_INS_LLD, + *MIPS_FP_LOAD_INSNS +] + +MIPS_FP_STORE_INSNS = [ + MIPS_INS_SWC1, MIPS_INS_SDC1 +] + +MIPS_STORE_INSNS = [ + MIPS_INS_SB, + MIPS_INS_SH, + MIPS_INS_SW, MIPS_INS_SWL, MIPS_INS_SWR, + MIPS_INS_SD, MIPS_INS_SDL, MIPS_INS_SDR, + MIPS_INS_SC, MIPS_INS_SCD, + *MIPS_FP_STORE_INSNS +] + +MIPS_LOAD_STORE_INSNS = [ + *MIPS_LOAD_INSNS, + *MIPS_STORE_INSNS, +] + +MIPS_FP_LOAD_STORE_INSNS = [ + *MIPS_FP_LOAD_INSNS, *MIPS_FP_STORE_INSNS +] + +RSP_VECTOR_LOAD_STORES = [ + MIPS_INS_LBV, MIPS_INS_LSV, MIPS_INS_LLV, MIPS_INS_LDV, + MIPS_INS_LQV, MIPS_INS_LRV, MIPS_INS_LPV, MIPS_INS_LUV, + MIPS_INS_LHV, MIPS_INS_LFV, MIPS_INS_LTV, + + MIPS_INS_SBV, MIPS_INS_SSV, MIPS_INS_SLV, MIPS_INS_SDV, + MIPS_INS_SQV, MIPS_INS_SRV, MIPS_INS_SPV, MIPS_INS_SUV, + MIPS_INS_SHV, MIPS_INS_SFV, MIPS_INS_SWV, MIPS_INS_STV, +] + +# Labels + +# These labels can be referenced from pointers/loads/stores/etc. +LABEL_TYPE_FUNC = 0 +LABEL_TYPE_JTBL = 1 +LABEL_TYPE_DATA = 2 +LABEL_TYPE_BRANCH = 3 + +# Unknown +LABEL_TYPE_UNK = 20 + +class MipsLabel: + """ + Label + """ + + def __init__(self, vaddr, name=None, lbl_type=LABEL_TYPE_UNK, is_global=None) -> None: + self.name = name + self.vaddr = vaddr + self.lbl_type = lbl_type + self.is_global = is_global or (False if (lbl_type == LABEL_TYPE_BRANCH) else True) + + def __str__(self): + if self.name is not None: + return self.name + + if self.lbl_type == LABEL_TYPE_FUNC: + return f"func_{self.vaddr:08X}" + elif self.lbl_type == LABEL_TYPE_JTBL: + return f"jtbl_{self.vaddr:08X}" + elif self.lbl_type == LABEL_TYPE_BRANCH: + return f".L{self.vaddr:08X}" + elif (self.lbl_type == LABEL_TYPE_DATA or self.lbl_type == LABEL_TYPE_UNK): + return f"D_{self.vaddr:08X}" + assert False , f"Unimplemented default name for label type {self.lbl_type}" + +# Register Names + +mips_gpr_names = ( + "$zero", + "$at", + "$v0", "$v1", + "$a0", "$a1", "$a2", "$a3", + "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", + "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7", + "$t8", "$t9", + "$k0", "$k1", + "$gp", + "$sp", + "$fp", + "$ra", +) + +rsp_gpr_names = ( + "$zero", + "$1", "$2", "$3", "$4", "$5", "$6", + "$7", "$8", "$9", "$10", "$11", "$12", + "$13", "$14", "$15", "$16", "$17", "$18", + "$19", "$20", "$21", "$22", "$23", "$24", + "$25", "$26", "$27", "$28", "$29", "$30", + "$ra", +) + +mips_cop0_names = ( + "Index" , "Random" , "EntryLo0" , "EntryLo1" , + "Context" , "PageMask" , "Wired" , "Reserved07", + "BadVaddr" , "Count" , "EntryHi" , "Compare" , + "Status" , "Cause" , "EPC" , "PRevID" , + "Config" , "LLAddr" , "WatchLo" , "WatchHi" , + "XContext" , "Reserved21", "Reserved22", "Reserved23", + "Reserved24", "Reserved25", "PErr" , "CacheErr" , + "TagLo" , "TagHi" , "ErrorEPC" , "Reserved31", +) + +rsp_cop0_names = ( + "SP_MEM_ADDR", "SP_DRAM_ADDR", "SP_RD_LEN" , "SP_WR_LEN" , + "SP_STATUS" , "SP_DMA_FULL" , "SP_DMA_BUSY" , "SP_SEMAPHORE", + "DPC_START" , "DPC_END" , "DPC_CURRENT" , "DPC_STATUS" , + "DPC_CLOCK" , "DPC_BUFBUSY" , "DPC_PIPEBUSY", "DPC_TMEM" , +) + +mips_cop1_names = ( + "$f0", "$f1", "$f2", "$f3", + "$f4", "$f5", "$f6", "$f7", "$f8", "$f9", "$f10", "$f11", + "$f12", "$f13", "$f14", "$f15", + "$f16", "$f17", "$f18", "$f19", + "$f20", "$f21", "$f22", "$f23", "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", + # Status register + "FpCsr", +) + +rsp_cop2_names = ( + "$v0", "$v1", "$v2", "$v3", "$v4", "$v5", "$v6", "$v7", + "$v8", "$v9", "$v10", "$v11", "$v12", "$v13", "$v14", "$v15", + "$v16", "$v17", "$v18", "$v19", "$v20", "$v21", "$v22", "$v23", + "$v24", "$v25", "$v26", "$v27", "$v28", "$v29", "$v30", "$v31", +) + +rsp_cop2_ctrl_names = ( + '$vco', '$vcc', '$vce' +) + +# Instruction sets + +class MipsAbi: + def __init__(self, name, gpr_names, cop0_names, cop1_names, cop2_names): + self.name = name + self.gpr_names, self.cop0_names, self.cop1_names, self.cop2_names = \ + gpr_names, cop0_names, cop1_names, cop2_names + +ABI_VR4300 = MipsAbi("VR4300", mips_gpr_names, mips_cop0_names, mips_cop1_names, None ) +ABI_RSP = MipsAbi("RSP", rsp_gpr_names, rsp_cop0_names, None, rsp_cop2_names) + +# Instruction field fetching + +def sign_extend_6(value): + if value & (1 << (6 - 1)): + return value - (1 << 6) + return value + +def sign_extend_16(value): + return (value & 0x7FFF) - (value & 0x8000) + +def mask_shift(v, s, w): + return (v >> s) & ((1 << w) - 1) + +mips_get_field = lambda raw,vaddr : mask_shift(raw, 26, 6) +mips_get_special = lambda raw,vaddr : mask_shift(raw, 0, 6) +mips_get_cop0 = lambda raw,vaddr : mask_shift(raw, 21, 5) +mips_get_cop1 = lambda raw,vaddr : mask_shift(raw, 21, 5) +mips_get_cop2 = lambda raw,vaddr : mask_shift(raw, 21, 4) +mips_get_regimm = lambda raw,vaddr : mask_shift(raw, 16, 5) +mips_get_tlb = lambda raw,vaddr : mask_shift(raw, 0, 5) +mips_get_function = lambda raw,vaddr : mask_shift(raw, 0, 6) + +mips_get_cond = lambda raw,vaddr : mask_shift(raw, 0, 4) +mips_get_fd = lambda raw,vaddr : MipsFPReg(mask_shift(raw, 6, 5)) +mips_get_fs = lambda raw,vaddr : MipsFPReg(mask_shift(raw, 11, 5)) +mips_get_ft = lambda raw,vaddr : MipsFPReg(mask_shift(raw, 16, 5)) +mips_get_fmt = lambda raw,vaddr : mask_shift(raw, 21, 5) +mips_get_ndtf = lambda raw,vaddr : mask_shift(raw, 16, 2) + +mips_get_target = lambda raw,vaddr : ((vaddr & 0xFC000000) | (mask_shift(raw, 0, 26) << 2)) +mips_get_offset = lambda raw,vaddr : vaddr + 4 + sign_extend_16(mask_shift(raw, 0, 16)) * 4 +mips_get_imm = lambda raw,vaddr : mask_shift(raw, 0, 16) + +mips_get_base = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 21, 5)) + +mips_get_cd = lambda raw,vaddr : mask_shift(raw, 11, 5) + +mips_get_code = lambda raw,vaddr : (mask_shift(raw, 6, 20) << 6) >> 16 +mips_get_op = lambda raw,vaddr : mask_shift(raw, 16, 5) + +mips_get_sa = lambda raw,vaddr : mask_shift(raw, 6, 5) + +mips_get_rd = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 11, 5)) +mips_get_rs = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 21, 5)) +mips_get_rt = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 16, 5)) + +rsp_load_store_multiplier = { + 0b00000 : 0x01, # lbv, sbv + 0b00001 : 0x02, # lsv, ssv + 0b00010 : 0x04, # llv, slv + 0b00011 : 0x08, # ldv, sdv + 0b00100 : 0x10, # lqv, sqv + 0b00101 : 0x10, # lrv, srv + 0b00110 : 0x08, # lpv, spv + 0b00111 : 0x08, # luv, suv + + 0b01000 : 0x02, # lhv, shv + 0b01001 : 0x04, # lfv, sfv + 0b01010 : 0x10, # swv + 0b01011 : 0x10, # ltv, stv +} + +mips_get_vc = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_vd = lambda raw,vaddr : mask_shift(raw, 6, 5) +mips_get_vs = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_vt = lambda raw,vaddr : mask_shift(raw, 16, 5) +mips_get_elem = lambda raw,vaddr : mask_shift(raw, 21, 4) +mips_get_elemd = lambda raw,vaddr : mask_shift(raw, 7, 4) +mips_get_cop2_func = lambda raw,vaddr : mask_shift(raw, 25, 1) +mips_get_lwc2 = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_swc2 = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_voffset = lambda raw,vaddr : sign_extend_6(mask_shift(raw, 0, 6)) * rsp_load_store_multiplier[mips_get_lwc2(raw,vaddr)] + +# Formatting + +def resolve_pseudo_insn(insn): + # move varies between assemblers + # IDO + move_insn = MIPS_INS_OR + # GCC + # move_insn = MIPS_INS_ADDU + + if insn.id == MIPS_INS_SLL and insn.rd == MipsGPReg.R0 and insn.rt == MipsGPReg.R0 and insn.sa == 0: + return MIPS_INS_NOP, "nop", (), () + elif insn.id == MIPS_INS_BEQ and insn.rs == MipsGPReg.R0 and insn.rt == MipsGPReg.R0: + return MIPS_INS_B, "b", ("offset",), (False,) + elif insn.id == move_insn and insn.rt == MipsGPReg.R0: + return MIPS_INS_MOVE, "move", ("rd","rs"), (True,False) + elif insn.id == MIPS_INS_BEQ and insn.rt == MipsGPReg.R0: + return MIPS_INS_BEQZ, "beqz", ("rs","offset"), (False,False) + elif insn.id == MIPS_INS_BNE and insn.rt == MipsGPReg.R0: + return MIPS_INS_BNEZ, "bnez", ("rs","offset"), (False,False) + elif insn.id == MIPS_INS_SUBU and insn.rs == MipsGPReg.R0: + return MIPS_INS_NEGU, "negu", ("rd","rt"), (True,False) + elif insn.id == MIPS_INS_NOR and insn.rt == MipsGPReg.R0: + return MIPS_INS_NOT, "not", ("rd","rs"), (True,False) + else: + return insn.id, insn.mnemonic, insn.fields, insn.writes + +def format_hex(v, signed, zeros, no_zero): + if abs(v) < 10: + if v == 0 and no_zero: + return "" + return f"{v}" + elif not signed: + return f"0x{v:{f'0{zeros}' if zeros > 0 else ''}x}" + else: + return f"{v:#x}" + +def format_vector_elem(insn, elem): + if insn.id in RSP_VECTOR_LOAD_STORES: + return f"[{elem}]" + elif (elem & 8) == 8: + return f"[{elem & 7}]" + elif (elem & 0xC) == 4: + return f"[{elem & 3}h]" + elif (elem & 0xE) == 2: + return f"[{elem & 1}q]" + else: + return "" + +mips_field_formatters = { + 'code' : (lambda insn : f'{insn.code}' if insn.code != 0 else ''), + 'cd' : (lambda insn : insn.abi.cop0_names[insn.cd]), + 'rd' : (lambda insn : insn.abi.gpr_names[insn.rd]), + 'rs' : (lambda insn : insn.abi.gpr_names[insn.rs]), + 'rt' : (lambda insn : insn.abi.gpr_names[insn.rt]), + 'fd' : (lambda insn : insn.abi.cop1_names[insn.fd]), + 'fs' : (lambda insn : insn.abi.cop1_names[insn.fs]), + 'ft' : (lambda insn : insn.abi.cop1_names[insn.ft]), + 'sa' : (lambda insn : format_hex(insn.sa, True, 0, False)), + 'op' : (lambda insn : format_hex(insn.op, False, 0, False)), + 'imm' : (lambda insn : format_hex(insn.imm, True, 0, False)), + 'offset(base)' : (lambda insn : f'{format_hex(insn.imm, True, 0, True)}({insn.abi.gpr_names[insn.base]})'), + 'offset' : (lambda insn : f'{format_hex(insn.offset, True, 0, False)}'), + 'target' : (lambda insn : f'{format_hex(insn.target, False, 0, False)}'), + 'vd' : (lambda insn : insn.abi.cop2_names[insn.vd]), + 'vs' : (lambda insn : insn.abi.cop2_names[insn.vs]), + 'vt' : (lambda insn : insn.abi.cop2_names[insn.vt]), + 'vt[e]' : (lambda insn : f"{insn.abi.cop2_names[insn.vt]}{format_vector_elem(insn, insn.elem)}"), + 'vt[ed]' : (lambda insn : f"{insn.abi.cop2_names[insn.vt]}{format_vector_elem(insn, insn.elemd)}"), + 'vd[e]' : (lambda insn : f"{insn.abi.cop2_names[insn.vd]}{format_vector_elem(insn, insn.elem)}"), + 'vd[ed]' : (lambda insn : f"{insn.abi.cop2_names[insn.vd]}{format_vector_elem(insn, insn.elemd)}"), + 'voffset' : (lambda insn : f'{format_hex(insn.voffset, True, 0, False)}'), + 'voffset(base)' : (lambda insn : f'{format_hex(insn.voffset, True, 0, True)}({insn.abi.gpr_names[insn.base]})'), + 'vc' : (lambda insn : rsp_cop2_ctrl_names[insn.vc]) +} + +class MipsInsn: + + def __init__(self, abi, raw, vaddr, values): + self.abi = abi + self.raw = raw + self.vaddr = vaddr + + if values is None: + values = MIPS_INS_INVALID, f"/* Invalid Instruction */ .4byte 0x{raw:08X}", (), () + + self.id, self.mnemonic, self.fields, self.writes = values + + # self.code = self.sa = self.op = self.cd = self.rd = self.rs = self.rt = self.fd = self.fs = self.ft = self.imm = self.offset = self.base = self.target = None + + for field in self.fields: + self.set_value(field) + + self.id, self.mnemonic, self.fields, self.writes = resolve_pseudo_insn(self) + + self.op_str = self.format_insn() + + def read_fields(self): + return [field for i,field in enumerate(self.fields) if self.writes[i] == False] + + def write_fields(self): + return [field for i,field in enumerate(self.fields) if self.writes[i] == True] + + def has_field(self, field): + return field in self.fields + + def format_field(self, field): + return mips_field_formatters[field](self) + + def format_insn(self): + return ", ".join([self.format_field(field) for field in self.fields]) + + def __str__(self): + return f"{self.mnemonic:12}{self.op_str}" + + # Field setters + + def set_code(self): + self.code = mips_get_code(self.raw, self.vaddr) + + def set_sa(self): + self.sa = mips_get_sa(self.raw, self.vaddr) + + def set_op(self): + self.op = mips_get_op(self.raw, self.vaddr) + + def set_cd(self): + self.cd = mips_get_cd(self.raw, self.vaddr) + + def set_rd(self): + self.rd = mips_get_rd(self.raw, self.vaddr) + + def set_rs(self): + self.rs = mips_get_rs(self.raw, self.vaddr) + + def set_rt(self): + self.rt = mips_get_rt(self.raw, self.vaddr) + + def set_fd(self): + self.fd = mips_get_fd(self.raw, self.vaddr) + + def set_fs(self): + self.fs = mips_get_fs(self.raw, self.vaddr) + + def set_ft(self): + self.ft = mips_get_ft(self.raw, self.vaddr) + + do_sign_extend = [ + MIPS_INS_ADDIU, MIPS_INS_SLTI, MIPS_INS_ADDI, MIPS_INS_DADDIU, + MIPS_INS_LB, MIPS_INS_LBU, + MIPS_INS_LH, MIPS_INS_LHU, + MIPS_INS_LW, MIPS_INS_LWL, MIPS_INS_LWR, MIPS_INS_LWU, + MIPS_INS_LWC1, + MIPS_INS_LD, MIPS_INS_LDL, MIPS_INS_LDR, + MIPS_INS_LDC1, + MIPS_INS_LL, MIPS_INS_LLD, + MIPS_INS_SB, + MIPS_INS_SH, + MIPS_INS_SW, MIPS_INS_SWL, MIPS_INS_SWR, + MIPS_INS_SWC1, + MIPS_INS_SD, MIPS_INS_SDL, MIPS_INS_SDR, + MIPS_INS_SDC1, + MIPS_INS_SC, MIPS_INS_SCD, + ] + + def set_imm(self): + self.imm = mips_get_imm(self.raw, self.vaddr) + if self.id in MipsInsn.do_sign_extend: # sign extended immediates + self.imm = sign_extend_16(self.imm) + + def set_offset(self): + self.offset = mips_get_offset(self.raw, self.vaddr) + + def set_base(self): + self.base = mips_get_base(self.raw, self.vaddr) + + def set_offset_base(self): + self.set_imm() + self.set_base() + + def set_target(self): + self.target = mips_get_target(self.raw, self.vaddr) + + def set_vd(self): + self.vd = mips_get_vd(self.raw, self.vaddr) + + def set_vs(self): + self.vs = mips_get_vs(self.raw, self.vaddr) + + def set_vt(self): + self.vt = mips_get_vt(self.raw, self.vaddr) + + def set_e(self): + self.elem = mips_get_elem(self.raw, self.vaddr) + + def set_ed(self): + self.elemd = mips_get_elemd(self.raw, self.vaddr) + + def set_vd_e(self): + self.set_vd() + self.set_e() + + def set_vt_ed(self): + self.set_vt() + self.set_ed() + + def set_vt_e(self): + self.set_vt() + self.set_e() + + def set_vd_ed(self): + self.set_vd() + self.set_ed() + + def set_voffset(self): + self.voffset = mips_get_voffset(self.raw, self.vaddr) + + def set_voffset_base(self): + self.set_voffset() + self.set_base() + + def set_vc(self): + self.vc = mips_get_vc(self.raw, self.vaddr) + + field_setters = { + 'code' : set_code, + 'sa' : set_sa, + 'op' : set_op, + 'cd' : set_cd, + 'rd' : set_rd, + 'rs' : set_rs, + 'rt' : set_rt, + 'fd' : set_fd, + 'fs' : set_fs, + 'ft' : set_ft, + 'imm' : set_imm, + 'offset' : set_offset, + 'base' : set_base, + 'offset(base)' : set_offset_base, + 'target' : set_target, + 'vd' : set_vd, + 'vs' : set_vs, + 'vt' : set_vt, + 'vt[e]' : set_vt_e, + 'vt[ed]' : set_vt_ed, + 'vd[e]' : set_vd_e, + 'vd[ed]' : set_vd_ed, + 'voffset' : set_voffset, + 'voffset(base)' : set_voffset_base, + 'vc' : set_vc + } + + def set_value(self, name): + MipsInsn.field_setters[name](self) + + # Field getters + + field_getters = { + 'code' : (lambda insn: insn.code), + 'sa' : (lambda insn: insn.sa), + 'op' : (lambda insn: insn.op), + 'cd' : (lambda insn: insn.cd), + 'rd' : (lambda insn: insn.rd), + 'rs' : (lambda insn: insn.rs), + 'rt' : (lambda insn: insn.rt), + 'fd' : (lambda insn: insn.fd), + 'fs' : (lambda insn: insn.fs), + 'ft' : (lambda insn: insn.ft), + 'imm' : (lambda insn: insn.imm), + 'offset' : (lambda insn: insn.offset), + 'base' : (lambda insn: insn.base), + 'offset(base)' : (lambda insn: (insn.offset, insn.base)), + 'target' : (lambda insn: insn.target), + 'vd' : (lambda insn: insn.vd), + 'vs' : (lambda insn: insn.vs), + 'vt' : (lambda insn: insn.vt), + 'vt[e]' : (lambda insn: (insn.vt, insn.elem)), + 'vt[ed]' : (lambda insn: (insn.vt, insn.elemd)), + 'vd[e]' : (lambda insn: (insn.vd, insn.elem)), + 'vd[ed]' : (lambda insn: (insn.vd, insn.elemd)), + 'voffset' : (lambda insn: insn.voffset), + 'voffset(base)' : (lambda insn: (insn.voffset, insn.base)), + 'vc' : (lambda insn: insn.vc), + } + + def value_forname(self, name): + return MipsInsn.field_getters[name](self) + +def fetch_insn(raw, vaddr, insn_set, func): + insn = insn_set.get(func(raw, vaddr), None) # default none for invalid instruction encoding + + if insn is not None and type(insn[1]) == dict: # extra decoding required + insn = fetch_insn(raw, vaddr, insn[1], insn[0]) + return insn + +def decode_insn(raw, vaddr): + return MipsInsn(ABI_VR4300, raw, vaddr, fetch_insn(raw, vaddr, mips_insns, mips_get_field)) + +def decode_rsp_insn(raw, vaddr): + return MipsInsn(ABI_RSP, raw, vaddr, fetch_insn(raw, vaddr, rsp_insns, mips_get_field)) + +mips_insns = { + 0b000000: (mips_get_special, { + # opcode id mnemonic fields field is written to + 0b000000: (MIPS_INS_SLL, "sll", ("rd","rt","sa"), (True , False, False)), + 0b000010: (MIPS_INS_SRL, "srl", ("rd","rt","sa"), (True , False, False)), + 0b000011: (MIPS_INS_SRA, "sra", ("rd","rt","sa"), (True , False, False)), + 0b000100: (MIPS_INS_SLLV, "sllv", ("rd","rt","rs"), (True , False, False)), + 0b000110: (MIPS_INS_SRLV, "srlv", ("rd","rt","rs"), (True , False, False)), + 0b000111: (MIPS_INS_SRAV, "srav", ("rd","rt","rs"), (True , False, False)), + 0b001000: (MIPS_INS_JR, "jr", ("rs", ), (False, )), + 0b001001: (MIPS_INS_JALR, "jalr", ("rs", ), (False, )), # technically also rd but it's always $ra + 0b001100: (MIPS_INS_SYSCALL, "syscall", ( ), ( )), + 0b001101: (MIPS_INS_BREAK, "break", ("code", ), (False, )), + 0b001111: (MIPS_INS_SYNC, "sync", ( ), ( )), + 0b010000: (MIPS_INS_MFHI, "mfhi", ("rd", ), (True , )), + 0b010001: (MIPS_INS_MTHI, "mthi", ("rs", ), (False, )), + 0b010010: (MIPS_INS_MFLO, "mflo", ("rd", ), (True , )), + 0b010011: (MIPS_INS_MTLO, "mtlo", ("rs", ), (False, )), + 0b010100: (MIPS_INS_DSLLV, "dsllv", ("rd","rt","rs"), (True , False, False)), + 0b010110: (MIPS_INS_DSRLV, "dsrlv", ("rd","rt","rs"), (True , False, False)), + 0b010111: (MIPS_INS_DSRAV, "dsrav", ("rd","rt","rs"), (True , False, False)), + 0b011000: (MIPS_INS_MULT, "mult", ("rs","rt" ), (False, False )), + 0b011001: (MIPS_INS_MULTU, "multu", ("rs","rt" ), (False, False )), + 0b011010: (MIPS_INS_DIV, "div", ("rd","rs","rt"), (False, False, False)), # for some reason gas hates div instructions + 0b011011: (MIPS_INS_DIVU, "divu", ("rd","rs","rt"), (False, False, False)), # with the correct number of operands + 0b011100: (MIPS_INS_DMULT, "dmult", ("rs","rt" ), (False, False )), + 0b011101: (MIPS_INS_DMULTU, "dmultu", ("rs","rt" ), (False, False )), + 0b011110: (MIPS_INS_DDIV, "ddiv", ("rd","rs","rt"), (False, False, False)), + 0b011111: (MIPS_INS_DDIVU, "ddivu", ("rd","rs","rt"), (False, False, False)), + 0b100000: (MIPS_INS_ADD, "add", ("rd","rs","rt"), (True , False, False)), + 0b100001: (MIPS_INS_ADDU, "addu", ("rd","rs","rt"), (True , False, False)), + 0b100010: (MIPS_INS_SUB, "sub", ("rd","rs","rt"), (True , False, False)), + 0b100011: (MIPS_INS_SUBU, "subu", ("rd","rs","rt"), (True , False, False)), + 0b100100: (MIPS_INS_AND, "and", ("rd","rs","rt"), (True , False, False)), + 0b100101: (MIPS_INS_OR, "or", ("rd","rs","rt"), (True , False, False)), + 0b100110: (MIPS_INS_XOR, "xor", ("rd","rs","rt"), (True , False, False)), + 0b100111: (MIPS_INS_NOR, "nor", ("rd","rs","rt"), (True , False, False)), + 0b101010: (MIPS_INS_SLT, "slt", ("rd","rs","rt"), (True , False, False)), + 0b101011: (MIPS_INS_SLTU, "sltu", ("rd","rs","rt"), (True , False, False)), + 0b101100: (MIPS_INS_DADD, "dadd", ("rd","rs","rt"), (True , False, False)), + 0b101101: (MIPS_INS_DADDU, "daddu", ("rd","rs","rt"), (True , False, False)), + 0b101110: (MIPS_INS_DSUB, "dsub", ("rd","rs","rt"), (True , False, False)), + 0b101111: (MIPS_INS_DSUBU, "dsubu", ("rd","rs","rt"), (True , False, False)), + 0b110000: (MIPS_INS_TGE, "tge", ("rs","rt" ), (False, False )), + 0b110001: (MIPS_INS_TGEU, "tgeu", ("rs","rt" ), (False, False )), + 0b110010: (MIPS_INS_TLT, "tlt", ("rs","rt" ), (False, False )), + 0b110011: (MIPS_INS_TLTU, "tltu", ("rs","rt" ), (False, False )), + 0b110100: (MIPS_INS_TEQ, "teq", ("rs","rt" ), (False, False )), + 0b110110: (MIPS_INS_TNE, "tne", ("rs","rt" ), (False, False )), + 0b111000: (MIPS_INS_DSLL, "dsll", ("rd","rt","sa"), (True , False, False)), + 0b111010: (MIPS_INS_DSRL, "dsrl", ("rd","rt","sa"), (True , False, False)), + 0b111011: (MIPS_INS_DSRA, "dsra", ("rd","rt","sa"), (True , False, False)), + 0b111100: (MIPS_INS_DSLL32, "dsll32", ("rd","rt","sa"), (True , False, False)), + 0b111110: (MIPS_INS_DSRL32, "dsrl32", ("rd","rt","sa"), (True , False, False)), + 0b111111: (MIPS_INS_DSRA32, "dsra32", ("rd","rt","sa"), (True , False, False)), + }), + 0b000001: (mips_get_regimm, { + 0b00000: (MIPS_INS_BLTZ, "bltz", ("rs","offset"), (False, False)), + 0b00001: (MIPS_INS_BGEZ, "bgez", ("rs","offset"), (False, False)), + 0b00010: (MIPS_INS_BLTZL, "bltzl", ("rs","offset"), (False, False)), + 0b00011: (MIPS_INS_BGEZL, "bgezl", ("rs","offset"), (False, False)), + 0b01000: (MIPS_INS_TGEI, "tgei", ("rs","imm" ), (False, False)), + 0b01001: (MIPS_INS_TGEIU, "tgeiu", ("rs","imm" ), (False, False)), + 0b01010: (MIPS_INS_TLTI, "tlti", ("rs","imm" ), (False, False)), + 0b01011: (MIPS_INS_TLTIU, "tltiu", ("rs","imm" ), (False, False)), + 0b01100: (MIPS_INS_TEQI, "teqi", ("rs","imm" ), (False, False)), + 0b01110: (MIPS_INS_TNEI, "tnei", ("rs","imm" ), (False, False)), + 0b10000: (MIPS_INS_BLTZAL, "bltzal", ("rs","offset"), (False, False)), + 0b10001: (MIPS_INS_BGEZAL, "bgezal", ("rs","offset"), (False, False)), + 0b10010: (MIPS_INS_BLTZALL, "bltzall", ("rs","offset"), (False, False)), + 0b10011: (MIPS_INS_BGEZALL, "bgezall", ("rs","offset"), (False, False)), + }), + 0b000010: (MIPS_INS_J, "j", ("target", ), (False, )), + 0b000011: (MIPS_INS_JAL, "jal", ("target", ), (False, )), + 0b000100: (MIPS_INS_BEQ, "beq", ("rs","rt","offset"), (False, False, False)), + 0b000101: (MIPS_INS_BNE, "bne", ("rs","rt","offset"), (False, False, False)), + 0b000110: (MIPS_INS_BLEZ, "blez", ("rs","offset" ), (False, False, )), + 0b000111: (MIPS_INS_BGTZ, "bgtz", ("rs","offset" ), (False, False, )), + 0b001000: (MIPS_INS_ADDI, "addi", ("rt","rs","imm" ), (True , False, False)), + 0b001001: (MIPS_INS_ADDIU, "addiu", ("rt","rs","imm" ), (True , False, False)), + 0b001010: (MIPS_INS_SLTI, "slti", ("rt","rs","imm" ), (True , False, False)), + 0b001011: (MIPS_INS_SLTIU, "sltiu", ("rt","rs","imm" ), (True , False, False)), + 0b001100: (MIPS_INS_ANDI, "andi", ("rt","rs","imm" ), (True , False, False)), + 0b001101: (MIPS_INS_ORI, "ori", ("rt","rs","imm" ), (True , False, False)), + 0b001110: (MIPS_INS_XORI, "xori", ("rt","rs","imm" ), (True , False, False)), + 0b001111: (MIPS_INS_LUI, "lui", ("rt","imm" ), (True , False )), + 0b010000: (mips_get_cop0, { + 0b00000: (MIPS_INS_MFC0, "mfc0", ("rt","cd"), (True , False)), + 0b00100: (MIPS_INS_MTC0, "mtc0", ("rt","cd"), (False, True )), + 0b10000: (mips_get_tlb, { + 0b000001: (MIPS_INS_TLBR, "tlbr", (), ()), + 0b000010: (MIPS_INS_TLBWI, "tlbwi", (), ()), + 0b000110: (MIPS_INS_TLBWR, "tlbwr", (), ()), + 0b001000: (MIPS_INS_TLBP, "tlbp", (), ()), + 0b011000: (MIPS_INS_ERET, "eret", (), ()), + }), + }), + 0b010001: (mips_get_cop1, { + 0b00000: (MIPS_INS_MFC1, "mfc1", ("rt","fs"), (True , False)), + 0b00001: (MIPS_INS_DMFC1, "dmfc1", ("rt","fs"), (True , False)), + 0b00010: (MIPS_INS_CFC1, "cfc1", ("rt","fs"), (True , False)), + 0b00100: (MIPS_INS_MTC1, "mtc1", ("rt","fs"), (False, True )), + 0b00101: (MIPS_INS_DMTC1, "dmtc1", ("rt","fs"), (False, True )), + 0b00110: (MIPS_INS_CTC1, "ctc1", ("rt","fs"), (False, True )), + 0b01000: (mips_get_ndtf, { + 0b00: (MIPS_INS_BC1F, "bc1f", ("offset",), (False,)), + 0b01: (MIPS_INS_BC1T, "bc1t", ("offset",), (False,)), + 0b10: (MIPS_INS_BC1FL, "bc1fl", ("offset",), (False,)), + 0b11: (MIPS_INS_BC1TL, "bc1tl", ("offset",), (False,)), + }), + 0b010000: (mips_get_function, { + 0b000000: (MIPS_INS_ADD_S, "add.s", ("fd","fs","ft"), (True , False, False)), + 0b000001: (MIPS_INS_SUB_S, "sub.s", ("fd","fs","ft"), (True , False, False)), + 0b000010: (MIPS_INS_MUL_S, "mul.s", ("fd","fs","ft"), (True , False, False)), + 0b000011: (MIPS_INS_DIV_S, "div.s", ("fd","fs","ft"), (True , False, False)), + 0b000100: (MIPS_INS_SQRT_S, "sqrt.s", ("fd","fs" ), (True , False )), + 0b000101: (MIPS_INS_ABS_S, "abs.s", ("fd","fs" ), (True , False )), + 0b000110: (MIPS_INS_MOV_S, "mov.s", ("fd","fs" ), (True , False )), + 0b000111: (MIPS_INS_NEG_S, "neg.s", ("fd","fs" ), (True , False )), + 0b001000: (MIPS_INS_ROUND_L_S, "round.l.s", ("fd","fs" ), (True , False )), + 0b001001: (MIPS_INS_TRUNC_L_S, "trunc.l.s", ("fd","fs" ), (True , False )), + 0b001010: (MIPS_INS_CEIL_L_S, "ceil.l.s", ("fd","fs" ), (True , False )), + 0b001011: (MIPS_INS_FLOOR_L_S, "floor.l.s", ("fd","fs" ), (True , False )), + 0b001100: (MIPS_INS_ROUND_W_S, "round.w.s", ("fd","fs" ), (True , False )), + 0b001101: (MIPS_INS_TRUNC_W_S, "trunc.w.s", ("fd","fs" ), (True , False )), + 0b001110: (MIPS_INS_CEIL_W_S, "ceil.w.s", ("fd","fs" ), (True , False )), + 0b001111: (MIPS_INS_FLOOR_W_S, "floor.w.s", ("fd","fs" ), (True , False )), + 0b100001: (MIPS_INS_CVT_D_S, "cvt.d.s", ("fd","fs" ), (True , False )), + 0b100100: (MIPS_INS_CVT_W_S, "cvt.w.s", ("fd","fs" ), (True , False )), + 0b100101: (MIPS_INS_CVT_L_S, "cvt.l.s", ("fd","fs" ), (True , False )), + 0b110000: (MIPS_INS_C_F_S, "c.f.s", ("fs","ft" ), (False, False )), + 0b110001: (MIPS_INS_C_UN_S, "c.un.s", ("fs","ft" ), (False, False )), + 0b110010: (MIPS_INS_C_EQ_S, "c.eq.s", ("fs","ft" ), (False, False )), + 0b110011: (MIPS_INS_C_UEQ_S, "c.ueq.s", ("fs","ft" ), (False, False )), + 0b110100: (MIPS_INS_C_OLT_S, "c.olt.s", ("fs","ft" ), (False, False )), + 0b110101: (MIPS_INS_C_ULT_S, "c.ult.s", ("fs","ft" ), (False, False )), + 0b110110: (MIPS_INS_C_OLE_S, "c.ole.s", ("fs","ft" ), (False, False )), + 0b110111: (MIPS_INS_C_ULE_S, "c.ule.s", ("fs","ft" ), (False, False )), + 0b111000: (MIPS_INS_C_SF_S, "c.sf.s", ("fs","ft" ), (False, False )), + 0b111001: (MIPS_INS_C_NGLE_S, "c.ngle.s", ("fs","ft" ), (False, False )), + 0b111010: (MIPS_INS_C_SEQ_S, "c.seq.s", ("fs","ft" ), (False, False )), + 0b111011: (MIPS_INS_C_NGL_S, "c.ngl.s", ("fs","ft" ), (False, False )), + 0b111100: (MIPS_INS_C_LT_S, "c.lt.s", ("fs","ft" ), (False, False )), + 0b111101: (MIPS_INS_C_NGE_S, "c.nge.s", ("fs","ft" ), (False, False )), + 0b111110: (MIPS_INS_C_LE_S, "c.le.s", ("fs","ft" ), (False, False )), + 0b111111: (MIPS_INS_C_NGT_S, "c.ngt.s", ("fs","ft" ), (False, False )), + }), + 0b010001: (mips_get_function, { + 0b000000: (MIPS_INS_ADD_D, "add.d", ("fd","fs","ft"), (True , False, False)), + 0b000001: (MIPS_INS_SUB_D, "sub.d", ("fd","fs","ft"), (True , False, False)), + 0b000010: (MIPS_INS_MUL_D, "mul.d", ("fd","fs","ft"), (True , False, False)), + 0b000011: (MIPS_INS_DIV_D, "div.d", ("fd","fs","ft"), (True , False, False)), + 0b000100: (MIPS_INS_SQRT_D, "sqrt.d", ("fd","fs" ), (True , False )), + 0b000101: (MIPS_INS_ABS_D, "abs.d", ("fd","fs" ), (True , False )), + 0b000110: (MIPS_INS_MOV_D, "mov.d", ("fd","fs" ), (True , False )), + 0b000111: (MIPS_INS_NEG_D, "neg.d", ("fd","fs" ), (True , False )), + 0b001000: (MIPS_INS_ROUND_L_D, "round.l.d", ("fd","fs" ), (True , False )), + 0b001001: (MIPS_INS_TRUNC_L_D, "trunc.l.d", ("fd","fs" ), (True , False )), + 0b001010: (MIPS_INS_CEIL_L_D, "ceil.l.d", ("fd","fs" ), (True , False )), + 0b001011: (MIPS_INS_FLOOR_L_D, "floor.l.d", ("fd","fs" ), (True , False )), + 0b001100: (MIPS_INS_ROUND_W_D, "round.w.d", ("fd","fs" ), (True , False )), + 0b001101: (MIPS_INS_TRUNC_W_D, "trunc.w.d", ("fd","fs" ), (True , False )), + 0b001110: (MIPS_INS_CEIL_W_D, "ceil.w.d", ("fd","fs" ), (True , False )), + 0b001111: (MIPS_INS_FLOOR_W_D, "floor.w.d", ("fd","fs" ), (True , False )), + 0b100000: (MIPS_INS_CVT_S_D, "cvt.s.d", ("fd","fs" ), (True , False )), + 0b100100: (MIPS_INS_CVT_W_D, "cvt.w.d", ("fd","fs" ), (True , False )), + 0b100101: (MIPS_INS_CVT_L_D, "cvt.l.d", ("fd","fs" ), (True , False )), + 0b110000: (MIPS_INS_C_F_D, "c.f.d", ("fs","ft" ), (False, False )), + 0b110001: (MIPS_INS_C_UN_D, "c.un.d", ("fs","ft" ), (False, False )), + 0b110010: (MIPS_INS_C_EQ_D, "c.eq.d", ("fs","ft" ), (False, False )), + 0b110011: (MIPS_INS_C_UEQ_D, "c.ueq.d", ("fs","ft" ), (False, False )), + 0b110100: (MIPS_INS_C_OLT_D, "c.olt.d", ("fs","ft" ), (False, False )), + 0b110101: (MIPS_INS_C_ULT_D, "c.ult.d", ("fs","ft" ), (False, False )), + 0b110110: (MIPS_INS_C_OLE_D, "c.ole.d", ("fs","ft" ), (False, False )), + 0b110111: (MIPS_INS_C_ULE_D, "c.ule.d", ("fs","ft" ), (False, False )), + 0b111000: (MIPS_INS_C_SF_D, "c.sf.d", ("fs","ft" ), (False, False )), + 0b111001: (MIPS_INS_C_NGLE_D, "c.ngle.d", ("fs","ft" ), (False, False )), + 0b111010: (MIPS_INS_C_SEQ_D, "c.seq.d", ("fs","ft" ), (False, False )), + 0b111011: (MIPS_INS_C_NGL_D, "c.ngl.d", ("fs","ft" ), (False, False )), + 0b111100: (MIPS_INS_C_LT_D, "c.lt.d", ("fs","ft" ), (False, False )), + 0b111101: (MIPS_INS_C_NGE_D, "c.nge.d", ("fs","ft" ), (False, False )), + 0b111110: (MIPS_INS_C_LE_D, "c.le.d", ("fs","ft" ), (False, False )), + 0b111111: (MIPS_INS_C_NGT_D, "c.ngt.d", ("fs","ft" ), (False, False )), + }), + 0b010100: (mips_get_function, { + 0b100000: (MIPS_INS_CVT_S_W, "cvt.s.w", ("fd","fs"), (True , False)), + 0b100001: (MIPS_INS_CVT_D_W, "cvt.d.w", ("fd","fs"), (True , False)), + }), + 0b010101: (mips_get_function, { + 0b100000: (MIPS_INS_CVT_S_L, "cvt.s.l", ("fd","fs"), (True , False)), + 0b100001: (MIPS_INS_CVT_D_L, "cvt.d.l", ("fd","fs"), (True , False)), + }), + }), + 0b010100: (MIPS_INS_BEQL, "beql", ("rs","rt","offset" ), (False, False, False)), + 0b010101: (MIPS_INS_BNEL, "bnel", ("rs","rt","offset" ), (False, False, False)), + 0b010110: (MIPS_INS_BLEZL, "blezl", ("rs","offset" ), (False, False )), + 0b010111: (MIPS_INS_BGTZL, "bgtzl", ("rs","offset" ), (False, False )), + 0b011000: (MIPS_INS_DADDI, "daddi", ("rt","rs","imm" ), (True , False, False)), + 0b011001: (MIPS_INS_DADDIU, "daddiu", ("rt","rs","imm" ), (True , False, False)), + 0b011010: (MIPS_INS_LDL, "ldl", ("rt","offset(base)"), (True , False )), + 0b011011: (MIPS_INS_LDR, "ldr", ("rt","offset(base)"), (True , False )), + 0b100000: (MIPS_INS_LB, "lb", ("rt","offset(base)"), (True , False )), + 0b100001: (MIPS_INS_LH, "lh", ("rt","offset(base)"), (True , False )), + 0b100010: (MIPS_INS_LWL, "lwl", ("rt","offset(base)"), (True , False )), + 0b100011: (MIPS_INS_LW, "lw", ("rt","offset(base)"), (True , False )), + 0b100100: (MIPS_INS_LBU, "lbu", ("rt","offset(base)"), (True , False )), + 0b100101: (MIPS_INS_LHU, "lhu", ("rt","offset(base)"), (True , False )), + 0b100110: (MIPS_INS_LWR, "lwr", ("rt","offset(base)"), (True , False )), + 0b100111: (MIPS_INS_LWU, "lwu", ("rt","offset(base)"), (True , False )), + 0b101000: (MIPS_INS_SB, "sb", ("rt","offset(base)"), (False, False )), + 0b101001: (MIPS_INS_SH, "sh", ("rt","offset(base)"), (False, False )), + 0b101010: (MIPS_INS_SWL, "swl", ("rt","offset(base)"), (False, False )), + 0b101011: (MIPS_INS_SW, "sw", ("rt","offset(base)"), (False, False )), + 0b101100: (MIPS_INS_SDL, "sdl", ("rt","offset(base)"), (False, False )), + 0b101101: (MIPS_INS_SDR, "sdr", ("rt","offset(base)"), (False, False )), + 0b101110: (MIPS_INS_SWR, "swr", ("rt","offset(base)"), (False, False )), + 0b101111: (MIPS_INS_CACHE, "cache", ("op","offset(base)"), (False, False, False)), + 0b110000: (MIPS_INS_LL, "ll", ("rt","offset(base)"), (True , False )), + 0b110001: (MIPS_INS_LWC1, "lwc1", ("ft","offset(base)"), (True , False )), + # lwc2 + 0b110100: (MIPS_INS_LLD, "lld", ("rt","offset(base)"), (True , False )), + 0b110101: (MIPS_INS_LDC1, "ldc1", ("ft","offset(base)"), (True , False )), + # ldc2 + 0b110111: (MIPS_INS_LD, "ld", ("rt","offset(base)"), (True , False )), + 0b111000: (MIPS_INS_SC, "sc", ("rt","offset(base)"), (False, False )), + 0b111001: (MIPS_INS_SWC1, "swc1", ("ft","offset(base)"), (False, False )), + # lwc2 + 0b111100: (MIPS_INS_SCD, "scd", ("rt","offset(base)"), (False, False )), + 0b111101: (MIPS_INS_SDC1, "sdc1", ("ft","offset(base)"), (False, False )), + # sdc2 + 0b111111: (MIPS_INS_SD, "sd", ("rt","offset(base)"), (False, False )), +} + +rsp_insns = { + 0b000000: (mips_get_special, { + # opcode id mnemonic fields field is written to + 0b000000: (MIPS_INS_SLL, "sll", ("rd","rt","sa"), (True , False, False)), + 0b000010: (MIPS_INS_SRL, "srl", ("rd","rt","sa"), (True , False, False)), + 0b000011: (MIPS_INS_SRA, "sra", ("rd","rt","sa"), (True , False, False)), + 0b000100: (MIPS_INS_SLLV, "sllv", ("rd","rt","rs"), (True , False, False)), + 0b000110: (MIPS_INS_SRLV, "srlv", ("rd","rt","rs"), (True , False, False)), + 0b000111: (MIPS_INS_SRAV, "srav", ("rd","rt","rs"), (True , False, False)), + 0b001000: (MIPS_INS_JR, "jr", ("rs", ), (False, )), + 0b001001: (MIPS_INS_JALR, "jalr", ("rs", ), (False, )), # technically also rd but it's always $ra + 0b001101: (MIPS_INS_BREAK, "break", ("code", ), (False, )), + 0b100000: (MIPS_INS_ADD, "add", ("rd","rs","rt"), (True , False, False)), + 0b100001: (MIPS_INS_ADDU, "addu", ("rd","rs","rt"), (True , False, False)), + 0b100010: (MIPS_INS_SUB, "sub", ("rd","rs","rt"), (True , False, False)), + 0b100011: (MIPS_INS_SUBU, "subu", ("rd","rs","rt"), (True , False, False)), + 0b100100: (MIPS_INS_AND, "and", ("rd","rs","rt"), (True , False, False)), + 0b100101: (MIPS_INS_OR, "or", ("rd","rs","rt"), (True , False, False)), + 0b100110: (MIPS_INS_XOR, "xor", ("rd","rs","rt"), (True , False, False)), + 0b100111: (MIPS_INS_NOR, "nor", ("rd","rs","rt"), (True , False, False)), + 0b101010: (MIPS_INS_SLT, "slt", ("rd","rs","rt"), (True , False, False)), + 0b101011: (MIPS_INS_SLTU, "sltu", ("rd","rs","rt"), (True , False, False)), + }), + 0b000001: (mips_get_regimm, { + 0b00000: (MIPS_INS_BLTZ, "bltz", ("rs","offset"), (False, False)), + 0b00001: (MIPS_INS_BGEZ, "bgez", ("rs","offset"), (False, False)), + 0b10000: (MIPS_INS_BLTZAL, "bltzal", ("rs","offset"), (False, False)), + 0b10001: (MIPS_INS_BGEZAL, "bgezal", ("rs","offset"), (False, False)), + }), + 0b000010: (MIPS_INS_J, "j", ("target", ), (False, )), + 0b000011: (MIPS_INS_JAL, "jal", ("target", ), (False, )), + 0b000100: (MIPS_INS_BEQ, "beq", ("rs","rt","offset"), (False, False, False)), + 0b000101: (MIPS_INS_BNE, "bne", ("rs","rt","offset"), (False, False, False)), + 0b000110: (MIPS_INS_BLEZ, "blez", ("rs","offset" ), (False, False )), + 0b000111: (MIPS_INS_BGTZ, "bgtz", ("rs","offset" ), (False, False )), + 0b001000: (MIPS_INS_ADDI, "addi", ("rt","rs","imm" ), (True , False, False)), + 0b001001: (MIPS_INS_ADDIU, "addiu", ("rt","rs","imm" ), (True , False, False)), + 0b001010: (MIPS_INS_SLTI, "slti", ("rt","rs","imm" ), (True , False, False)), + 0b001011: (MIPS_INS_SLTIU, "sltiu", ("rt","rs","imm" ), (True , False, False)), + 0b001100: (MIPS_INS_ANDI, "andi", ("rt","rs","imm" ), (True , False, False)), + 0b001101: (MIPS_INS_ORI, "ori", ("rt","rs","imm" ), (True , False, False)), + 0b001110: (MIPS_INS_XORI, "xori", ("rt","rs","imm" ), (True , False, False)), + 0b001111: (MIPS_INS_LUI, "lui", ("rt","imm" ), (True , False )), + 0b010000: (mips_get_cop0, { + 0b00000: (MIPS_INS_MFC0, "mfc0", ("rt","cd"), (True , False)), + 0b00100: (MIPS_INS_MTC0, "mtc0", ("rt","cd"), (False, True )), + }), + 0b010010: (mips_get_cop2_func, { # TODO this encoding got ugly, move to a mask matcher like gnu objdump + 0b0: (mips_get_cop2, { + 0b0000: (MIPS_INS_MFC2, "mfc2", ("rt", "vd[e]"), (True , False)), + 0b0100: (MIPS_INS_MTC2, "mtc2", ("rt", "vd[e]"), (False, True )), + 0b0010: (MIPS_INS_CFC2, "cfc2", ("rt", "vc" ), (True , False)), + 0b0110: (MIPS_INS_CTC2, "ctc2", ("rt", "vc" ), (False, True )), + }), + 0b1: (mips_get_function, { + 0b000000: (MIPS_INS_VMULF, "vmulf", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000001: (MIPS_INS_VMULU, "vmulu", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000010: (MIPS_INS_VRNDP, "vrndp", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000011: (MIPS_INS_VMULQ, "vmulq", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000100: (MIPS_INS_VMUDL, "vmudl", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000101: (MIPS_INS_VMUDM, "vmudm", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000110: (MIPS_INS_VMUDN, "vmudn", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000111: (MIPS_INS_VMUDH, "vmudh", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001000: (MIPS_INS_VMACF, "vmacf", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001001: (MIPS_INS_VMACU, "vmacu", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001010: (MIPS_INS_VRNDN, "vrndn", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001011: (MIPS_INS_VMACQ, "vmacq", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001100: (MIPS_INS_VMADL, "vmadl", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001101: (MIPS_INS_VMADM, "vmadm", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001110: (MIPS_INS_VMADN, "vmadn", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001111: (MIPS_INS_VMADH, "vmadh", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010000: (MIPS_INS_VADD, "vadd", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010001: (MIPS_INS_VSUB, "vsub", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010011: (MIPS_INS_VABS, "vabs", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010100: (MIPS_INS_VADDC, "vaddc", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010101: (MIPS_INS_VSUBC, "vsubc", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b011101: (MIPS_INS_VSAR, "vsar", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100000: (MIPS_INS_VLT, "vlt", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100001: (MIPS_INS_VEQ, "veq", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100010: (MIPS_INS_VNE, "vne", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100011: (MIPS_INS_VGE, "vge", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100100: (MIPS_INS_VCL, "vcl", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100101: (MIPS_INS_VCH, "vch", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100110: (MIPS_INS_VCR, "vcr", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100111: (MIPS_INS_VMRG, "vmrg", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101000: (MIPS_INS_VAND, "vand", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101001: (MIPS_INS_VNAND, "vnand", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101010: (MIPS_INS_VOR, "vor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101011: (MIPS_INS_VNOR, "vnor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101100: (MIPS_INS_VXOR, "vxor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101101: (MIPS_INS_VNXOR, "vnxor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b110000: (MIPS_INS_VRCP, "vrcp", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110001: (MIPS_INS_VRCPL, "vrcpl", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110010: (MIPS_INS_VRCPH, "vrcph", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110011: (MIPS_INS_VMOV, "vmov", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110100: (MIPS_INS_VRSQ, "vrsq", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110101: (MIPS_INS_VRSQL, "vrsql", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110110: (MIPS_INS_VRSQH, "vrsqh", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110111: (MIPS_INS_VNOP, "vnop", ( ), ()), + }), + }), + 0b100000: (MIPS_INS_LB, "lb", ("rt","offset(base)"), (True , False)), + 0b100001: (MIPS_INS_LH, "lh", ("rt","offset(base)"), (True , False)), + 0b100011: (MIPS_INS_LW, "lw", ("rt","offset(base)"), (True , False)), + 0b100100: (MIPS_INS_LBU, "lbu", ("rt","offset(base)"), (True , False)), + 0b100101: (MIPS_INS_LHU, "lhu", ("rt","offset(base)"), (True , False)), + 0b101000: (MIPS_INS_SB, "sb", ("rt","offset(base)"), (False, False)), + 0b101001: (MIPS_INS_SH, "sh", ("rt","offset(base)"), (False, False)), + 0b101011: (MIPS_INS_SW, "sw", ("rt","offset(base)"), (False, False)), + 0b110010: (mips_get_lwc2, { + 0b00000: (MIPS_INS_LBV, "lbv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00001: (MIPS_INS_LSV, "lsv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00010: (MIPS_INS_LLV, "llv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00011: (MIPS_INS_LDV, "ldv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00100: (MIPS_INS_LQV, "lqv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00101: (MIPS_INS_LRV, "lrv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00110: (MIPS_INS_LPV, "lpv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00111: (MIPS_INS_LUV, "luv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b01000: (MIPS_INS_LHV, "lhv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b01001: (MIPS_INS_LFV, "lfv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b01011: (MIPS_INS_LTV, "ltv", ("vt[ed]", "voffset(base)"), (True , False)), + }), + 0b111010: (mips_get_swc2, { + 0b00000: (MIPS_INS_SBV, "sbv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00001: (MIPS_INS_SSV, "ssv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00010: (MIPS_INS_SLV, "slv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00011: (MIPS_INS_SDV, "sdv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00100: (MIPS_INS_SQV, "sqv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00101: (MIPS_INS_SRV, "srv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00110: (MIPS_INS_SPV, "spv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00111: (MIPS_INS_SUV, "suv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01000: (MIPS_INS_SHV, "shv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01001: (MIPS_INS_SFV, "sfv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01010: (MIPS_INS_SWV, "swv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01011: (MIPS_INS_STV, "stv", ("vt[ed]", "voffset(base)"), (False, False)), + }), +} diff --git a/lib/ultralib/tools/patch_ar_meta.py b/lib/ultralib/tools/patch_ar_meta.py new file mode 100755 index 0000000..d831785 --- /dev/null +++ b/lib/ultralib/tools/patch_ar_meta.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +# +# Patch metadata in .ar files +# + +import argparse + +def ar_patch(ar, original, new_uid, new_gid, new_filemode): + """ + AR file headers + + Offset Length Name Format + 0 16 File identifier ASCII + 16 12 File modification timestamp (in seconds) Decimal + 28 6 Owner ID Decimal + 34 6 Group ID Decimal + 40 8 File mode (type and permission) Octal + 48 10 File size in bytes Decimal + 58 2 Ending characters 0x60 0x0A + """ + assert len(ar) > 0x24 , "Got empty archive?" + + armap_time1 = None + armap_time2 = None + + i = 8 + while i < len(original): + file_name = original[i:][0:][:16].decode("ASCII") + file_size = int(original[i:][48:][:10].decode("ASCII").strip()) + end = original[i:][58:][:2].decode("ASCII") + + assert end == "`\n" + + if file_name.strip() == "/": + armap_time1 = original[i+16:i+16+12] + elif file_name.strip() == "//": + armap_time2 = original[i+16:i+16+12] + + if file_size % 2 != 0: + file_size += 1 + i += file_size + 60 + + assert armap_time1 is not None + assert armap_time2 is not None + + i = 8 + while i < len(ar): + file_name = ar[i:][0:][:16].decode("ASCII") + file_size = int(ar[i:][48:][:10].decode("ASCII").strip()) + end = ar[i:][58:][:2].decode("ASCII") + + assert end == "`\n" + + if file_name.strip() == "/": + ar[i+16:i+16+12] = armap_time1 + elif file_name.strip() == "//": + ar[i+16:i+16+12] = armap_time2 + else: + ar[i+28:i+28+6] = f"{new_uid:<6}".encode("ASCII")[:6] + ar[i+34:i+34+6] = f"{new_gid:<6}".encode("ASCII")[:6] + ar[i+40:i+40+8] = f"{new_filemode:<8}".encode("ASCII")[:8] + + if file_size % 2 != 0: + file_size += 1 + i += file_size + 60 + +def main(): + parser = argparse.ArgumentParser(description="Patch metadata in .a files.") + parser.add_argument("target", help="path to the ar file to patch") + parser.add_argument("original", help="path to the original ar file") + parser.add_argument("uid", help="new uid") + parser.add_argument("gid", help="new gid") + parser.add_argument("filemode", help="new filemode") + args = parser.parse_args() + + ar = None + with open(args.target, "rb") as ar_file: + ar = bytearray(ar_file.read()) + + original = None + with open(args.original, "rb") as original_ar_file: + original = bytearray(original_ar_file.read()) + + ar_patch(ar, original, args.uid, args.gid, args.filemode) + + with open(args.target, "wb") as ar_file: + ar_file.write(ar) + +if __name__ == '__main__': + main() diff --git a/lib/ultralib/tools/print_mdebug.py b/lib/ultralib/tools/print_mdebug.py new file mode 100755 index 0000000..e0b295a --- /dev/null +++ b/lib/ultralib/tools/print_mdebug.py @@ -0,0 +1,589 @@ +#!/usr/bin/env python3 +''' +Resources: +http://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/include/coff/sym.h +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/include/coff/symconst.h +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/gas/ecoff.c +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/bfd/ecoff.c +https://github.com/pathscale/absoft/blob/master/svn/trunk/ekopath-gcc/ekopath-gcc-4.2.0/gcc/mips-tdump.c +https://chromium.googlesource.com/native_client/nacl-toolchain/+/refs/tags/gcc-4.4.3/binutils/gas/ecoff.c +https://android.googlesource.com/toolchain/binutils/+/refs/heads/donut/binutils-2.17/bfd/ecofflink.c +https://kernel.googlesource.com/pub/scm/linux/kernel/git/hjl/binutils/+/hjl/secondary/include/coff/symconst.h +https://c0de.pw/bg/binutils-gdb/blob/cdbf20f73486c66e24f322400eba877eb534ae51/gdb/mdebugread.c +''' + +import os +import struct +import collections +import sys + +OFFSET = 0 # TODO why are the offsets in the symbolic header off by some amount? + +indent_level = 0 +is_comment = False + +symbol_type_list = [ + 'stNil', 'stGlobal', 'stStatic', 'stParam', 'stLocal', 'stLabel', 'stProc', 'stBlock', + 'stEnd', 'stMember', 'stTypedef', 'stFile', 'INVALID', 'INVALID', 'stStaticProc', 'stConstant', + 'stStaParam', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', + 'INVALID', 'INVALID', 'stStruct', 'stUnion', 'stEnum', 'INVALID', 'INVALID', 'INVALID', + 'INVALID', 'INVALID', 'stIndirect'] +storage_class_list = ['scNil', 'scText', 'scData', 'scBss', 'scRegister', 'scAbs', 'scUndefined', 'reserved', + 'scBits', 'scDbx', 'scRegImage', 'scInfo', 'scUserStruct', 'scSData', 'scSBss', 'scRData', + 'scVar', 'scCommon', 'scSCommon', 'scVarRegister', 'scVariant', 'scUndefined', 'scInit'] +basic_type_c_list = ['nil', 'addr', 'signed char', 'unsigned char', 'short', 'unsigned short', 'int', 'unsigned int', + 'long', 'unsigned long', 'float', 'double', 'struct', 'union', 'enum', 'typedef', + 'range', 'set', 'complex', 'double complex', 'indirect', 'fixed decimal', 'float decimal', 'string', + 'bit', 'picture', 'void', 'long long', 'unsigned long long', 'INVALID', 'long', 'unsigned long', + 'long long', 'unsigned long long', 'addr', 'int64', 'unsigned int64'] + +def increase_indent(): + global indent_level + indent_level += 1 + +def decrease_indent(): + global indent_level + indent_level -= 1 + +def set_is_comment(set_to): + global is_comment + old = is_comment + is_comment = set_to + return old + +def get_indent(): + global indent_level + global is_comment + ret = '//' if is_comment else '' + for i in range(indent_level): + ret += ' ' + return ret + +def check_indent(): + global indent_level + assert indent_level == 0 + +def read_uint32_be(file_data, offset): + return struct.unpack('>I', file_data[offset:offset+4])[0] + +def read_uint16_be(file_data, offset): + return struct.unpack('>H', file_data[offset:offset+2])[0] + +def read_uint8_be(file_data, offset): + return struct.unpack('>B', file_data[offset:offset+1])[0] + +def read_elf_header(file_data, offset): + Header = collections.namedtuple('ElfHeader', + '''e_magic e_class e_data e_version e_osabi e_abiversion e_pad + e_type e_machine e_version2 e_entry e_phoff e_shoff e_flags + e_ehsize e_phentsize e_phnum e_shentsize e_shnum e_shstrndx''') + return Header._make(struct.unpack('>I5B7s2H5I6H', file_data[offset:offset+52])) + +def read_elf_section_header(file_data, offset): + Header = collections.namedtuple('SectionHeader', + '''sh_name sh_type sh_flags sh_addr sh_offset sh_size sh_link + sh_info sh_addralign sh_entsize''') + return Header._make(struct.unpack('>10I', file_data[offset:offset+40])) + +def read_symbolic_header(file_data, offset): + Header = collections.namedtuple('SymbolicHeader', + '''magic vstamp ilineMax cbLine cbLineOffset idnMax cbDnOffset + ipdMax cbPdOffset isymMax cbSymOffset ioptMax cbOptOffset + iauxMax cbAuxOffset issMax cbSsOffset issExtMax cbSsExtOffset + ifdMax cbFdOffset crfd cbRfdOffset iextMax cbExtOffset''') + return Header._make(struct.unpack('>2H23I', file_data[offset:offset+96])) + +# TODO find a better solution for the bitfield +def read_file_descriptor(file_data, offset): + if 'init' not in read_file_descriptor.__dict__: + read_file_descriptor.cache = {} + read_file_descriptor.header = collections.namedtuple('FileDescriptor', + '''adr rss issBase cbSs isymBase csym ilineBase cline ioptBase + copt ipdFirst cpd iauxBase caux rfdBase crfd XXX_bitfield + cbLineOffset cbLine''') + read_file_descriptor.init = True + if offset in read_file_descriptor.cache: + return read_file_descriptor.cache[offset] + read_file_descriptor.cache[offset] = read_file_descriptor.header._make( + struct.unpack('>I2iI6iHh4iI2I', file_data[offset:offset+72])) + return read_file_descriptor.cache[offset] + +def read_procedure_descriptor(file_data, offset): + Header = collections.namedtuple('ProcedureDescriptor', + '''adr isym iline regmask regoffset iopt fregmask fregoffset + frameoffset framereg pcreg lnLow lnHigh cbLineOffset''') + return Header._make(struct.unpack('>I8i2h2iI', file_data[offset:offset+52])) + +def read_symbol(file_data, offset): + if 'init' not in read_symbol.__dict__: + read_symbol.cache = {} + read_symbol.header = collections.namedtuple('Symbol', '''iss value st sc index''') + read_symbol.init = True + if offset in read_symbol.cache: + return read_symbol.cache[offset] + (word0, word1, word2) = struct.unpack('>iiI', file_data[offset:offset+12]) + read_symbol.cache[offset] = read_symbol.header._make(( + word0, word1, (word2 >> 26) & 0x3F, (word2 >> 21) & 0x1F, word2 & 0xFFFFF)) + return read_symbol.cache[offset] + +def read_auxiliary_symbol(file_data, offset): + if 'init' not in read_auxiliary_symbol.__dict__: + read_auxiliary_symbol.cache = {} + read_auxiliary_symbol.header = collections.namedtuple('AuxSymbol', + '''ti rndx dnLow dnHigh isym iss width count''') + read_auxiliary_symbol.type_info = collections.namedtuple('TypeInfo', + '''fBitfield continued bt tq4 tq5 tq0 tq1 tq2 tq3''') + read_auxiliary_symbol.rel_sym = collections.namedtuple('RelativeSymbol', '''rfd index''') + read_auxiliary_symbol.init = True + if offset in read_auxiliary_symbol.cache: + return read_auxiliary_symbol.cache[offset] + word0 = struct.unpack('>I', file_data[offset:offset+4])[0] + read_auxiliary_symbol.cache[offset] = read_auxiliary_symbol.header._make(( + read_auxiliary_symbol.type_info._make(((word0 >> 31) & 1, (word0 >> 30) & 1, (word0 >> 24) & 0x3F, (word0 >> 20) & 0xF, (word0 >> 16) & 0xF, (word0 >> 12) & 0xF, (word0 >> 8) & 0xF, (word0 >> 4) & 0xF, word0 & 0xF)), + read_auxiliary_symbol.rel_sym._make(((word0 >> 20) & 0xFFF, word0 & 0xFFFFF)), + word0, word0, word0, word0, word0, word0)) + return read_auxiliary_symbol.cache[offset] + +def read_string(file_data, offset): + current_offset = 0 + current_string = b'' + while True: + char = struct.unpack('c', file_data[offset+current_offset:offset+current_offset+1])[0] + if char == b'\0': + return current_string.decode('ascii') + else: + current_string += char + current_offset += 1 + +def map_relative_file_descriptor(file_data, fd, symbolic_header, rfd_num): + if fd.crfd == 0: + return rfd_num + + offset = symbolic_header.cbRfdOffset - OFFSET + (fd.rfdBase + rfd_num)*4 + return struct.unpack('>I', file_data[offset:offset+4])[0] + +def get_symbol_name_from_aux(file_data, fd, symbolic_header, aux_num, search_for_typedef): + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + aux_num)*4) + fd_num = aux.rndx.rfd + next_aux = aux_num+1 + if fd_num == 4095: + aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4) + fd_num = aux2.isym + next_aux = next_aux+1; + fd_num = map_relative_file_descriptor(file_data, fd, symbolic_header, fd_num) + fd2 = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + fd_num*72) + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd2.isymBase + aux.rndx.index)*12) + ret = '' + #print('%r' % (aux,)); + #print('%r' % (aux2,)); + #print('%r' % (sym,)); + if sym.st == 26 or sym.st == 27: #stStruct, stunion + ret = get_struct_or_union_string(file_data, fd2, symbolic_header, fd2.isymBase + aux.rndx.index, search_for_typedef) + elif sym.st == 28: #stEnum: + ret = get_enum_string(file_data, fd2, symbolic_header, fd2.isymBase + aux.rndx.index) + else: + ret = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd2.issBase + sym.iss) + return (ret, next_aux) + +def get_type_string(file_data, fd, symbolic_header, aux_num, name, search_for_typedef): + ret = '' + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + aux_num)*4) + #print(''); + #print('%r' % (aux,)); + next_aux = aux_num+1 + has_bitfield = aux.ti.fBitfield == 1 + bitwidth = 0 + if has_bitfield: + bit_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4) + bitwidth = bit_aux.isym + next_aux = next_aux+1 + if aux.ti.bt == 12: # btStruct + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + elif aux.ti.bt == 13: # btUnion + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + elif aux.ti.bt == 15: # btTypedef + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + elif aux.ti.bt == 14: # btEnum + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + else: + if aux.ti.bt >= 36: + print('Error unknow bt: %d' % (aux.ti.bt)) + ret = basic_type_c_list[aux.ti.bt] + + tq_list = (aux.ti.tq0, aux.ti.tq1, aux.ti.tq2, aux.ti.tq3, aux.ti.tq4, aux.ti.tq5) + + # TODO this is very naive and probably does not work in a large amount of cases + last_was_proc = False # if we see a tqProc, assume the next will be a tqPtr + for tq in tq_list: + if tq == 0: # tqNil + break; + elif tq == 1: # tqPtr + if last_was_proc: + last_was_proc = False + continue + ret += '*' + elif tq == 2: # tqProc + last_was_proc = True + name = '(*%s)(/* ECOFF does not store param types */)' % name + elif tq == 3: # tqArray + next_aux += 2 # todo what does this skip over? (Apparantly the type of the index, so always int for C) + array_low_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4) + array_high_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux+1)*4) + stride_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux+2)*4) + next_aux += 3 + if array_high_aux.dnHigh == 0xFFFFFFFF: + name += '[]' + else: + name += '[%d]' % (array_high_aux.dnHigh + 1) + elif tq == 4: # tqFar + print('ERROR tqFar in get_type_name') + elif tq == 5: # tqVol + ret = 'volatile ' + ret + elif tq == 6: # tqConst + ret = 'const ' + ret + if has_bitfield: + name += ' : %d' % bitwidth + return ret + ' ' + name + +def get_enum_string(file_data, fd, symbolic_header, enum_sym_num): + ret = '' + start_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + enum_sym_num*12) + if start_sym.st != 28: + print('ERROR unknown type in get_enum_string start:%d' % start_sym.st) + return ret + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss) + if name != '': + name += ' ' + ret += 'enum %s{\n' % name + increase_indent() + sym_num = enum_sym_num + 1 + while sym_num < fd.isymBase + start_sym.index: + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if sym.st == 8: # stEnd + decrease_indent() + ret += get_indent() + ret += '}' + elif sym.st == 9: # stMember + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + ret += get_indent() + ret += '%s = %d,\n' % (name, sym.value) + else: + print('ERROR unknown type in get_enum_string:%d' % sym.st) + break + sym_num += 1 + return ret + +def get_struct_or_union_string(file_data, fd, symbolic_header, union_sym_num, search_for_typedef): + ret = '' + start_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + union_sym_num*12) + if search_for_typedef: + typedef_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd.isymBase + start_sym.index)*12) + if typedef_sym.st == 10: # stTypedef + return read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + typedef_sym.iss) + else: + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss) + if name != '': + return name + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss) + if name != '': + name += ' ' + if start_sym.st == 26: # stStruct + ret += 'struct %s{\n' % name + increase_indent() + elif start_sym.st == 27: # stUnion + ret += 'union %s{\n' % name + increase_indent() + else: + print('ERROR unknown type in get_struct_or_union_string start:%d' % start_sym.st) + return ret + sym_num = union_sym_num + 1 + while sym_num < fd.isymBase + start_sym.index: + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if sym.st == 8: # stEnd + decrease_indent() + ret += get_indent() + ret += '}' + elif sym.st == 9: # stMember + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + ret += get_indent() + ret += '/* 0x%X */ %s;\n' % (sym.value // 8, get_type_string(file_data, fd, symbolic_header, sym.index, name, True)) + elif sym.st == 26 or sym.st == 27: #stStruct, stUnion + sym_num = fd.isymBase + sym.index + continue + elif sym.st == 34: # stIndirect + # TODO what even is a stIndirect? + sym_num += 1 + else: + print('ERROR unknown type in get_struct_or_union_string:%d' % sym.st) + break + sym_num += 1 + return ret + +def print_typedef_symbols(file_data, fd, symbolic_header, typedef_sym_num): + typedef_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + typedef_sym_num*12) + if typedef_sym.st != 10: # stTypedef + print('ERROR expected stTypedef symbol in print_typedef_symbols, found:%d' % typedef_sym.st) + return + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + typedef_sym.iss) + print('typedef %s;' % get_type_string(file_data, fd, symbolic_header, typedef_sym.index, name, False)) + +def print_procedure(file_data, fd, symbolic_header, proc_sym_num): + proc_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + proc_sym_num*12) + proc_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + proc_sym.iss) + print('%s(' % get_type_string(file_data, fd, symbolic_header, proc_sym.index+1, proc_name, True), end='') + sym_num = proc_sym_num+1 + param_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + first = True + while param_sym.st == 3: # stParam + param_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + param_sym.iss) + print('%s%s' % ('' if first else ', ', + get_type_string(file_data, fd, symbolic_header, param_sym.index, param_name, True)), + end='') + sym_num += 1 + param_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + first = False + + print(');') + + check_indent(); + + comment_old = set_is_comment(True) + while sym_num < fd.isymBase + fd.csym: + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + sym_num += 1 + if sym.st == 7: # stBlock + print('%s{' % get_indent()) + increase_indent() + elif sym.st == 8: # stEnd + end_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + if end_name == proc_name: + break + if end_name != '': + # this is a stEnd for something other than the function. Let's back out and return + sym_num -= 1 + break + decrease_indent() + print('%s}' % get_indent()) + elif sym.st == 4: # stLocal + local_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + is_reg = sym.sc == 4 # scRegister + print('%s%s%s;' % (get_indent(), + 'register ' if is_reg else '', + get_type_string(file_data, fd, symbolic_header, sym.index, local_name, True))) + elif sym.st == 2: # stStatic + static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + if sym.index == 0xFFFFF: + print('%sstatic %s; // no type symbol' % (get_indent(),static_name)) + else: + print('%sstatic %s;' % (get_indent(),get_type_string(file_data, fd, symbolic_header, sym.index, static_name, True))) + elif sym.st == 5: # stLabel + label_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + print('%sLabel: %s @ %d;' % (get_indent(), label_name, sym.value)) + elif sym.st == 6: # stProc + # multiple name for function? + sym_num = print_procedure(file_data, fd, symbolic_header, sym_num-1) + elif sym.st == 26 or sym.st == 27: # stStruct, stUnion + print('%s%s;' % (get_indent(), get_struct_or_union_string(file_data, fd, symbolic_header, sym_num-1, False))) + sym_num = fd.isymBase + sym.index + elif sym.st == 28: # stEnum + print('%s%s;' % (get_indent(), get_enum_string(file_data, fd, symbolic_header, sym_num-1))) + sym_num = fd.isymBase + sym.index + elif sym.st == 34: # stIndirect + # TODO what even is a stIndirect? + indirect_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + print('%sTODO Indirect: %s;' % (get_indent(), indirect_name)) + else: + print('ERROR unknown st in print_procedure: %d' % sym.st) + set_is_comment(comment_old) + + check_indent(); + + return sym_num + +def print_symbols(file_data, fd, symbolic_header): + sym_num = fd.isymBase + indirects = [] + typedefs = [] + while sym_num < fd.isymBase + fd.csym: + root_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if root_sym.st == 10: # stTypedef + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + root_sym.index)*4) + offset = 0 + if aux.ti.fBitfield == 1: + offset = 1 + if aux.ti.bt == 12 or aux.ti.bt == 13 or aux.ti.bt == 14 or aux.ti.bt == 15: # btStruct, btUnion, btEnum, btTypedef + aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + root_sym.index + 1 + offset)*4) + fd_num = aux2.rndx.rfd + if fd_num == 4095: + fd_num = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + root_sym.index + 2 + offset)*4).isym + fd_num = map_relative_file_descriptor(file_data, fd, symbolic_header, fd_num) + fd2 = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + fd_num*72) + sym2 = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd2.isymBase + aux2.rndx.index)*12) + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd2.issBase + sym2.iss) + if name != '': + typedefs.append(name) + elif root_sym.st == 34: # stIndirect + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + root_sym.iss) + indirects.append(name); + sym_num += 1 + sym_num = fd.isymBase + while sym_num < fd.isymBase + fd.csym: + root_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if root_sym.st == 11: # stFile + file_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + root_sym.iss) + print('// begin file %s\n' % file_name) + sym_num += 1 + leaf_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + while leaf_sym.st != 8: # stEnd + if leaf_sym.st == 26 or leaf_sym.st == 27: # stStruct, stUnion + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss) + if (name != '') and ((name in indirects) or (name not in typedefs)): # TODO + print('%s;\n' % get_struct_or_union_string(file_data, fd, symbolic_header, sym_num, False)) + sym_num = fd.isymBase + leaf_sym.index + elif leaf_sym.st == 28: # stEnum + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss) + if (name != '') and (name not in typedefs): # TODO + print('%s;\n' % get_enum_string(file_data, fd, symbolic_header, sym_num)) + sym_num = fd.isymBase + leaf_sym.index + elif leaf_sym.st == 10: # stTypedef + # TODO typedef for stIndirect shoulf print the keyword i.e. typdef >struct< THING thing + print_typedef_symbols(file_data, fd, symbolic_header, sym_num) + sym_num += 1 + print('') + elif leaf_sym.st == 6 or leaf_sym.st == 14: # stProc, stStaticProc + # TODO how do stProc and stStaticProc differ? stStaticProc isn't exported? + sym_num = print_procedure(file_data, fd, symbolic_header, sym_num) + print('') + elif leaf_sym.st == 2: # stStatic + static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss) + if leaf_sym.sc == 2 or leaf_sym.sc == 3 or leaf_sym.sc == 5 or leaf_sym.sc == 15: # scData, scBss, scAbsolute, scRData + if leaf_sym.index != 0xFFFFF: # looks like it's an invalid value for .s files + print('static %s;\n' % get_type_string(file_data, fd, symbolic_header, leaf_sym.index, static_name, True)) + else: + print('static %s;\n' % static_name) + else: + print('ERROR unknown sc for stStatic in print_symbols: %d' % leaf_sym.sc) + sym_num += 1 + elif leaf_sym.st == 34: # stIndirect + # stIndirect is put out when the compiler sees a struct when it is not yet defined + # TODO more info + sym_num += 1 + elif leaf_sym.st == 5: # stLabel + print('// label: %s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss)) + sym_num += 1 + elif leaf_sym.st == 0: # stNil + print('// nil: %s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss)) + sym_num += 1 + else: + print('ERROR unknown st in leaf_sym in print_symbols: %d' % leaf_sym.st) + sym_num += 1 + leaf_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + sym_num = fd.isymBase + root_sym.index + print('// end file %s' % file_name) + else: + print('ERROR expected st of stFile as only root type in print_symbols:%d' % root_sym.st) + return + +def main(): + global OFFSET + if len(sys.argv) < 2: + return # TODO print usage + + filename = sys.argv[1] + + try: + with open(filename, 'rb') as f: + file_data = f.read() + except IOError: + print('failed to read file ' + filename) + return + + elf_header = read_elf_header(file_data, 0) + section_headers = [] + debug_index = 0xFFFFFFFF + #print('%r' % (elf_header,)) + for i in range(elf_header.e_shnum): + section_headers.append(read_elf_section_header(file_data, elf_header.e_shoff + i*40)) + #print('%r' % (section_headers[i],)) + if section_headers[i].sh_type == 0x70000005: + debug_index = i + + if debug_index != 0xFFFFFFFF: + symbolic_header = read_symbolic_header(file_data, section_headers[debug_index].sh_offset) + file_descriptors = [] + print('%r' % (symbolic_header,)) + # Set offset by assuming that there are no optimization symbols so cbOptOffset points to the start of the symbolic header + #OFFSET = symbolic_header.cbOptOffset - section_headers[debug_index].sh_offset + #print('Using OFFSET of %d' % OFFSET) + #for sym_num in range(symbolic_header.isymMax): + #sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + #print('%d:%r' % (sym_num, (sym,))); + #for aux_num in range(symbolic_header.iauxMax): + #aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + aux_num*4) + #print('%d:%r' % (aux_num, (aux,))); + for file_num in range(symbolic_header.ifdMax): + fd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + file_num*72) + file_descriptors.append(fd) + for file_num in range(symbolic_header.ifdMax): + fd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + file_num*72) + print('%r' % (fd,)) + print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + fd.rss)) + + ''' + print(' Relative File Descriptors:') + for rfd_num in range(fd.rfdBase, fd.rfdBase + fd.crfd): + offset = symbolic_header.cbRfdOffset - OFFSET + rfd_num*4 + rfd_index = struct.unpack('>I', file_data[offset:offset+4])[0] + rfd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + rfd_index*72) + print(' %d:%r' % (rfd_index, (rfd,))) + ''' + + ''' + print(' procedures:') + for proc_num in range(fd.ipdFirst, fd.ipdFirst + fd.cpd): + pd = read_procedure_descriptor(file_data, symbolic_header.cbPdOffset - OFFSET + proc_num*52) + print(' %r' % ((pd,))) + ''' + + ''' + print(' symbols:') + for sym_num in range(fd.isymBase, fd.isymBase + fd.csym): + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + print(' %r' % ((sym,))) + print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)) + print(' type:%s(%d)' % (symbol_type_list[sym.st], sym.st)) + print(' storage class:%s(%d)' % (storage_class_list[sym.sc], sym.sc)) + if sym.st == 3 or sym.st == 4 or sym.st == 9 or sym.st == 10 or sym.st == 28: # stParam, stLocal, stMember, stTypedef, stEnum + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index)*4) + print(' %r' % ((aux,))) + offset = 0 + if aux.ti.fBitfield == 1: + bitfield_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 1)*4) + print(' %r' % ((bitfield_aux,))) + offset = 1 + if aux.ti.bt == 12 or aux.ti.bt == 13 or aux.ti.bt == 14 or aux.ti.bt == 15: # btStruct, btUnion, btEnum, btTypedef + aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 1 + offset)*4) + print(' %r' % ((aux2,))) + fd_num = aux2.rndx.rfd + if fd_num == 4095: + aux3 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 2 + offset)*4) + print(' %r' % ((aux3,))) + fd_num = aux3.isym + fd_num = map_relative_file_descriptor(file_data, fd, symbolic_header, fd_num) + sym2 = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (file_descriptors[fd_num].isymBase + aux2.rndx.index)*12) + print(' %r' % (sym2,)) + print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + file_descriptors[aux3.isym].issBase + sym2.iss)) + if sym.st == 6 or sym.st == 14: # stProc, stStaticProc + # TODO what is the first aux symbol for? + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index)*4) + type_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index+1)*4) + print(' %r' % ((aux,))) + print(' %r' % ((type_aux,))) + ''' + + print(' pretty print:') + print_symbols(file_data, fd, symbolic_header) + + +main() \ No newline at end of file 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)) + diff --git a/lib/ultralib/tools/shiftjis_conv.py b/lib/ultralib/tools/shiftjis_conv.py new file mode 100755 index 0000000..73037d2 --- /dev/null +++ b/lib/ultralib/tools/shiftjis_conv.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +import sys + +# Converts a file with UTF-8 Japanese glyphs in char literals, +# into one that uses u16 constants + +# Follows the layout in the manual page for easier cross reference +sjis_table = { + "ー": 0x815B, "ぜ": 0x82BA, "へ": 0x82D6, "ァ": 0x8340, "ソ": 0x835C, "ペ": 0x8379, + "ぁ": 0x829F, "そ": 0x82BB, "べ": 0x82D7, "ア": 0x8341, "ゾ": 0x835D, "ホ": 0x837A, + "あ": 0x82A0, "ぞ": 0x82BC, "ぺ": 0x82D8, "ィ": 0x8342, "タ": 0x835E, "ボ": 0x837B, + "ぃ": 0x82A1, "た": 0x82BD, "ほ": 0x82D9, "イ": 0x8343, "ダ": 0x835F, "ポ": 0x837C, + "い": 0x82A2, "だ": 0x82BE, "ぼ": 0x82DA, "ゥ": 0x8344, "チ": 0x8360, "マ": 0x837D, + "ぅ": 0x82A3, "ち": 0x82BF, "ぽ": 0x82DB, "ウ": 0x8345, "ヂ": 0x8361, "ミ": 0x837E, + "う": 0x82A4, "ぢ": 0x82C0, "ま": 0x82DC, "ェ": 0x8346, "ッ": 0x8362, "ム": 0x8380, + "ぇ": 0x82A5, "っ": 0x82C1, "み": 0x82DD, "エ": 0x8347, "ツ": 0x8363, "メ": 0x8381, + "え": 0x82A6, "つ": 0x82C2, "む": 0x82DE, "ォ": 0x8348, "ヅ": 0x8364, "モ": 0x8382, + "ぉ": 0x82A7, "づ": 0x82C3, "め": 0x82DF, "オ": 0x8349, "テ": 0x8365, "ャ": 0x8383, + "お": 0x82A8, "て": 0x82C4, "も": 0x82E0, "カ": 0x834A, "デ": 0x8366, "ヤ": 0x8384, + "か": 0x82A9, "で": 0x82C5, "ゃ": 0x82E1, "ガ": 0x834B, "ト": 0x8367, "ュ": 0x8385, + "が": 0x82AA, "と": 0x82C6, "や": 0x82E2, "キ": 0x834C, "ド": 0x8368, "ユ": 0x8386, + "き": 0x82AB, "ど": 0x82C7, "ゅ": 0x82E3, "ギ": 0x834D, "ナ": 0x8369, "ョ": 0x8387, + "ぎ": 0x82AC, "な": 0x82C8, "ゆ": 0x82E4, "ク": 0x834E, "ニ": 0x836A, "ヨ": 0x8388, + "く": 0x82AD, "に": 0x82C9, "ょ": 0x82E5, "グ": 0x834F, "ヌ": 0x836B, "ラ": 0x8389, + "ぐ": 0x82AE, "ぬ": 0x82CA, "よ": 0x82E6, "ケ": 0x8350, "ネ": 0x836C, "リ": 0x838A, + "け": 0x82AF, "ね": 0x82CB, "ら": 0x82E7, "ゲ": 0x8351, "ノ": 0x836D, "ル": 0x838B, + "げ": 0x82B0, "の": 0x82CC, "り": 0x82E8, "コ": 0x8352, "ハ": 0x836E, "レ": 0x838C, + "こ": 0x82B1, "は": 0x82CD, "る": 0x82E9, "ゴ": 0x8353, "バ": 0x836F, "ロ": 0x838D, + "ご": 0x82B2, "ば": 0x82CE, "れ": 0x82EA, "サ": 0x8354, "パ": 0x8370, "ヮ": 0x838E, + "さ": 0x82B3, "ぱ": 0x82CF, "ろ": 0x82EB, "ザ": 0x8355, "ヒ": 0x8371, "ワ": 0x838F, + "ざ": 0x82B4, "ひ": 0x82D0, "ゎ": 0x82EC, "シ": 0x8356, "ビ": 0x8372, "ヰ": 0x8390, + "し": 0x82B5, "び": 0x82D1, "わ": 0x82ED, "ジ": 0x8357, "ピ": 0x8373, "ヱ": 0x8391, + "じ": 0x82B6, "ぴ": 0x82D2, "ゐ": 0x82EE, "ス": 0x8358, "フ": 0x8374, "ヲ": 0x8392, + "す": 0x82B7, "ふ": 0x82D3, "ゑ": 0x82EF, "ズ": 0x8359, "ブ": 0x8375, "ン": 0x8393, + "ず": 0x82B8, "ぶ": 0x82D4, "を": 0x82F0, "セ": 0x835A, "プ": 0x8376, "ヴ": 0x8394, + "せ": 0x82B9, "ぷ": 0x82D5, "ん": 0x82F1, "ゼ": 0x835B, "ヘ": 0x8377, "ヵ": 0x8395, + "ベ": 0x8378, "ヶ": 0x8396, +} + +skipTimer = 0 + +def sjis_process(buf, outfile): + global skipTimer + + for i, char in enumerate(buf): + if skipTimer > 0: + skipTimer -= 1 + continue + if char == "'" and buf[i+1] in sjis_table: + if sjis_table[buf[i+1]] == 0: + print("Error: Please map %s in %s" % (buf[i+1], sys.argv[0])) + exit(1) + outfile.write("0x%X" % sjis_table[buf[i+1]]) + skipTimer = 2 + else: + outfile.write(char) + + diff --git a/lib/ultralib/tools/strip_debug.sh b/lib/ultralib/tools/strip_debug.sh new file mode 100755 index 0000000..4a8be78 --- /dev/null +++ b/lib/ultralib/tools/strip_debug.sh @@ -0,0 +1,10 @@ +#!/usr/bin/bash + +cd $1 + +mkdir -p .cmp + +for f in *.o ; +do + ${CROSS}objcopy -p --strip-debug $f .cmp/${f/.o/.cmp.o} +done diff --git a/lib/ultralib/tools/util.py b/lib/ultralib/tools/util.py new file mode 100644 index 0000000..b6c6155 --- /dev/null +++ b/lib/ultralib/tools/util.py @@ -0,0 +1,44 @@ + +import struct + +def enumerate_stepped(l, start=0, step=1): + p = start + for e in l: + yield p, e + p += step + +def back_align(x, al): + return x - (x % al) + +def forward_align(x, al): + return (x + (al - 1)) & ~(al - 1) + +def as_double(b): + return struct.unpack(">d", b)[0] + +def as_dword(b): + return struct.unpack(">Q", b)[0] + +def as_float(b): + return struct.unpack(">f", b)[0] + +def as_word(b): + return struct.unpack(">I", b)[0] + +def as_hword(b): + return struct.unpack(">H", b)[0] + +def as_double_list(b): + return [i[0] for i in struct.iter_unpack(">d", b)] + +def as_dword_list(b): + return [i[0] for i in struct.iter_unpack(">Q", b)] + +def as_float_list(b): + return [i[0] for i in struct.iter_unpack(">f", b)] + +def as_word_list(b): + return [i[0] for i in struct.iter_unpack(">I", b)] + +def as_hword_list(b): + return [h[0] for h in struct.iter_unpack(">H", b)] diff --git a/linker_scripts/common_undef_syms.ld b/linker_scripts/common_undef_syms.ld new file mode 100644 index 0000000..f8e39b8 --- /dev/null +++ b/linker_scripts/common_undef_syms.ld @@ -0,0 +1,14 @@ +EXTERN(__osSetCause); +EXTERN(_bzero); +EXTERN(alBnkfNew); +EXTERN(__osSetCause); +EXTERN(fsin); +EXTERN(alUnlink); +EXTERN(alLink); +EXTERN(alClose); +EXTERN(alInit); +EXTERN(_VirtualToPhysicalTask); +EXTERN(osSpTaskLoad); +EXTERN(osSpTaskStartGo); +EXTERN(osViModeMpalLpn1); +EXTERN(__osPfsSelectBank); diff --git a/linker_scripts/us/hardware_regs.ld b/linker_scripts/us/hardware_regs.ld new file mode 100644 index 0000000..533a42c --- /dev/null +++ b/linker_scripts/us/hardware_regs.ld @@ -0,0 +1,94 @@ +// Signal Processor Registers +SP_MEM_ADDR_REG = 0xA4040000; // defined:True +SP_DRAM_ADDR_REG = 0xA4040004; // defined:True +SP_RD_LEN_REG = 0xA4040008; // defined:True +SP_WR_LEN_REG = 0xA404000C; // defined:True +SP_STATUS_REG = 0xA4040010; // defined:True +SP_DMA_FULL_REG = 0xA4040014; // defined:True +SP_DMA_BUSY_REG = 0xA4040018; // defined:True +SP_SEMAPHORE_REG = 0xA404001C; // defined:True + +SP_PC = 0xA4080000; // defined:True + +// Display Processor Command Registers / Rasterizer Interface +DPC_START_REG = 0xA4100000; // defined:True +DPC_END_REG = 0xA4100004; // defined:True +DPC_CURRENT_REG = 0xA4100008; // defined:True +DPC_STATUS_REG = 0xA410000C; // defined:True +DPC_CLOCK_REG = 0xA4100010; // defined:True +DPC_BUFBUSY_REG = 0xA4100014; // defined:True +DPC_PIPEBUSY_REG = 0xA4100018; // defined:True +DPC_TMEM_REG = 0xA410001C; // defined:True + +// Display Processor Span Registers +DPS_TBIST_REG = 0xA4200000; // defined:True // DPS_TBIST_REG / DP_TMEM_BIST +DPS_TEST_MODE_REG = 0xA4200004; // defined:True +DPS_BUFTEST_ADDR_REG = 0xA4200008; // defined:True +DPS_BUFTEST_DATA_REG = 0xA420000C; // defined:True + +// MIPS Interface Registers +MI_MODE_REG = 0xA4300000; // defined:True // MI_MODE_REG / MI_INIT_MODE_REG +MI_VERSION_REG = 0xA4300004; // defined:True +MI_INTR_REG = 0xA4300008; // defined:True +MI_INTR_MASK_REG = 0xA430000C; // defined:True + +// Video Interface Registers +VI_STATUS_REG = 0xA4400000; // defined:True // VI_STATUS_REG / VI_CONTROL_REG +VI_DRAM_ADDR_REG = 0xA4400004; // defined:True // VI_DRAM_ADDR_REG / VI_ORIGIN_REG +VI_WIDTH_REG = 0xA4400008; // defined:True +VI_INTR_REG = 0xA440000C; // defined:True +VI_CURRENT_REG = 0xA4400010; // defined:True +VI_BURST_REG = 0xA4400014; // defined:True // VI_BURST_REG / VI_TIMING_REG +VI_V_SYNC_REG = 0xA4400018; // defined:True +VI_H_SYNC_REG = 0xA440001C; // defined:True +VI_LEAP_REG = 0xA4400020; // defined:True +VI_H_START_REG = 0xA4400024; // defined:True +VI_V_START_REG = 0xA4400028; // defined:True +VI_V_BURST_REG = 0xA440002C; // defined:True +VI_X_SCALE_REG = 0xA4400030; // defined:True +VI_Y_SCALE_REG = 0xA4400034; // defined:True + +// Audio Interface Registers +AI_DRAM_ADDR_REG = 0xA4500000; // defined:True +AI_LEN_REG = 0xA4500004; // defined:True +AI_CONTROL_REG = 0xA4500008; // defined:True +AI_STATUS_REG = 0xA450000C; // defined:True +AI_DACRATE_REG = 0xA4500010; // defined:True +AI_BITRATE_REG = 0xA4500014; // defined:True + +// Peripheral/Parallel Interface Registers +PI_DRAM_ADDR_REG = 0xA4600000; // defined:True +PI_CART_ADDR_REG = 0xA4600004; // defined:True +D_A4600005 = 0xA4600005; // defined:True // TODO figure out its name +D_A4600006 = 0xA4600006; // defined:True // TODO figure out its name +D_A4600007 = 0xA4600007; // defined:True // TODO figure out its name +PI_RD_LEN_REG = 0xA4600008; // defined:True +PI_WR_LEN_REG = 0xA460000C; // defined:True +PI_STATUS_REG = 0xA4600010; // defined:True +PI_BSD_DOM1_LAT_REG = 0xA4600014; // defined:True // PI dom1 latency +PI_BSD_DOM1_PWD_REG = 0xA4600018; // defined:True // PI dom1 pulse width +PI_BSD_DOM1_PGS_REG = 0xA460001C; // defined:True // PI dom1 page size +PI_BSD_DOM1_RLS_REG = 0xA4600020; // defined:True // PI dom1 release +PI_BSD_DOM2_LAT_REG = 0xA4600024; // defined:True // PI dom2 latency +PI_BSD_DOM2_LWD_REG = 0xA4600028; // defined:True // PI dom2 pulse width +PI_BSD_DOM2_PGS_REG = 0xA460002C; // defined:True // PI dom2 page size +PI_BSD_DOM2_RLS_REG = 0xA4600030; // defined:True // PI dom2 release + +// RDRAM Interface Registers +RI_MODE_REG = 0xA4700000; // defined:True +RI_CONFIG_REG = 0xA4700004; // defined:True +RI_CURRENT_LOAD_REG = 0xA4700008; // defined:True +RI_SELECT_REG = 0xA470000C; // defined:True +RI_REFRESH_REG = 0xA4700010; // defined:True +RI_LATENCY_REG = 0xA4700014; // defined:True +RI_RERROR_REG = 0xA4700018; // defined:True +RI_WERROR_REG = 0xA470001C; // defined:True + +// Serial Interface Registers +SI_DRAM_ADDR_REG = 0xA4800000; // defined:True +SI_PIF_ADDR_RD64B_REG = 0xA4800004; // defined:True +D_A4800008 = 0xA4800008; // defined:True // reserved +D_A480000C = 0xA480000C; // defined:True // reserved +SI_PIF_ADDR_WR64B_REG = 0xA4800010; // defined:True +D_A4800014 = 0xA4800014; // defined:True // reserved +SI_STATUS_REG = 0xA4800018; // defined:True diff --git a/linker_scripts/us/symbol_addrs.txt b/linker_scripts/us/symbol_addrs.txt new file mode 100644 index 0000000..76a03d7 --- /dev/null +++ b/linker_scripts/us/symbol_addrs.txt @@ -0,0 +1,757 @@ +LeoByteToLBA = 0x80055050; +LeoCJCreateLeoManager = 0x80055BB0; +LeoDriveExist = 0x800564C0; +LeoLBAToByte = 0x80052710; +LeoReadDiskID = 0x80052B10; +LeoReadWrite = 0x80050FC0; +LeoReadRTC = 0x80056670; +LeoReset = 0x80051384; +LeoResetClear = 0x80051438; +LeoSeek = 0x80056790; +LeoSetRTC = 0x80054800; +LeoSpdlMotor = 0x80053650; +LeoTestUnitReady = 0x80056590; +leoVerifyRTC = 0x800548C0; + + + +_Litob = 0x80064CA0; // defined:true +_Printf = 0x8005D850; // defined:true +_Putfld = 0x8005D1E0; // defined:true +__leoSetReset = 0x80051414; // defined:true +__leoResetCalled = 0x80079510; // defined:true +__ll_div = 0x8005751C; // defined:true +__ll_lshift = 0x800574B4; // defined:true +__ll_mod = 0x80057608; // defined:true +__ll_mul = 0x80057578; // defined:true +__ll_rem = 0x800574E0; // defined:true +__ll_rshift = 0x800576A4; // defined:true +__osAiDeviceBusy = 0x80065C50; // defined:true +__osCheckId = 0x8005CA40; // defined:true +__osCheckPackId = 0x8005C730; // defined:true +__osContAddressCrc = 0x80063C90; // defined:true +__osContDataCrc = 0x80063D60; // defined:true +__osContGetInitData = 0x800589D0; // defined:true +__osContRamRead = 0x80063A60; // defined:true +__osContRamWrite = 0x80063810; // defined:true +__osDequeueThread = 0x80056CB0; // defined:true +__osDevMgrMain = 0x8005B820; // defined:true +__osDisableInt = 0x80062A90; // defined:true +__osDispatchThread = 0x80057E44; // defined:true +__osEepStatus = 0x8005BFA4; // defined:true +__osEnqueueAndYield = 0x80057CEC; // defined:true +__osGbpakSetBank = 0x80065AD0; // defined:true +__osGetId = 0x8005C894; // defined:true +__osIdCheckSum = 0x8005C2E4; // defined:true +__osLeoInterrupt = 0x80055DF0; // defined:true +__osLeoAbnormalResume = 0x80056350; // defined:true +__osLeoResume = 0x80056404; // defined:true +__osPackEepReadData = 0x80065E44; // defined:true +__osPackEepWriteData = 0x8005BEF8; // defined:true +__osPackReadData = 0x80058F20; // defined:true +__osPackRequestData = 0x80058AA0; // defined:true +__osPfsGetOneChannelData = 0x800598C4; // defined:true +__osPfsGetStatus = 0x80059730; // defined:true +__osPfsRWInode = 0x8005CB14; // defined:true +__osPfsRequestOneChannel = 0x80059800; // defined:true +__osPfsSelectBank = 0x80063670; // defined:true +__osPiCreateAccessQueue = 0x800567F0; // defined:true +__osPiGetAccess = 0x80056840; // defined:true +__osPiRelAccess = 0x80056884; // defined:true +__osPopThread = 0x80057E34; // defined:true +__osRepairPackId = 0x8005C3E0; // defined:true +__osResetGlobalIntMask = 0x80062870; // defined:true +__osRestoreInt = 0x80062B00; // defined:true +__osRunningThread = 0x80079630; // defined:true +__osSetCause = 0x800568B0; // defined:true +__osSetGlobalIntMask = 0x80062220; // defined:true +__osSiDeviceBusy = 0x8005E570; // defined:true +__osSiRawReadIo = 0x8005AA50; // defined:true +__osSiRawStartDma = 0x8005A8E0; // defined:true +__osSiRawWriteIo = 0x80064F40; // defined:true +__osSpDeviceBusy = 0x8005E540; // defined:true +__osSpGetStatus = 0x80064FA0; // defined:true +__osSpRawStartDma = 0x8005A850; // defined:true +__osSpSetPc = 0x80065F10; // defined:true +__osSpSetStatus = 0x80064F90; // defined:true +__osSumCalc = 0x8005C270; // defined:true +__osViSwapContext = 0x80062C60; // defined:true +__ull_div = 0x80057478; // defined:true +__ull_divremi = 0x800575A8; // defined:true +__ull_rem = 0x8005743C; // defined:true +__ull_rshift = 0x80057410; // defined:true +__locReadTimer = 0x80055864; // defined:true +__locSetTimer = 0x800559D4; // defined:true +guLookAtReflect = 0x8005AECC; // defined:true +guLookAtReflectF = 0x8005AAC0; // defined:true +guMtxF2L = 0x8005AF50; // defined:true +guMtxIdent = 0x8005B0D8; // defined:true +guMtxIdentF = 0x8005B050; // defined:true +guMtxL2F = 0x8005B108; // defined:true +guNormalize = 0x80062420; // defined:true +guOrtho = 0x80062A24; // defined:true +guOrthoF = 0x800628D0; // defined:true +guScale = 0x80056D44; // defined:true +guScaleF = 0x80056CF0; // defined:true +guTranslate = 0x8005E5E8; // defined:true +guTranslateF = 0x8005E5A0; // defined:true +ldiv = 0x80064C10; // defined:true +lldiv = 0x80064B10; // defined:true + +memcpy = 0x8005E250; // defined:true +__osRcpImTable = 0x8007E210; // defined:true +osAiGetLength = 0x80063700; // defined:true +osAiSetFrequency = 0x80062270; // defined:true +osAiSetNextBuffer = 0x80065BA0; // defined:true +osContGetReadData = 0x80058E94; // defined:true +osContInit = 0x80058860; // defined:true +osContStartReadData = 0x80058E10; // defined:true +osCreateThread = 0x80058CC0; // defined:true +osCreateViManager = 0x80064FC0; // defined:true +osDestroyThread = 0x80057300; // defined:true +osDpGetCounters = 0x800623C0; // defined:true +osDpSetStatus = 0x800624D0; // defined:true +osDriveRomInit = 0x80052860; // defined:true +osEPiRawReadIo = 0x8005E890; // defined:true +osEPiRawStartDma = 0x8005EA40; // defined:true +osEPiRawWriteIo = 0x80063E10; // defined:true +osEepromLongRead = 0x80059000; // defined:true +osEepromProbe = 0x8005BD10; // defined:true +osEepromRead = 0x80065C80; // defined:true +osEepromWrite = 0x8005BD80; // defined:true +osGbpakCheckConnector = 0x800582C0; // defined:true +osGbpakGetStatus = 0x8005DEA0; // defined:true +osGbpakInit = 0x80059500; // defined:true +osGbpakPower = 0x80058750; // defined:true +osGbpakReadId = 0x80063350; // defined:true +osGbpakReadWrite = 0x80065910; +osGetThreadPri = 0x8005E870; // defined:true +osGetTime = 0x8005F150; // defined:true +osJamMesg = 0x8005E640; // defined:true +osLeoDiskInit = 0x80052A70; // defined:true +osPiGetCmdQueue = 0x80062F60; // defined:true +osPiRawStartDma = 0x8005BC30; // defined:true +osRecvMesg = 0x80056AD0; // defined:true +osSendMesg = 0x800568C0; // defined:true +osSetEventMesg = 0x8005CDF0; // defined:true +osSetIntMask = 0x80056C10; // defined:true +osSetThreadPri = 0x8005E790; // defined:true +osSetTimer = 0x80063F70; // defined:true +osSpTaskYield = 0x8005AAA0; // defined:true +osSpTaskYielded = 0x8005EC20; // defined:true +osStartThread = 0x80065370; // defined:true +osStopThread = 0x80056A10; // defined:true +osSyncPrintf = 0x8005E210; // defined:true +osViBlack = 0x8005A9E0; // defined:true +osViGetCurrentFramebuffer = 0x80065ED0; // defined:true +osViSetEvent = 0x800632E0; // defined:true +osViSetMode = 0x8005B1C0; // defined:true +osViSetSpecialFeatures = 0x80063150; // defined:true +osViSetXScale = 0x800654C0; // defined:true +osViSetYScale = 0x800655F0; // defined:true +osViSwapBuffer = 0x8005E9F0; // defined:true +osVirtualToPhysical = 0x80059090; // defined:true +osYieldThread = 0x800637C0; // defined:true +proutSprintf = 0x8005E020; // defined:true +rmonPrintf = 0x8005E22C; // defined:true +sprintf = 0x8005E044; // defined:true +strchr = 0x8005E2A4; // defined:true +strlen = 0x8005E27C; // defined:true +viMgrMain = 0x80065140; // defined:true +leoRd_capacity = 0x80054CC0; // defined:true +leoWrite = 0x80055A80; // defined:true +leoSeek = 0x800566D0; // defined:true +__osSetCount = 0x80058FF0; // defined:true +__osSetSR = 0x80059110; // defined:true +osWritebackDCache = 0x80059120; // defined:true +osInitialize = 0x800591A0; // defined:true +__osGetSR = 0x800594F0; // defined:true +alFxPull = 0x80059960; // defined:true +alFxParam = 0x80059CA0; // defined:true +alFxParamHdl = 0x80059CB8; // defined:true +_loadOutputBuffer = 0x80059F14; // defined:true +_loadBuffer = 0x8005A134; // defined:true +_saveBuffer = 0x8005A2CC; // defined:true +_filterBuffer = 0x8005A460; // defined:true +_doModFunc = 0x8005A510; // defined:true +__osSiCreateAccessQueue = 0x80058BA0; // defined:true +__osSiGetAccess = 0x80058BF0; // defined:true +__osSiRelAccess = 0x80058C34; // defined:true +osGetMemSize = 0x8005C150; // defined:true +sqrtf = 0x8005CEB0; // defined:true +guMtxXFMF = 0x8005CEE0; // defined:true +guMtxCatF = 0x8005CF80; // defined:true +guMtxXFML = 0x8005D0F0; // defined:true +guMtxCatL = 0x8005D150; // defined:true +guRandom = 0x8005D1B0; // defined:true +osUnmapTLBAll = 0x8005E0A0; // defined:true +alHeapInit = 0x8005E1D0; // defined:true +osInvalDCache = 0x8005E2F0; // defined:true +osCreateMesgQueue = 0x8005E3A0; // defined:true +osInvalICache = 0x8005E3D0; // defined:true +bcmp = 0x8005EE40; // defined:true +__osTimerServicesInit = 0x8005F1E0; // defined:true +__osTimerInterrupt = 0x8005F26C; // defined:true +__osSetTimerIntr = 0x8005F3E4; // defined:true +__osInsertTimer = 0x8005F458; // defined:true +_init_lpfilter = 0x8005FC60; // defined:true +alFxNew = 0x8005FD00; // defined:true +alEnvmixerNew = 0x8006013C; // defined:true +alLoadNew = 0x800601E4; // defined:true +alResampleNew = 0x8006028C; // defined:true +alAuxBusNew = 0x80060318; // defined:true +alMainBusNew = 0x8006036C; // defined:true +alSaveNew = 0x800603C0; // defined:true +alMainBusParam = 0x80060410; // defined:true +alMainBusPull = 0x80060440; // defined:true +alAuxBusParam = 0x80060560; // defined:true +alAuxBusPull = 0x80060590; // defined:true +alEnvmixerPull = 0x80060670; // defined:true +alResampleParam = 0x800612F0; // defined:true +alResamplePull = 0x800613DC; // defined:true +alFilterNew = 0x80062140; // defined:true +alSavePull = 0x80062160; // defined:true +alSaveParam = 0x800621EC; // defined:true +__osActiveQueue = 0x8007962C; // defined:true +__osGetActiveQueue = 0x80062410; // defined:true +__osSetCompare = 0x800624B0; // defined:true +osAiGetStatus = 0x800624C0; // defined:true +alCopy = 0x800624E0; // defined:true +_bcopy = 0x80062560; // defined:true +__osViInit = 0x80062B20; // defined:true +__cosf = 0x80062F90; // defined:true +osEPiReadIo = 0x80063100; // defined:true +osSetTime = 0x800632B0; // defined:true +osCartRomInit = 0x80063510; // defined:true +__osSetFpcCsr = 0x800636F0; // defined:true +osEPiWriteIo = 0x80063710; // defined:true +osMapTLBRdb = 0x80063760; // defined:true +__osViCurr = 0x8007ACF0; // defined:true +__osViGetCurrentContext = 0x800652D0; // defined:true +osWritebackDCacheAll = 0x800652E0; // defined:true +alHeapDBAlloc = 0x80065310; // defined:true +__d_to_ll = 0x80065650; // defined:true +__f_to_ll = 0x8006566C; // defined:true +__d_to_ull = 0x80065688; // defined:true +__f_to_ull = 0x80065728; // defined:true +__ll_to_d = 0x800657C4; // defined:true +__ll_to_f = 0x800657DC; // defined:true +__ull_to_d = 0x800657F4; // defined:true +__ull_to_f = 0x80065828; // defined:true +alSynAllocFX = 0x80065860; // defined:true +alSynDelete = 0x80065900; // defined:true +__osSetHWIntrRoutine = 0x80065F50; // defined:true +entry_point = 0x80000400; // defined:true +alSynNew = 0x8005F5E0; // defined:true +alAudioFrame = 0x8005F8E0; // defined:true +__allocParam = 0x8005FAB0; // defined:true +__freeParam = 0x8005FAE0; // defined:true +_collectPVoices = 0x8005FAF8; // defined:true +_freePVoice = 0x8005FB58; // defined:true +_timeToSamples = 0x8005FBDC; // defined:true +alUnlink = 0x80056F50; // defined:true +alLink = 0x80056F80; // defined:true +alClose = 0x80056FA4; // defined:true +alInit = 0x80056FDC; // defined:true +_VirtualToPhysicalTask = 0x80057010; // defined:true +osSpTaskLoad = 0x8005712C; // defined:true +osSpTaskStartGo = 0x800572BC; // defined:true +tmp_task = 0x80102100; // defined:true +__osPiAccessQueue = 0x801020E8; // defined:true +__osPiAccessQueueEnabled = 0x80079610; // defined:true +piAccessBuf = 0x801020E0; // defined:true +__sinf = 0x80056D90; // defined:true +__libm_qnan_f = 0x8007E5D0; // defined:true +bzero = 0x80057FD0; // defined:true +__osGbpakTimer = 0x80102200; // defined:true +__osGbpakTimerQ = 0x80102220; // defined:true +__osGbpakTimerMsg = 0x80102238; // defined:true +__osContPifRam = 0x80102140; // defined:true +__osMaxControllers = 0x80102181; // defined:true +__osContLastCmd = 0x80102180; // defined:true +__osEepromTimerQ = 0x801021A8; // defined:true +__osEepromTimerMsg = 0x801021C0; // defined:true +__osContInitialized = 0x80079680; // defined:true +__osSiAccessQueue = 0x801021D8; // defined:true +__osSiAccessQueueEnabled = 0x80079690; // defined:true +siAccessBuf = 0x801021D0; // defined:true +__osCleanupThread = 0x80057FC0; // defined:true +__osProbeTLB = 0x8005B5E0; // defined:true +__osFinalRom = 0x801021F0; // defined:true +__osExceptionPreamble = 0x800576D0; // defined:true +__osCartRomInit = 0x80059448; // defined:true +osResetType = 0x8000030C; // defined:true +osAppNMIBuffer = 0x8000031C; // defined:true +osTvType = 0x80000300; // defined:true +__osGetCause = 0x80063E00; // defined:true +LeoDiskHandle = 0x801024A8; +CartRomHandle = 0x80102430; +__LeoDiskHandle = 0x801007C0; // defined:true +__osGlobalIntMask = 0x800796B0; // defined:true +__osShutdown = 0x800796AC; // defined:true +osViClock = 0x800796A8; // defined:true +__osPfsInodeCacheBank = 0x8007A934; // defined:true +__osPfsPifRam = 0x801023F0; // defined:true +alGlobals = 0x80079640; // defined:true +guPerspectiveF = 0x8005A5C0; // defined:true +guPerspective = 0x8005A7F0; // defined:true +alSeqFileNew = 0x80058278; // defined:true +__osDiskHandle = 0x80100834; // defined:true +__osPiTable = 0x8007A87C; // defined:true +osViRepeatLine = 0x8005B230; // defined:true +osPfsIsPlug = 0x8005B2A0; // defined:true +__osPfsRequestData = 0x8005B440; // defined:true +__osPfsGetInitData = 0x8005B510; // defined:true +osCreatePiManager = 0x8005B6A0; // defined:true +osEPiStartDma = 0x8005E0F0; // defined:true +__osEepromTimer = 0x80102188; // defined:true +osEepromLongWrite = 0x8005E450; // defined:true +guRotateRPYF = 0x8005ECA0; // defined:true +guRotateRPY = 0x8005EDEC; // defined:true +guRotateF = 0x8005EF60; // defined:true +guRotate = 0x8005F0F4; // defined:true +_Ldtob = 0x800645C0; // defined:true +alAdpcmPull = 0x80061C9C; // defined:true +alLoadParam = 0x800615F0; // defined:true +osEPiLinkHandle = 0x8005A990; // defined:true +__osViNext = 0x8007ACF4; // defined:true +piEventQueue = 0x801036D0; // defined:true +piEventBuf = 0x801036E8; // defined:true +piThread = 0x80102520; // defined:true +__osPiDevMgr = 0x8007A860; // defined:true +piThreadStack = 0x801026D0; // defined:true +osRomBase = 0x80000308; // defined:true +__osEepPifRam = 0x80104B70; // defined:true +osGetCount = 0x8005BD00; // defined:true +__osPfsInodeCacheChannel = 0x8007A930; // defined:true +__osPfsInodeCache = 0x801036F0; // defined:true +__osPreNMI = 0x8007A940; // defined:true +__osEventStateTab = 0x801037F0; // defined:true +osAfterPreNMI = 0x8005CEC0; // defined:true +__osThreadTail = 0x80079620; // defined:true +__osRunQueue = 0x80079628; // defined:true +__osEnqueueThread = 0x80057DEC; // defined:true +__osCurrentHandle = 0x8007A880; // defined:true +osViModeNtscLpn1 = 0x8007A890; // defined:true +osViModeMpalLpn1 = 0x8007A8E0; // defined:true +__osTimerList = 0x8007A9B0; // defined:true +__osBaseTimer = 0x80103890; // defined:true +__osCurrentTime = 0x801038B0; // defined:true +__osCurrentTime+4 = 0x801038B4; // defined:true +__osBaseCounter = 0x801038B8; // defined:true +__osViIntrCount = 0x801038BC; // defined:true +__osTimerCounter = 0x801038C0; // defined:true +_timeToSamplesNoRound = 0x8005FB90; // defined:true +alEnvmixerParam = 0x80060B78; // defined:true +_pullSubFrame = 0x80060C58; // defined:true +_frexpf = 0x80060F40; // defined:true +_ldexpf = 0x8006102C; // defined:true +_getRate = 0x80061054; // defined:true +_getVol = 0x80061238; // defined:true +osViModePalLan1 = 0x8007AD00; // defined:true +osViModeMpalLan1 = 0x8007ADA0; // defined:true +osViModeNtscLan1 = 0x8007AD50; // defined:true +g_OsGbNintendoData = 0x8007ADF0; // defined:true +g_OsGbCartVersions = 0x8007AE20; // defined:true +__CartRomHandle = 0x801038D0; // defined:true +__DriveRomHandle = 0x80100740; // defined:true +__osPfsLastChannel = 0x8007AE50; // defined:true +__osViDevMgr = 0x8007AE90; // defined:true +__leoQueuesCreated = 0x80079514; // defined:true +__leoActive = 0x800795B0; // defined:true +__leoVersion = 0x801010D0; // defined:true +__additional_scanline = 0x8007AEAC; // defined:true +viThread = 0x80103950; // defined:true +viThreadStack = 0x80103B00; // defined:true +viEventQueue = 0x80104B00; // defined:true +viEventBuf = 0x80104B18; // defined:true +viRetraceMsg = 0x80104B30; // defined:true +viCounterMsg = 0x80104B48; // defined:true +__osHwIntTable = 0x80079650; // defined:true + + + +LEOcur_command = 0x801006C8; +LEOPiInfo = 0x80100710; +LEOPiDmaParam = 0x80100718; +mseq_tbl = 0x80101090; +rd_mseq_code = 0x8007E170; +wt_mseq_code = 0x8007E1B0; +unit_atten = 0x80100844; +asic_cur_status = 0x80100840; +currentCommand = 0x80100730; +LEOc2ctrl_que = 0x801006F8; +LEOcommand_que = 0x80100638; // allow_duplicated:True +LEOcontrol_que = 0x80100668; +LEOcontrol_que_buf = 0x801006B4; +LEOevent_que = 0x80100650; +LEOevent_que_buf = 0x801006B0; +LEOdma_que = 0x80100680; +LEOdma_que_buf = 0x801006B8; +LEOpost_que = 0x800FF9D0; +LEOpost_que_buf = 0x800FF9E8; +LEOblock_que = 0x80100698; +LEOblock_que_buf = 0x801006C0; +LEOcommandThread = 0x800FFAD8; +LEOcommandThreadStack = 0x80100238; +LEOinterruptThread = 0x800FFC88; +LEOinterruptThreadStack = 0x80100638; // allow_duplicated:True +LEOclr_que_flag = 0x801006D5; +LEO_ZERO_MESG = 0X8007DA30; +LEORAM_START_LBA = 0x8007DD18; +LEORAM_BYTE = 0x8007DD28; +LEOVZONE_TBL = 0x8007DB98; +LEOZONE_SCYL_TBL = 0x8007DC78; +LEOVZONE_PZONEHD_TBL = 0x8007DC98; +LEOBYTE_TBL1 = 0x8007DB78; +LEOBYTE_TBL2 = 0x8007DB84; +LEOZONE_OUTERCYL_TBL = 0x8007DD08; +LEO_TempBuffer = 0x80100850; +read_id_cmd = 0x80079590; +leo_disk_id_lba = 0x8007DAF0; +leo_sys_read_cmd = 0x80079560; +leo_sys_form_lbas = 0x8007DA40; +ymdupper = 0x8007E1F0; +dayupper = 0x8007E1F8; +LEO_sys_data = 0x800FF9F0; +LEOdrive_flag = 0x801006D4; +LEOtgt_param = 0x801006E0; +leoDiskStack = 0x801020D0; +LEOdisk_type = 0x801006D8; +LEO_country_code = 0x801006EC; +LEOrw_flags = 0x801006D6; +LEOc2_param = 0x80101080; +LEOC2_Syndrome = 0x80100940; +leoC2_Correction = 0x80053710; +leoC2_single_ecc = 0x8005379C; +leoC2_double_ecc = 0x80053870; +leoC2_3_ecc = 0x80053AF0; +leoC2_4_ecc = 0x80053ED8; +leoAlpha_mult = 0x80054774; +leoAlpha_div = 0x800547B8; +ganlog = 0x8007DD50; +glog = 0x8007DF50; +leoAnalize_asic_status = 0x80052D00; +leoChk_asic_ready = 0x80052E0C; +leoChk_cur_drvmode = 0x80053540; +leoChk_done_status = 0x80052EF4; +leoChk_err_retry = 0x80053430; +leoClrUA_MEDIUM_CHANGED = 0x8005360C; +leoClrUA_RESET = 0x800535F0; +leoClr_queue = 0x800551B0; +leoClr_reset = 0x80055258; +leoCommand = 0x80051224; +leoDetect_index_w = 0x800532C4; +leoDrive_reset = 0x80053580; +leoInitialize = 0x80051050; +leoInquiry = 0x800529C0; +leoLba_to_phys = 0x80054D60; +leoLba_to_vzone = 0x80054F54; +leoMode_sel = 0x80054C10; +leoRead = 0x80052550; +leoReadDiskId = 0x80052B70; +leoReadTimer = 0x80055570; +leoRead_common = 0x8005257C; +leoRead_system_area = 0x8005233C; +leoRecal_i = 0x800532EC; +leoRecal_w = 0x80053314; +leoRecv_event_mesg = 0x800533DC; +leoInitUnit_atten = 0x80053640; +leoRetUnit_atten = 0x800535BC; +leoChkUnit_atten = 0x800535B0; +leoRezero = 0x80054FB0; +leoSeek_i = 0x8005333C; +leoSeek_w = 0x800533A0; +leoSend_asic_cmd_i = 0x800530A8; +leoSend_asic_cmd_w = 0x800531A0; +leoSend_asic_cmd_w_nochkDiskChange = 0x800531D8; +leoSetTimer = 0x8005562C; +leoSetUA_MEDIUM_CHANGED = 0x80053628; +leoSet_mseq = 0x80054970; +leoStart_stop = 0x80054B20; +leoTest_unit_rdy = 0x80056630; +leoTranslate = 0x800552D0; +leoWait_mecha_cmd_done = 0x80053150; +leointerrupt = 0x800514C0; +read_write_track = 0x80051650; +leoChk_mecha_int = 0x80051C4C; +leosetup_BM = 0x80051CB4; +leochk_err_reg = 0x80051D9C; +LEOwrite_pointer = 0x801006C4; +LEOc2ctrl_que_buf = 0x801006F0; +LEOasic_bm_ctl_shadow = 0x801006CC; +LEOasic_seq_ctl_shadow = 0x801006D0; +LeoBootGame = 0x8000B8B0; // defined:true +__LeoBootGame2 = 0x8000B9EC; +__LeoBootGame3 = 0x8000BD10; +leomain = 0x80051EC0; +Main = 0x80000530; +set_watch_lohi = 0x8000B7D0; +trigger_fault = 0x8000B7E0; +crash_screen_sleep = 0x800082C0; +crash_screen_copy_to_buf = 0x80008810; +gCrashScreenCharToGlyph = 0x800695B0; +crash_screen_printf = 0x80008834; +crash_screen_print_fpr = 0x800088F0; +crash_screen_print_fpcsr = 0x80008974; +gFpcsrDesc = 0x80069778; +crash_screen_get_faulted_thread = 0x80008E48; +crash_screen_printf_with_bg = 0x80009020; +crash_screen_draw_rect = 0x80008444; +crash_screen_draw_glyph = 0x8000854C; +gCrashScreenFont = 0x80069630; +crash_screen_thread_entry = 0x80008EB4; +crash_screen_init = 0x80008F7C; +crash_screen_set_draw_info = 0x80008F54; +crash_screen_draw = 0x80008A00; +gFaultCauses = 0x80069730; +osMemSize = 0x80000318; +gSegments = 0x800A5870; +gFragments = 0x800A58F0; +Memmap_SetSegmentMap = 0x80001CE0; +Memmap_GetSegmentBaseVaddr = 0x80001CFC; +Memmap_GetSegmentVaddr = 0x80001D10; +Memmap_GetSegmentVaddrMask = 0x80001D60; +Memmap_ClearSegmentMemmap = 0x80001D9C; +Memmap_SetSegments = 0x80001DB8; +Memmap_RelocateFragment = 0x80001E50; +Memmap_SetFragmentMap = 0x800020B0; +Memmap_GetFragmentBaseVaddr = 0x800020CC; +Memmap_GetFragmentVaddr = 0x800020E0; +Memmap_GetFragmentVaddrMask = 0x80002144; +Memmap_ClearFragmentMemmap = 0x8000218C; +Memmap_GetLoadedFragmentVaddr = 0x800021A8; +gControllerStatuses = 0x800A73D0; +gControllerPads = 0x800A73E0; +gSIEventMesgQueue = 0x800A73B0; +gControllerBits = 0x800A73C8; +gEepromProbe = 0x800A73C9; +gSIEventMesgBuf = 0x800A73F8; +gEepromMesgQueue = 0x800A7400; +gEepromMesgBuf = 0x800A73FC; +Cont_InitControllers = 0x80005830; +Cont_AdjustAnalogStick = 0x80005950; +Cont_StartReadInputs = 0x80005A84; +Cont_ReadInputs = 0x80005AB0; +Cont_GetControllerBits = 0x80005B90; +Cont_IsEepromPresent = 0x80005B9C; +Cont_AttemptReadEeprom = 0x80005BAC; +Cont_AttemptWriteEeprom = 0x80005C64; +Cont_BlockEepromQueue = 0x80005D1C; +Cont_NoBlockEepromQueue = 0x80005D48; +Cont_InitEepromQueue = 0x80005D74; +Cont_SetupControllers = 0x80005DB8; +HAL_Strcpy = 0x8000A530; +HAL_Strcpy2 = 0x8000A560; +HAL_Strcmp = 0x8000A5B8; +HAL_Memset = 0x8000A5FC; +.L8120A860 = 0x8120A860; +D_8780FA30 = 0x8780FA30; +D_8780FA34 = 0x8780FA34; +D_87906044 = 0x87906044; +D_87906048 = 0x87906048; +D_87906060 = 0x87906060; +D_87906064 = 0x87906064; +D_87906068 = 0x87906068; +D_8790606C = 0x8790606C; +D_87906070 = 0x87906070; +D_87906094 = 0x87906094; +D_87906098 = 0x87906098; +D_879060A4 = 0x879060A4; +D_879060C4 = 0x879060C4; +D_879060C8 = 0x879060C8; +gShowCPUProfiler = 0x80068BC0; +gShowMEMProfiler = 0x80068BC4; +draw_profiler_bar_cpu = 0x8000948C; +profiler_log_gfx_time = 0x80009288; +profiler_log_vblank_time = 0x8000932C; +gDisplayListHead = 0x800A7420; +draw_profiler_mode_1 = 0x800097D0; +draw_profiler_mode_0 = 0x80009A38; +draw_profiler = 0x80009F8C; +HAL_Printf = 0x80008154; +print_profiler_metrics = 0x8000A0FC; +clear_profiler_data = 0x8000A21C; +draw_profiler_bar_cpu_keep_max = 0x80009630; +Yay0_Decompress = 0x8000B7F0; +Util_ConvertAddrToVirtAddr = 0x80002E80; +Util_Memcpy = 0x80002F28; +Util_DrawRect = 0x8000302C; +Util_Memclear = 0x8000330C; +UnkHeapThing = 0x80104BC0; +gMemPool = 0x800A6070; +main_pool_alloc_from_pool = 0x80002380; +main_pool_get_available = 0x80002764; +main_pool_free = 0x80002430; +main_pool_set_func = 0x80002A14; +main_pool_alloc_with_func = 0x8000254C; +main_pool_alloc = 0x800025C4; +main_pool_try_free = 0x80002620; +main_pool_realloc = 0x80002680; +main_pool_push_state = 0x80002784; +main_pool_pop_state = 0x80002838; +main_pool_get_pool = 0x80002A30; +main_pool_get_block_dist = 0x80002A24; +main_pool_search = 0x80002960; +text_bss_VRAM = 0x8007ED80; +gHeap = 0x80104BB0; +gMainPool = 0x800A60B0; +mem_pool_try_init = 0x80002A40; +mem_pool_init = 0x80002A88; +mem_pool_alloc = 0x80002AF8; +mem_pool_free = 0x80002BD0; +Util_DrawMemProfiler = 0x8000310C; +Util_Malloc = 0x80002FDC; +Util_Free = 0x80003004; +MathUtil_Atan2Lookup = 0x8000A300; +MathUtil_Atan2s = 0x8000A360; +gArctanTable = 0x8006E7F0; +gSineTable = 0x800697F0; +gCosineTable = 0x8006A7F0; +MathUtil_Random16 = 0x8000A4D4; +MathUtil_Random_ZeroOne = 0x8000A4F8; +SoftReset_ClearLines320 = 0x800054A0; +SoftReset_ClearLines640 = 0x8000551C; +gSoftResetLineNum = 0x800A7300; +gSoftResetRed = 0x800A7308; +gSoftResetGreen = 0x800A730C; +gSoftResetBlue = 0x800A7310; +SoftReset_Thread = 0x80005674; +SoftReset_CreateThread = 0x800057C0; +func_80004DB4 = 0x80004DB4; //defined:true +gControllers = 0x800A7320; //defined:true +fragment1_ROM_START = 0x7F980; // defined:true +fragment1_misc_yay0_ROM_START = 0xADC80; // defined:true +fragment2_ROM_START = 0x107FA0; // defined:true +fragment3_ROM_START = 0x118990; // defined:true +fragment4_ROM_START = 0x11F560; // defined:true +fragment5_ROM_START = 0x120920; // defined:true +fragment6_ROM_START = 0x120A10; // defined:true +fragment7_ROM_START = 0x1278D0; // defined:true +fragment8_ROM_START = 0x12DF40; // defined:true +fragment9_ROM_START = 0x1329E0; // defined:true +fragment10_ROM_START = 0x134680; // defined:true +fragment11_ROM_START = 0x138F20; // defined:true +fragment12_ROM_START = 0x142B10; // defined:true +fragment13_ROM_START = 0x143700; // defined:true +fragment14_ROM_START = 0x1442E0; // defined:true +fragment15_ROM_START = 0x14CA50; // defined:true +fragment16_ROM_START = 0x1589E0; // defined:true +fragment17_ROM_START = 0x15F990; // defined:true +fragment18_ROM_START = 0x1708B0; // defined:true +fragment19_ROM_START = 0x17FB40; // defined:true +fragment20_ROM_START = 0x1802B0; // defined:true +fragment21_ROM_START = 0x185A10; // defined:true +fragment22_ROM_START = 0x191660; // defined:true +fragment23_ROM_START = 0x1A8570; // defined:true +fragment24_ROM_START = 0x1CE9E0; // defined:true +fragment25_ROM_START = 0x1EA640; // defined:true +fragment26_ROM_START = 0x1EA860; // defined:true +fragment27_ROM_START = 0x1F7C90; // defined:true +fragment28_ROM_START = 0x214900; // defined:true +fragment29_ROM_START = 0x23C250; // defined:true +fragment29_misc_1_ROM_START = 0x23D500; // defined:true +fragment29_misc_2_ROM_START = 0x23FB60; // defined:true +fragment29_misc_3_ROM_START = 0x24F430; // defined:true +fragment30_ROM_START = 0x255230; // defined:true +fragment31_ROM_START = 0x2552C0; // defined:true +fragment32_ROM_START = 0x25A740; // defined:true +fragment33_ROM_START = 0x25B0D0; // defined:true +fragment33_misc_ROM_START = 0x25F440; // defined:true +fragment34_ROM_START = 0x261F70; // defined:true +fragment35_ROM_START = 0x271260; // defined:true +fragment36_ROM_START = 0x2717E0; // defined:true +fragment37_ROM_START = 0x272830; // defined:true +fragment38_ROM_START = 0x275CE0; // defined:true +fragment39_ROM_START = 0x27BCA0; // defined:true +fragment40_ROM_START = 0x285DC0; // defined:true +fragment41_ROM_START = 0x287EB0; // defined:true +fragment42_ROM_START = 0x29DD30; // defined:true +fragment43_ROM_START = 0x2A1B30; // defined:true +fragment44_ROM_START = 0x2A4DF0; // defined:true +fragment45_ROM_START = 0x2A9790; // defined:true +fragment46_ROM_START = 0x2AD270; // defined:true +fragment47_ROM_START = 0x2AD8F0; // defined:true +fragment48_ROM_START = 0x2B3F70; // defined:true +fragment49_ROM_START = 0x2B46F0; // defined:true +fragment50_ROM_START = 0x2B5350; // defined:true +fragment51_ROM_START = 0x2BD0A0; // defined:true +fragment52_ROM_START = 0x2BD130; // defined:true +fragment53_ROM_START = 0x2BD6E0; // defined:true +fragment54_ROM_START = 0x2BDAC0; // defined:true +fragment55_ROM_START = 0x2BED20; // defined:true +fragment56_ROM_START = 0x2C3220; // defined:true +fragment57_ROM_START = 0x2C49D0; // defined:true +fragment58_ROM_START = 0x2CF350; // defined:true +fragment59_ROM_START = 0x2D24C0; // defined:true +fragment60_ROM_START = 0x2D5CB0; // defined:true +fragment61_ROM_START = 0x2D7890; // defined:true +fragment62_ROM_START = 0x2EA8C0; // defined:true +fragment63_ROM_START = 0x394100; // defined:true +fragment64_ROM_START = 0x3AEE50; // defined:true +fragment65_ROM_START = 0x3B2AE0; // defined:true +fragment66_ROM_START = 0x3B6130; // defined:true +fragment67_ROM_START = 0x3B8530; // defined:true +fragment68_ROM_START = 0x3B8570; // defined:true +fragment69_ROM_START = 0x3B8600; // defined:true +fragment70_ROM_START = 0x3B8690; // defined:true +fragment71_ROM_START = 0x3B8720; // defined:true +fragment72_ROM_START = 0x3B87B0; // defined:true +fragment73_ROM_START = 0x3B8840; // defined:true +fragment74_ROM_START = 0x3B88D0; // defined:true +fragment75_ROM_START = 0x3B8960; // defined:true +fragment76_ROM_START = 0x3B9590; // defined:true +fragment77_ROM_START = 0x3B9620; // defined:true +_3B96B0_ROM_START = 0x3B96B0; // defined:true +_3BA190_ROM_START = 0x3BA190; // defined:true +_3CB130_ROM_START = 0x3CB130; // defined:true +_45B580_ROM_START = 0x45B580; // defined:true +_4A21C0_ROM_START = 0x4A21C0; // defined:true +_4BD6B0_ROM_START = 0x4BD6B0; // defined:true +_4BE810_ROM_START = 0x4BE810; // defined:true +_4D1330_ROM_START = 0x4D1330; // defined:true +_4EB0C0_ROM_START = 0x4EB0C0; // defined:true +_5046B0_ROM_START = 0x5046B0; // defined:true +_52ABA0_ROM_START = 0x52ABA0; // defined:true +_52F6D0_ROM_START = 0x52F6D0; // defined:true +_533B20_ROM_START = 0x533B20; // defined:true +_56E7D0_ROM_START = 0x56E7D0; // defined:true +_5C7A70_ROM_START = 0x5C7A70; // defined:true +_5C7AD0_ROM_START = 0x5C7AD0; // defined:true +_5F6790_ROM_START = 0x5F6790; // defined:true +_5F92A0_ROM_START = 0x5F92A0; // defined:true +_5FFC30_ROM_START = 0x5FFC30; // defined:true +_613110_ROM_START = 0x613110; // defined:true +_6230D0_ROM_START = 0x6230D0; // defined:true +_66E1D0_ROM_START = 0x66E1D0; // defined:true +_66F540_ROM_START = 0x66F540; // defined:true +_66FD80_ROM_START = 0x66FD80; // defined:true +_675FA0_ROM_START = 0x675FA0; // defined:true +_696350_ROM_START = 0x696350; // defined:true +_69D090_ROM_START = 0x69D090; // defined:true +_6A9750_ROM_START = 0x6A9750; // defined:true +_6AE1D0_ROM_START = 0x6AE1D0; // defined:true +_6B0FB0_ROM_START = 0x6B0FB0; // defined:true +_6B4F00_ROM_START = 0x6B4F00; // defined:true +_6C1AB0_ROM_START = 0x6C1AB0; // defined:true +_6C4CE0_ROM_START = 0x6C4CE0; // defined:true +_6C4E50_ROM_START = 0x6C4E50; // defined:true +_6CA730_ROM_START = 0x6CA730; // defined:true +_6E2FC0_ROM_START = 0x6E2FC0; // defined:true +_6E8910_ROM_START = 0x6E8910; // defined:true +_6EB340_ROM_START = 0x6EB340; // defined:true +_6EC4D0_ROM_START = 0x6EC4D0; // defined:true +_6ECE80_ROM_START = 0x6ECE80; // defined:true +_701E50_ROM_START = 0x701E50; // defined:true +_70D3A0_ROM_START = 0x70D3A0; // defined:true +_7820E0_ROM_START = 0x7820E0; // defined:true +_783760_ROM_START = 0x783760; // defined:true +_798CD0_ROM_START = 0x798CD0; // defined:true +_7994B0_ROM_START = 0x7994B0; // defined:true +_79AFB0_ROM_START = 0x79AFB0; // defined:true +_79AFB0_ROM_END = 0x79B8F0; // defined:true +abs_asm = 0x8000B8A0; // defined:true +D_86002B84 = 0x86002B84; // size:3 +D_86002B88 = 0x86002B88; // size:3 +F3DEX2_bin = 0x80066090; +F3DEX2_data_bin = 0x8007E650; diff --git a/undefined_syms.txt b/linker_scripts/us/undefined_syms.ld similarity index 87% rename from undefined_syms.txt rename to linker_scripts/us/undefined_syms.ld index c6ce22c..8d5070a 100644 --- a/undefined_syms.txt +++ b/linker_scripts/us/undefined_syms.ld @@ -6,8 +6,6 @@ __osRunningThread = 0x80079630; D_80080001 = 0x80080001; D_80083ACC = 0x80083ACC; __osGlobalIntMask = 0x800796B0; -CartRomHandle = 0x80102430; -LeoDiskHandle = 0x801024A8; piThreadStack = 0x801026D0; LEOZONE_OUTERCYL_TBL = 0x8007DD08; LEOinterruptThreadStack = 0x80100638; diff --git a/linker_scripts/us/unused_syms.ld b/linker_scripts/us/unused_syms.ld new file mode 100644 index 0000000..c226f65 --- /dev/null +++ b/linker_scripts/us/unused_syms.ld @@ -0,0 +1,6 @@ +// Force the inclusion of unused archive files +EXTERN(osGetMemSize); +ASSERT(DEFINED(osGetMemSize), "Error: osGetMemSize was not linked"); + +EXTERN(guPositionF); +ASSERT(DEFINED(guPositionF), "Error: guPositionF was not linked"); diff --git a/requirements.txt b/requirements.txt index ddc322b..8546f01 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,10 +3,14 @@ PyYAML pylibyaml pypng colorama -spimdisasm>=1.27.0 rabbitizer>=1.2.0 pygfxd tqdm intervaltree n64img crunch64 +splat64[mips]==0.25.0 +mapfile-parser>=2.4.0,<3.0.0 +libyaz0 +ipl3checksum>=1.2.0,<2.0.0 +spimdisasm>=1.16.3,<2.0.0 diff --git a/src/11BA0.c b/src/11BA0.c index 54d211e..48ead59 100644 --- a/src/11BA0.c +++ b/src/11BA0.c @@ -1,77 +1,77 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80010FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80010FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80010FDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80010FDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_8001103C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_8001103C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800110E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800110E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800111A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800111A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800111FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800111FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800112BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800112BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800113AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800113AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800113F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800113F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_8001156C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_8001156C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800115F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800115F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800116C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800116C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800117A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800117A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800118D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800118D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011ABC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011ABC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011B94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011B94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80012044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80012044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80012094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80012094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800120DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800120DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80012120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80012120.s") diff --git a/src/12D80.c b/src/12D80.c index b612dd9..4122632 100644 --- a/src/12D80.c +++ b/src/12D80.c @@ -1,146 +1,146 @@ -#include "common.h" +#include "global.h" #include "12D80.h" -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800121C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800121C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800122B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800122B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800123D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800123D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800124D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800124D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800131B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800131B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800133D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800133D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013764.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013764.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001378C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001378C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800138F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800138F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001395C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001395C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800139E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800139E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013C14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013C14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800142BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800142BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800143C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800143C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800148D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800148D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001533C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001533C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001550C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001550C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001554C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001554C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001587C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001587C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015DD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015DD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800160E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800160E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001638C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001638C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001660C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001660C.s") diff --git a/src/12D80.h b/src/12D80.h index 1ed5d4f..5ccd5ad 100644 --- a/src/12D80.h +++ b/src/12D80.h @@ -1,7 +1,7 @@ #ifndef _12D80_H_ #define _12D80_H_ -#include "common.h" +#include "global.h" void func_80015094(unk_D_86002F34*); void func_80015348(void); diff --git a/src/17300.c b/src/17300.c index edfe274..81c9561 100644 --- a/src/17300.c +++ b/src/17300.c @@ -1,42 +1,42 @@ -#include "common.h" +#include "global.h" #include "17300.h" -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800167B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800167B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800171A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800171A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800173CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800173CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800173DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800173DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800174E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800174E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017514.s") diff --git a/src/17300.h b/src/17300.h index 1d172b5..c38621d 100644 --- a/src/17300.h +++ b/src/17300.h @@ -1,7 +1,7 @@ #ifndef _17300_H_ #define _17300_H_ -#include "common.h" +#include "global.h" void func_800173CC(unk_D_86002F58_004*); s32 func_80017514(unk_D_86002F58_004*); diff --git a/src/18140.c b/src/18140.c index f2035a7..153d6cf 100644 --- a/src/18140.c +++ b/src/18140.c @@ -1,25 +1,25 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800175D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800175D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800175E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800175E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800176BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800176BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800176DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800176DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017798.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017798.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_8001781C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_8001781C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_8001783C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_8001783C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017858.s") diff --git a/src/18480.c b/src/18480.c index 42653c9..d138c8a 100644 --- a/src/18480.c +++ b/src/18480.c @@ -1,85 +1,84 @@ -#include "common.h" +#include "global.h" #include "18480.h" -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001799C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001799C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800179C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800179C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017BBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017BBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017C48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017C48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017F1C.s") -void func_80017F5C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017F5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800180BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800180BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800180D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800180D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001812C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001812C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001819C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001819C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800181FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800181FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001824C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001824C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001829C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001829C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800183C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800183C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800185A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800185A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001878C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001878C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800188C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800188C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800189B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800189B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018AD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018B70.s") diff --git a/src/18480.h b/src/18480.h index 55c8141..4258440 100644 --- a/src/18480.h +++ b/src/18480.h @@ -1,7 +1,7 @@ #ifndef _18480_H_ #define _18480_H_ -#include "common.h" +#include "global.h" #include "src/memory.h" s32 func_80018B70(MemoryBlock*, uintptr_t); diff --git a/src/19840.c b/src/19840.c index 2a4f2cf..7777f9a 100644 --- a/src/19840.c +++ b/src/19840.c @@ -1,64 +1,64 @@ -#include "common.h" +#include "global.h" #include "19840.h" -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018DE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018DE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018E7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018E7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018FF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018FF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_800191B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_800191B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_800196DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_800196DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_8001987C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_8001987C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_800198E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_800198E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019C08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019C08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019CA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019CA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019F0C.s") diff --git a/src/19840.h b/src/19840.h index 4fe4814..e520ac6 100644 --- a/src/19840.h +++ b/src/19840.h @@ -1,7 +1,7 @@ #ifndef _19840_H_ #define _19840_H_ -#include "common.h" +#include "global.h" #include "src/memory.h" void func_8001987C(void); diff --git a/src/1AB70.c b/src/1AB70.c index 782a8d3..c7ecc2a 100644 --- a/src/1AB70.c +++ b/src/1AB70.c @@ -1,63 +1,63 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_80019F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_80019F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_80019F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_80019F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A1D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A1D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A46C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A46C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A6D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A6D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AA18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001ABAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001ABAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AD90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AD90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AFD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AFD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B0DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B0DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B1FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B1FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B2D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B6BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B6BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B6C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B6C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B9D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B9D4.s") diff --git a/src/1C720.c b/src/1C720.c index 1e992a2..b54305a 100644 --- a/src/1C720.c +++ b/src/1C720.c @@ -1,38 +1,38 @@ -#include "common.h" +#include "global.h" #include "1C720.h" -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BB20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BB20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BBC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BBC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BC34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BC34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BCF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BCF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BD04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BD04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BD9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BD9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BEE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BEE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C07C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C07C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C1E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C1E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C2D8.s") diff --git a/src/1C720.h b/src/1C720.h index 418eea1..a18dabf 100644 --- a/src/1C720.h +++ b/src/1C720.h @@ -1,7 +1,7 @@ #ifndef _1C720_H_ #define _1C720_H_ -#include "common.h" +#include "global.h" void func_8001BB20(void); void func_8001BB58(unk_D_86002F58_004*); diff --git a/src/1CF30.c b/src/1CF30.c index d26b789..a0214f4 100644 --- a/src/1CF30.c +++ b/src/1CF30.c @@ -1,94 +1,94 @@ -#include "common.h" +#include "global.h" #include "1CF30.h" -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C4E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C4E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C6AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C6AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C8C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C8C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001CADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001CADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001CCF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001CCF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001CF10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001CF10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D12C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D12C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001DBDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001DBDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E6E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E6E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E730.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E7C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E7C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E7D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E7D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E94C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E94C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E9CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E9CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E9F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E9F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001EAD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001EAD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001EBE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001EBE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001EC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001EC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001ECB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001ECB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F1C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F1C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F1E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F1E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F2E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F2E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F36C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F36C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F4C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F4C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F5B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F5B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F6E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F6E8.s") diff --git a/src/1CF30.h b/src/1CF30.h index 28a31c1..f315bdd 100644 --- a/src/1CF30.h +++ b/src/1CF30.h @@ -1,7 +1,7 @@ #ifndef _1CF30_H_ #define _1CF30_H_ -#include "common.h" +#include "global.h" s32 func_8001E94C(s32, s32); void func_8001E9CC(void); diff --git a/src/20330.c b/src/20330.c index f799de4..f2676b6 100644 --- a/src/20330.c +++ b/src/20330.c @@ -1,9 +1,8 @@ -#include "common.h" +#include "global.h" #include "20330.h" -void func_8001F730(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/20330/func_8001F730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20330/func_8001F738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20330/func_8001F738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20330/func_8001F750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20330/func_8001F750.s") diff --git a/src/20330.h b/src/20330.h index fd47d0c..fb3c8e1 100644 --- a/src/20330.h +++ b/src/20330.h @@ -1,7 +1,7 @@ #ifndef _20330_H_ #define _20330_H_ -#include "common.h" +#include "global.h" void func_8001F730(void); diff --git a/src/20470.c b/src/20470.c index dede06b..4038b17 100644 --- a/src/20470.c +++ b/src/20470.c @@ -1,36 +1,36 @@ -#include "common.h" +#include "global.h" #include "20470.h" -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001F870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001F870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001F9D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001F9D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FB40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FB40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FCAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FCAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FE18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FE18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_800200B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_800200B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8002053C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8002053C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020678.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020678.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_800207FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_800207FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_800209B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_800209B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80021270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80021270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80021920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80021920.s") diff --git a/src/20470.h b/src/20470.h index 8006d4a..45124ad 100644 --- a/src/20470.h +++ b/src/20470.h @@ -1,7 +1,7 @@ #ifndef _20470_H_ #define _20470_H_ -#include "common.h" +#include "global.h" void func_80020460(s32, s32, s32, s32, s32); diff --git a/src/225A0.c b/src/225A0.c index a5a4f30..77a5060 100644 --- a/src/225A0.c +++ b/src/225A0.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/225A0/func_800219A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/225A0/func_800219A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/225A0/func_800219FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/225A0/func_800219FC.s") diff --git a/src/22630.c b/src/22630.c index ec71e12..cd79cbd 100644 --- a/src/22630.c +++ b/src/22630.c @@ -1,230 +1,229 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021D9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021D9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022084.s") -void func_800220C4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800220C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800220CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800220CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002240C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002240C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800224B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800224B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800226C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800226C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800228B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800228B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800228F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800228F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002311C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002311C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800232A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800232A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800232D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800232D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800233F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800233F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800237C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800237C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800238D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800238D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800240A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800240A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002431C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002431C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800243D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800243D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002447C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002447C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800244F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800244F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800246F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800246F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800247C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800247C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800249B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800249B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800249FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800249FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800250E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800250E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002513C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002513C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800251B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800251B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002526C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002526C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800252CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800252CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002539C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002539C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800253C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800253C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800253F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800253F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002564C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002564C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800256F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800256F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025AD0.s") diff --git a/src/26820.c b/src/26820.c index fc356d2..b7c105b 100644 --- a/src/26820.c +++ b/src/26820.c @@ -1,127 +1,127 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025DE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025DE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025EF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025EF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800262DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800262DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800264DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800264DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002685C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002685C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002707C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002707C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800270AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800270AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800272BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800272BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800275E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800275E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800276F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800276F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002782C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002782C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002797C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002797C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800280C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800280C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800280D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800280D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002816C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002816C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002817C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002817C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800281D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800281D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002847C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002847C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800284B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800284B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800286D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800286D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002873C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002873C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800288F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800288F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800289AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800289AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028C48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028C48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028EB8.s") diff --git a/src/29BA0.c b/src/29BA0.c index c88603a..975947d 100644 --- a/src/29BA0.c +++ b/src/29BA0.c @@ -1,7 +1,7 @@ #include #include "memory.h" -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80028FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80028FA0.s") s32 func_80029008(s32 arg0, s32 romStart, s32 romEnd, s32 arg3, s32 arg4) { s32 result; @@ -13,75 +13,74 @@ s32 func_80029008(s32 arg0, s32 romStart, s32 romEnd, s32 arg3, s32 arg4) { return result; } -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002908C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002908C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800290B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800290B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800290E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800290E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800291E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800291E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800293CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800293CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800296AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800296AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800296E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800296E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800298D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800298D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029BC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A06C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A06C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A8A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A8A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002AAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002AAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002ADE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002ADE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002AF38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002AF38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B07C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B07C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B180.s") -void func_8002B244(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B24C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B24C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B330.s") diff --git a/src/2C1C0.c b/src/2C1C0.c index 1c0dbe7..b407358 100644 --- a/src/2C1C0.c +++ b/src/2C1C0.c @@ -1,39 +1,39 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B5C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B5C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B5EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B5EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B6BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B6BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BA34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BA34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BB7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BB7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BC64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BC64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BD14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BD14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BD60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BD60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BE70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BE70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BEC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BEC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C5E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C5E8.s") diff --git a/src/2D340.c b/src/2D340.c index 667cc37..3768803 100644 --- a/src/2D340.c +++ b/src/2D340.c @@ -1,49 +1,49 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C7AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C7AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C7D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C7D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CA00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CA00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CAAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CAAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CBB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CBB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CBC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CBC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CC04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CC04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CC2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CC2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CC80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CC80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CD58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CD58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CE34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CE34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D1AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D1AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D28C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D28C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D3F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D3F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D444.s") diff --git a/src/2E110.c b/src/2E110.c index 318c1f9..e8cff39 100644 --- a/src/2E110.c +++ b/src/2E110.c @@ -1,16 +1,16 @@ -#include "common.h" +#include "global.h" #include "2E110.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D5AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D5AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D7C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D7C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D80C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D80C.s") diff --git a/src/2E110.h b/src/2E110.h index 1570981..93777f7 100644 --- a/src/2E110.h +++ b/src/2E110.h @@ -1,7 +1,7 @@ #ifndef _2E110_H_ #define _2E110_H_ -#include "common.h" +#include "global.h" s32 func_8002D7C0(s32, s32, s32, s32); diff --git a/src/2E460.c b/src/2E460.c index 427d2b0..d91f360 100644 --- a/src/2E460.c +++ b/src/2E460.c @@ -1,59 +1,59 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002D860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002D860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002D8C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002D8C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DCB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DCB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DD64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DD64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DD98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DD98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DE44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DE44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E0F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E0F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E5A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E5A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E8E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E8E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EBD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EBD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EC08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EC08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EC1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EC1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ECDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ECDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ED08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ED08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ED40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ED40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ED78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ED78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EDEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EDEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EE1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EE1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EEA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EEA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EF18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EF18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EF44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EF44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002F1C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002F1C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002F264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002F264.s") diff --git a/src/2FEA0.c b/src/2FEA0.c index 451b63f..5f8214b 100644 --- a/src/2FEA0.c +++ b/src/2FEA0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2FEA0/func_8002F2A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2FEA0/func_8002F2A0.s") diff --git a/src/30640.c b/src/30640.c index 3275c1b..2cbca08 100644 --- a/src/30640.c +++ b/src/30640.c @@ -1,79 +1,79 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FA40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FA40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800300CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800300CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8003013C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8003013C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800301A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800301A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800302A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800302A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800303C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800303C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8003107C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8003107C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800314BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800314BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800317D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800317D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8003181C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8003181C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031910.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031910.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031BE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031BE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80032034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80032034.s") diff --git a/src/32D10.c b/src/32D10.c index 301ed01..f8baba6 100644 --- a/src/32D10.c +++ b/src/32D10.c @@ -1,22 +1,22 @@ -#include "common.h" +#include "global.h" #include "32D10.h" -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800325AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800325AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800325B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800325B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800325E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800325E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_8003260C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_8003260C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800327CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800327CC.s") diff --git a/src/32D10.h b/src/32D10.h index 36a453e..3fdbb9c 100644 --- a/src/32D10.h +++ b/src/32D10.h @@ -1,7 +1,7 @@ #ifndef _32D10_H_ #define _32D10_H_ -#include "common.h" +#include "global.h" void func_80032110(u8, s32); void func_80032244(u8, s16); diff --git a/src/334D0.c b/src/334D0.c index f5006b0..083f8c1 100644 --- a/src/334D0.c +++ b/src/334D0.c @@ -1,23 +1,23 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_800328D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_800328D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_800328D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_800328D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_800328E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_800328E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032F94.s") diff --git a/src/33E30.c b/src/33E30.c index 72be973..0092ecc 100644 --- a/src/33E30.c +++ b/src/33E30.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/33E30/func_80033230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33E30/func_80033230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33E30/func_80033264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33E30/func_80033264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33E30/func_80033284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33E30/func_80033284.s") diff --git a/src/33FE0.c b/src/33FE0.c index 6b8c8aa..7e88456 100644 --- a/src/33FE0.c +++ b/src/33FE0.c @@ -1,88 +1,87 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800333E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800333E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_8003342C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_8003342C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800334C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800334C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800336F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800336F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800337D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800337D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033890.s") -void func_800338B0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800338B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800338B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800338B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800338D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800338D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033D1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033D1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033D44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033D44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034824.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034824.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800350E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800350E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800355A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800355A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800357F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800357F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800359FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800359FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035C4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035C4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035FA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035FA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800361C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800361C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_8003658C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_8003658C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800366A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800366A4.s") diff --git a/src/37370.c b/src/37370.c index 71e6d14..50c5d9d 100644 --- a/src/37370.c +++ b/src/37370.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/37370/func_80036770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/37370/func_80036770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/37370/func_80036790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/37370/func_80036790.s") diff --git a/src/373A0.c b/src/373A0.c index 9e69e27..f49f8b8 100644 --- a/src/373A0.c +++ b/src/373A0.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_800367A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_800367A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_80037234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_80037234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_80037340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_80037340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_80037360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_80037360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_800373D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_800373D8.s") diff --git a/src/38BB0.c b/src/38BB0.c index 3275b4e..a53a5c1 100644 --- a/src/38BB0.c +++ b/src/38BB0.c @@ -1,209 +1,209 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80037FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80037FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80037FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80037FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003802C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003802C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800381B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800381B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003827C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003827C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800382AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800382AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003844C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003844C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800385D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800385D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800387B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800387B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800387C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800387C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038864.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038864.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800388B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800388B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800388C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800388C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800389C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800389C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038B68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038B68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003916C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003916C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800392A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800392A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800393DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800393DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800395FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800395FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800396D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800396D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003979C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003979C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800397BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800397BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003986C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003986C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800398F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800398F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039D58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039D58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039F28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039F28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A10C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A10C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A2F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A2F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A39C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A39C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A4D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A4D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A6D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A6D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003AD58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003AD58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B00C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B00C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B0DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B0DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B2B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B2B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B8A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B8A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B94C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B94C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BA44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BA44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BBA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BBA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BD2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BD2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BEF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BEF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BFF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BFF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C1D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C1D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C2F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C2F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C35C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C35C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C408.s") diff --git a/src/3D140.c b/src/3D140.c index a799814..2f25e2c 100644 --- a/src/3D140.c +++ b/src/3D140.c @@ -1,87 +1,87 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003C540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003C540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003C8DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003C8DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003CADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003CADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D32C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D32C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D494.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D494.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D4A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D4A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D54C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D54C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D6B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D6B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D6DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D6DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D918.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D918.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003DB84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003DB84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003EB40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003EB40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F1AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F1AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F4C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F4C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80040A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80040A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800414B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800414B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8004153C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8004153C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800416BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800416BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041E40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800420C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800420C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800420F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800420F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80042158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80042158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80042850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80042850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800428FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800428FC.s") diff --git a/src/3FB0.c b/src/3FB0.c index 41ab347..f028afc 100644 --- a/src/3FB0.c +++ b/src/3FB0.c @@ -1,37 +1,37 @@ #include #include "memory.h" -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800033B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800033B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800033C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800033C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003648.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003648.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003D64.s") void* func_80003DC4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { u32* addr; @@ -71,15 +71,15 @@ void* func_80003DC4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { return ret; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003F54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003F54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800040EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800040EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800041C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800041C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004200.s") s32 func_80004258(s32 id, s32 arg1, s32 arg2, s32 arg3) { s32 vaddr = func_80003DC4(arg1, arg2, arg3, 0); @@ -91,11 +91,11 @@ s32 func_80004258(s32 id, s32 arg1, s32 arg2, s32 arg3) { return vaddr; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800042E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800042E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800043BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800043BC.s") void* func_80004454(s32 arg0, uintptr_t romStart, uintptr_t romEnd) { void* addr = func_80003DC4(romStart, romEnd, 0, 0); @@ -106,7 +106,7 @@ void* func_80004454(s32 arg0, uintptr_t romStart, uintptr_t romEnd) { return addr; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800044A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800044A8.s") void* func_800044F4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { u32* ret; @@ -159,14 +159,14 @@ void* func_800044F4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { return ret; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800047A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800047A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800047C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800047C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_8000484C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_8000484C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_8000495C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_8000495C.s") diff --git a/src/3FB0.h b/src/3FB0.h index a904148..77d64c4 100644 --- a/src/3FB0.h +++ b/src/3FB0.h @@ -1,7 +1,7 @@ #ifndef _3FB0_H_ #define _3FB0_H_ -#include "common.h" +#include "global.h" void* func_80003DC4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3); s32 func_80004258(s32 id, s32 arg1, s32 arg2, s32 arg3); diff --git a/src/43520.c b/src/43520.c index ac346b5..8964441 100644 --- a/src/43520.c +++ b/src/43520.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" void func_800491C0(s32 arg0); void func_8004FD90(void); diff --git a/src/435B0.c b/src/435B0.c index 59b9779..72ece79 100644 --- a/src/435B0.c +++ b/src/435B0.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" typedef struct { /* 0x00 */ char unk_00[0x16]; diff --git a/src/435D0.c b/src/435D0.c index 813e841..ed5a4e7 100644 --- a/src/435D0.c +++ b/src/435D0.c @@ -1,89 +1,89 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800429D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800429D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800430AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800430AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800431DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800431DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800431FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800431FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_8004327C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_8004327C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_8004340C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_8004340C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800434E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800434E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800435CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800435CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800435E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800435E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043708.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043708.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800437A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800437A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043C08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043C08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800441A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800441A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800441F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800441F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_8004473C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_8004473C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800448B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800448B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800449F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800449F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044A50.s") diff --git a/src/45720.c b/src/45720.c index 9874c2f..ccd594e 100644 --- a/src/45720.c +++ b/src/45720.c @@ -1,25 +1,25 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044EA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044EA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_800455DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_800455DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_800456D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_800456D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80045780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80045780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_800459E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_800459E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80045A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80045A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80045A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80045A68.s") diff --git a/src/46680.c b/src/46680.c index 15a9117..b9961ba 100644 --- a/src/46680.c +++ b/src/46680.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80046EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80046EF0.s") diff --git a/src/47B60.c b/src/47B60.c index 272196d..6bc3a7b 100644 --- a/src/47B60.c +++ b/src/47B60.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_80046F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_80046F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_80047500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_80047500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_800475A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_800475A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_800477D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_800477D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_80047958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_80047958.s") diff --git a/src/485C0.c b/src/485C0.c index 04317fe..78c2670 100644 --- a/src/485C0.c +++ b/src/485C0.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/485C0/func_800479C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/485C0/func_800479C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/485C0/func_80048014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/485C0/func_80048014.s") diff --git a/src/48C60.c b/src/48C60.c index 2942e37..edfb559 100644 --- a/src/48C60.c +++ b/src/48C60.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/48C60/func_80048060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/48C60/func_80048060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/48C60/func_80048464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/48C60/func_80048464.s") diff --git a/src/490A0.c b/src/490A0.c index 1a6b65e..738e65b 100644 --- a/src/490A0.c +++ b/src/490A0.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_800484A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_800484A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_800484C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_800484C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_800484E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_800484E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_80048574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_80048574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_80048580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_80048580.s") diff --git a/src/49790.c b/src/49790.c index e8aaa4f..6e39ec6 100644 --- a/src/49790.c +++ b/src/49790.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #include "49790.h" -#pragma GLOBAL_ASM("asm/nonmatchings/49790/func_80048B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49790/func_80048B90.s") diff --git a/src/49790.h b/src/49790.h index 750405e..f6c2cb1 100644 --- a/src/49790.h +++ b/src/49790.h @@ -1,7 +1,7 @@ #ifndef _49790_H_ #define _49790_H_ -#include "common.h" +#include "global.h" void func_80048B90(s32); diff --git a/src/49BA0.c b/src/49BA0.c index f77c6e1..0b25c08 100644 --- a/src/49BA0.c +++ b/src/49BA0.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/49BA0/func_80048FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49BA0/func_80048FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49BA0/func_800490CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49BA0/func_800490CC.s") diff --git a/src/49DC0.c b/src/49DC0.c index 8801895..9ba0b43 100644 --- a/src/49DC0.c +++ b/src/49DC0.c @@ -1,17 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800491C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800491C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800495F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800495F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049648.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049648.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800496AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800496AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800496E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800496E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049734.s") diff --git a/src/4A360.c b/src/4A360.c index 6afd492..23c953a 100644 --- a/src/4A360.c +++ b/src/4A360.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4A360/func_80049760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A360/func_80049760.s") diff --git a/src/4A3E0.c b/src/4A3E0.c index 56bf4e4..1120e86 100644 --- a/src/4A3E0.c +++ b/src/4A3E0.c @@ -1,25 +1,25 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_800497E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_800497E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004980C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004980C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_800498A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_800498A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049DF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049DF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004A474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004A474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004A89C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004A89C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004AC9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004AC9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004ACD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004ACD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004AD2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004AD2C.s") diff --git a/src/4B940.c b/src/4B940.c index e62ef47..ca3710d 100644 --- a/src/4B940.c +++ b/src/4B940.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4B940/func_8004AD40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4B940/func_8004AD40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4B940/func_8004ADB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4B940/func_8004ADB0.s") diff --git a/src/4BA90.c b/src/4BA90.c index ad9267f..b31c63c 100644 --- a/src/4BA90.c +++ b/src/4BA90.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004AE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004AE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004AF24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004AF24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004AF44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004AF44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004B094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004B094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004B154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004B154.s") diff --git a/src/4BDC0.c b/src/4BDC0.c index ca09d12..70e9857 100644 --- a/src/4BDC0.c +++ b/src/4BDC0.c @@ -1,14 +1,14 @@ -#include "common.h" +#include "global.h" #include "4BDC0.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004B1C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004B1C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004B1CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004B1CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004B9C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004B9C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004BA88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004BA88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004BC84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004BC84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004BFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004BFB0.s") diff --git a/src/4BDC0.h b/src/4BDC0.h index fab1cba..637e5ec 100644 --- a/src/4BDC0.h +++ b/src/4BDC0.h @@ -1,7 +1,7 @@ #ifndef _4BDC0_H_ #define _4BDC0_H_ -#include "common.h" +#include "global.h" void func_8004B9C4(s32); void func_8004B1CC(s32); diff --git a/src/4CBC0.c b/src/4CBC0.c index 0165a5e..f5c54df 100644 --- a/src/4CBC0.c +++ b/src/4CBC0.c @@ -1,57 +1,57 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004BFC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004BFC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C16C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C16C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C17C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C17C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C4FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C4FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C6CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C6CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C6DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C6DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C8A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C8A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C8B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C8B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CA6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CA6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CA7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CA7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CCD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CCD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D16C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D16C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D1B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D3B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D3B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D9B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D9B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004DC8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004DC8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004DDA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004DDA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004DF94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004DF94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004E304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004E304.s") diff --git a/src/4F410.c b/src/4F410.c index d2729cd..68e1983 100644 --- a/src/4F410.c +++ b/src/4F410.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4F410/func_8004E810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F410/func_8004E810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4F410/func_8004EBC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F410/func_8004EBC8.s") diff --git a/src/4F7F0.c b/src/4F7F0.c index 9a7b060..d236d25 100644 --- a/src/4F7F0.c +++ b/src/4F7F0.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" struct UnkArray4 { u32 unk0; diff --git a/src/4F870.c b/src/4F870.c index 9d08d15..f43426d 100644 --- a/src/4F870.c +++ b/src/4F870.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4F870/func_8004EC70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F870/func_8004EC70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4F870/func_8004F084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F870/func_8004F084.s") diff --git a/src/4FDB0.c b/src/4FDB0.c index 3c0326f..0c90b4a 100644 --- a/src/4FDB0.c +++ b/src/4FDB0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4FDB0/func_8004F1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FDB0/func_8004F1B0.s") diff --git a/src/4FE60.c b/src/4FE60.c index 9e8c4cc..a34dfa5 100644 --- a/src/4FE60.c +++ b/src/4FE60.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4FE60/func_8004F260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FE60/func_8004F260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4FE60/func_8004F2F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FE60/func_8004F2F0.s") diff --git a/src/4FF50.c b/src/4FF50.c index 1b4853f..8d88c3b 100644 --- a/src/4FF50.c +++ b/src/4FF50.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4FF50/func_8004F350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FF50/func_8004F350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4FF50/func_8004F4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FF50/func_8004F4F8.s") diff --git a/src/50120.c b/src/50120.c index 68a3f79..1af632d 100644 --- a/src/50120.c +++ b/src/50120.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50120/func_8004F520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50120/func_8004F520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50120/func_8004F95C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50120/func_8004F95C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50120/func_8004FB1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50120/func_8004FB1C.s") diff --git a/src/50860.c b/src/50860.c index a7c9895..b4185a6 100644 --- a/src/50860.c +++ b/src/50860.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FC60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FC60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FCD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FCD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FD44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FD44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FD64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FD64.s") diff --git a/src/50990.c b/src/50990.c index 3e13444..b969f46 100644 --- a/src/50990.c +++ b/src/50990.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50990/func_8004FD90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50990/func_8004FD90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50990/func_8004FDA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50990/func_8004FDA0.s") diff --git a/src/50A00.c b/src/50A00.c index 263fd2d..cf3746f 100644 --- a/src/50A00.c +++ b/src/50A00.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50A00/func_8004FE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50A00/func_8004FE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50A00/func_8004FF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50A00/func_8004FF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50A00/func_8004FF40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50A00/func_8004FF40.s") diff --git a/src/50C20.c b/src/50C20.c index 1164da1..8ba3e0e 100644 --- a/src/50C20.c +++ b/src/50C20.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50C20/func_80050020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50C20/func_80050020.s") diff --git a/src/50CC0.c b/src/50CC0.c index fce6b84..a3fa8fe 100644 --- a/src/50CC0.c +++ b/src/50CC0.c @@ -1,15 +1,15 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_800500C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_800500C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_800503A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_800503A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050B40.s") diff --git a/src/517A0.c b/src/517A0.c index 7a1d06b..83d797c 100644 --- a/src/517A0.c +++ b/src/517A0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/517A0/func_80050BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/517A0/func_80050BA0.s") diff --git a/src/51850.c b/src/51850.c index 3cda97b..e99d70c 100644 --- a/src/51850.c +++ b/src/51850.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/51850/func_80050C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/51850/func_80050C50.s") diff --git a/src/518A0.c b/src/518A0.c index 9c80959..decd8be 100644 --- a/src/518A0.c +++ b/src/518A0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/518A0/func_80050CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/518A0/func_80050CA0.s") diff --git a/src/51B20.c b/src/51B20.c index 546d540..17ee62d 100644 --- a/src/51B20.c +++ b/src/51B20.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/51B20/func_80050F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/51B20/func_80050F20.s") diff --git a/src/5580.c b/src/5580.c index 2312606..9fadb82 100644 --- a/src/5580.c +++ b/src/5580.c @@ -1,50 +1,49 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800049AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800049AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800049D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800049D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004C68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004C68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004D64.s") -void func_80004DB4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004DB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800052B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800052B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800053B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800053B4.s") diff --git a/src/6A40.c b/src/6A40.c index e961c9b..d9075af 100644 --- a/src/6A40.c +++ b/src/6A40.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #include "6A40.h" struct UnkStruct800A7428 { diff --git a/src/6A40.h b/src/6A40.h index 172b4ae..77b9cee 100644 --- a/src/6A40.h +++ b/src/6A40.h @@ -1,7 +1,7 @@ #ifndef _6A40_H_ #define _6A40_H_ -#include "common.h" +#include "global.h" void func_80005E40(u32 arg0, s32 arg1); void func_80005EAC(void); diff --git a/src/6BC0.c b/src/6BC0.c index da2ade3..27ad9ce 100644 --- a/src/6BC0.c +++ b/src/6BC0.c @@ -1,28 +1,28 @@ -#include "common.h" +#include "global.h" #include "6BC0.h" -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80005FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80005FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800060E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800060E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800062E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800062E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_8000648C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_8000648C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800065B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800065B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800067E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800067E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_8000699C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_8000699C.s") diff --git a/src/6BC0.h b/src/6BC0.h index dd65762..d997b67 100644 --- a/src/6BC0.h +++ b/src/6BC0.h @@ -1,7 +1,7 @@ #ifndef _6BC0_H_ #define _6BC0_H_ -#include "common.h" +#include "global.h" void func_800060E0(Gfx**, s32, s32, s16, s16); void* func_80006314(s32, s32, s32, s32, s32); diff --git a/src/8EB0.c b/src/8EB0.c index 05443fb..5870b8c 100644 --- a/src/8EB0.c +++ b/src/8EB0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/8EB0/func_800082B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/8EB0/func_800082B0.s") diff --git a/src/C970.c b/src/C970.c index 2418e87..3507a62 100644 --- a/src/C970.c +++ b/src/C970.c @@ -1,17 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BE5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BE5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BEC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BEC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000C02C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C02C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000C104.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C104.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000C1AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C1AC.s") diff --git a/src/CE80.c b/src/CE80.c index 0936eb1..a1c707c 100644 --- a/src/CE80.c +++ b/src/CE80.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C4A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C4A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C780.s") diff --git a/src/D470.c b/src/D470.c index e9669eb..1df9c31 100644 --- a/src/D470.c +++ b/src/D470.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000C870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000C870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000C8F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000C8F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CA4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CA4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CB18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CB18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CC30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CC30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CC9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CC9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CDB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CDB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CEE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CEE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000D0B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000D0B4.s") diff --git a/src/E570.c b/src/E570.c index d8df8ef..f3546fa 100644 --- a/src/E570.c +++ b/src/E570.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/E570/func_8000D970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E570/func_8000D970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E570/func_8000DA78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E570/func_8000DA78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E570/func_8000DAFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E570/func_8000DAFC.s") diff --git a/src/E890.c b/src/E890.c index d9fcb35..a167240 100644 --- a/src/E890.c +++ b/src/E890.c @@ -1,132 +1,132 @@ -#include "common.h" +#include "global.h" #include "E890.h" -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DC90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DC90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DD68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DD68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DDB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DDB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DDE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DDE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DE18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DE18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DE70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DE70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E0EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E0EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E21C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E21C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E51C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E51C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E6EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E6EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E7E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E7E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E8B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E8B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E9D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E9D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EA84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EA84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EAF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EAF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EB70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EB70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EBA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EBA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EBE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EBE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EC18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EC18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EC50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EC50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EC88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EC88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000ED4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000ED4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000ED98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000ED98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EE1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EE1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F2C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F2C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F3FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F3FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F5A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F5A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F730.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FA94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FA94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FBB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FBB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FDE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FDE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FF04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FF04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FFB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FFB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800102A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800102A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800103F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800103F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8001046C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8001046C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800104AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800104AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800107F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800107F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010CA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010CA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010E20.s") diff --git a/src/E890.h b/src/E890.h index 33f2051..92c2322 100644 --- a/src/E890.h +++ b/src/E890.h @@ -1,7 +1,7 @@ #ifndef _E890_H_ #define _E890_H_ -#include "common.h" +#include "global.h" void func_80010354(f32*, f32*, f32, s16, s32); diff --git a/src/code_49190.s b/src/code_49190.s new file mode 100644 index 0000000..21d5671 --- /dev/null +++ b/src/code_49190.s @@ -0,0 +1,430 @@ +.include "macro.inc" + +/* assembler directives */ +.set noat /* allow manual use of $at */ +.set noreorder /* don't insert nops after branches */ +.set gp=64 /* allow use of 64-bit general purpose registers */ + +.section .text, "ax" + +/* Generated by spimdisasm 1.28.0 */ + +/* Handwritten function */ +glabel func_80048590 +/* 049190 80048590 2481FFF9 */ addiu $at, $a0, -0x7 +/* 049194 80048594 1C20000D */ bgtz $at, .L800485CC +/* 049198 80048598 00000000 */ nop +/* 04919C 8004859C 03E00821 */ addu $at, $ra, $zero +/* 0491A0 800485A0 04100036 */ bltzal $zero, .L8004867C +/* 0491A4 800485A4 00000000 */ nop +/* 0491A8 800485A8 27EF00D4 */ addiu $t7, $ra, 0xD4 +/* 0491AC 800485AC 0020F821 */ addu $ra, $at, $zero +/* 0491B0 800485B0 01E47821 */ addu $t7, $t7, $a0 +/* 0491B4 800485B4 81E10000 */ lb $at, 0x0($t7) +/* 0491B8 800485B8 00000000 */ nop +/* 0491BC 800485BC 00014103 */ sra $t0, $at, 4 +/* 0491C0 800485C0 30290007 */ andi $t1, $at, 0x7 +/* 0491C4 800485C4 10000004 */ b .L800485D8 +/* 0491C8 800485C8 00000000 */ nop +.L800485CC: +/* 0491CC 800485CC 2488FFF8 */ addiu $t0, $a0, -0x8 +/* 0491D0 800485D0 000840C3 */ sra $t0, $t0, 3 +/* 0491D4 800485D4 30890007 */ andi $t1, $a0, 0x7 +.L800485D8: +/* 0491D8 800485D8 000962C0 */ sll $t4, $t1, 11 +/* 0491DC 800485DC 258C47FF */ addiu $t4, $t4, 0x47FF +/* 0491E0 800485E0 340A0006 */ ori $t2, $zero, 0x6 +/* 0491E4 800485E4 01485023 */ subu $t2, $t2, $t0 +/* 0491E8 800485E8 340B0001 */ ori $t3, $zero, 0x1 +/* 0491EC 800485EC 2541FFFF */ addiu $at, $t2, -0x1 +/* 0491F0 800485F0 002B5804 */ sllv $t3, $t3, $at +/* 0491F4 800485F4 340E000D */ ori $t6, $zero, 0xD +/* 0491F8 800485F8 00C0C021 */ addu $t8, $a2, $zero +.L800485FC: +/* 0491FC 800485FC 870D0000 */ lh $t5, 0x0($t8) +/* 049200 80048600 00000000 */ nop +/* 049204 80048604 000D6B40 */ sll $t5, $t5, 13 +/* 049208 80048608 25AD9000 */ addiu $t5, $t5, -0x7000 +/* 04920C 8004860C 01AC0018 */ mult $t5, $t4 +/* 049210 80048610 00006812 */ mflo $t5 +/* 049214 80048614 25AD4000 */ addiu $t5, $t5, 0x4000 +/* 049218 80048618 000D6BC3 */ sra $t5, $t5, 15 +/* 04921C 8004861C 01AB6821 */ addu $t5, $t5, $t3 +/* 049220 80048620 014D6807 */ srav $t5, $t5, $t2 +/* 049224 80048624 A70D0000 */ sh $t5, 0x0($t8) +/* 049228 80048628 25CEFFFF */ addiu $t6, $t6, -0x1 +/* 04922C 8004862C 1DC0FFF3 */ bgtz $t6, .L800485FC +/* 049230 80048630 27180002 */ addiu $t8, $t8, 0x2 +/* 049234 80048634 00E0C821 */ addu $t9, $a3, $zero +/* 049238 80048638 340E0028 */ ori $t6, $zero, 0x28 +.L8004863C: +/* 04923C 8004863C A7200000 */ sh $zero, 0x0($t9) +/* 049240 80048640 25CEFFFF */ addiu $t6, $t6, -0x1 +/* 049244 80048644 1DC0FFFD */ bgtz $t6, .L8004863C +/* 049248 80048648 27390002 */ addiu $t9, $t9, 0x2 +/* 04924C 8004864C 00E5C821 */ addu $t9, $a3, $a1 +/* 049250 80048650 0325C821 */ addu $t9, $t9, $a1 +/* 049254 80048654 00C0C021 */ addu $t8, $a2, $zero +/* 049258 80048658 340E000D */ ori $t6, $zero, 0xD +.L8004865C: +/* 04925C 8004865C 87010000 */ lh $at, 0x0($t8) +/* 049260 80048660 27180002 */ addiu $t8, $t8, 0x2 +/* 049264 80048664 A7210000 */ sh $at, 0x0($t9) +/* 049268 80048668 25CEFFFF */ addiu $t6, $t6, -0x1 +/* 04926C 8004866C 1DC0FFFB */ bgtz $t6, .L8004865C +/* 049270 80048670 27390006 */ addiu $t9, $t9, 0x6 +/* 049274 80048674 03E00008 */ jr $ra +/* 049278 80048678 00000000 */ nop + +# these feel like deliberately invalid instructions. +# they decode to a branch from a delay slot, which +# cant possibly be valid. +.L8004867C: +/* 04927C 8004867C C7D7E3E7 */ .4byte 0xC7D7E3E7 +/* 049280 80048680 F1F3F5F7 */ .4byte 0xF1F3F5F7 + +glabel func_80048684 +/* 049284 80048684 848B0166 */ lh $t3, 0x166($a0) +/* 049288 80048688 24A1FFD8 */ addiu $at, $a1, -0x28 +/* 04928C 8004868C 04200005 */ bltz $at, .L800486A4 +/* 049290 80048690 00000000 */ nop +/* 049294 80048694 2421FFB0 */ addiu $at, $at, -0x50 +/* 049298 80048698 1C200002 */ bgtz $at, .L800486A4 +/* 04929C 8004869C 00000000 */ nop +/* 0492A0 800486A0 00A05821 */ addu $t3, $a1, $zero +.L800486A4: +/* 0492A4 800486A4 A48B0166 */ sh $t3, 0x166($a0) +/* 0492A8 800486A8 03E00821 */ addu $at, $ra, $zero +/* 0492AC 800486AC 04100022 */ bltzal $zero, .L80048738 +/* 0492B0 800486B0 00000000 */ nop +/* 0492B4 800486B4 27E80084 */ addiu $t0, $ra, 0x84 +/* 0492B8 800486B8 0020F821 */ addu $ra, $at, $zero +/* 0492BC 800486BC 01064021 */ addu $t0, $t0, $a2 +/* 0492C0 800486C0 01064021 */ addu $t0, $t0, $a2 +/* 0492C4 800486C4 95080000 */ lhu $t0, 0x0($t0) +/* 0492C8 800486C8 340A0077 */ ori $t2, $zero, 0x77 +/* 0492CC 800486CC 248D0000 */ addiu $t5, $a0, 0x0 +.L800486D0: +/* 0492D0 800486D0 95AC0050 */ lhu $t4, 0x50($t5) +/* 0492D4 800486D4 254AFFFF */ addiu $t2, $t2, -0x1 +/* 0492D8 800486D8 A5AC0000 */ sh $t4, 0x0($t5) +/* 0492DC 800486DC 0541FFFC */ bgez $t2, .L800486D0 +/* 0492E0 800486E0 25AD0002 */ addiu $t5, $t5, 0x2 +/* 0492E4 800486E4 340A0027 */ ori $t2, $zero, 0x27 +/* 0492E8 800486E8 248E0000 */ addiu $t6, $a0, 0x0 +/* 0492EC 800486EC 248D0000 */ addiu $t5, $a0, 0x0 +/* 0492F0 800486F0 01AB6823 */ subu $t5, $t5, $t3 +/* 0492F4 800486F4 01AB6823 */ subu $t5, $t5, $t3 +/* 0492F8 800486F8 00E07821 */ addu $t7, $a3, $zero +.L800486FC: +/* 0492FC 800486FC 85A900F0 */ lh $t1, 0xF0($t5) +/* 049300 80048700 25AD0002 */ addiu $t5, $t5, 0x2 +/* 049304 80048704 01280018 */ mult $t1, $t0 +/* 049308 80048708 00004812 */ mflo $t1 +/* 04930C 8004870C 25294000 */ addiu $t1, $t1, 0x4000 +/* 049310 80048710 00094BC3 */ sra $t1, $t1, 15 +/* 049314 80048714 85E10000 */ lh $at, 0x0($t7) +/* 049318 80048718 25EF0002 */ addiu $t7, $t7, 0x2 +/* 04931C 8004871C 01214821 */ addu $t1, $t1, $at +/* 049320 80048720 A5C900F0 */ sh $t1, 0xF0($t6) +/* 049324 80048724 25CE0002 */ addiu $t6, $t6, 0x2 +/* 049328 80048728 1D40FFF4 */ bgtz $t2, .L800486FC +/* 04932C 8004872C 254AFFFF */ addiu $t2, $t2, -0x1 +/* 049330 80048730 03E00008 */ jr $ra +/* 049334 80048734 00000000 */ nop +.L80048738: # these feel like deliberately invalid instructions. + # they decode to a branch from a delay slot, which + # cant possibly be valid. +/* 049338 80048738 0CCD2CCD */ .4byte 0x0CCD2CCD +/* 04933C 8004873C 53337FFF */ .4byte 0x53337FFF +.L80048740: +/* 049340 80048740 852A0000 */ lh $t2, 0x0($t1) +/* 049344 80048744 25290002 */ addiu $t1, $t1, 0x2 +/* 049348 80048748 00196C00 */ sll $t5, $t9, 16 +/* 04934C 8004874C 000D6C03 */ sra $t5, $t5, 16 +/* 049350 80048750 02ED0018 */ mult $s7, $t5 +/* 049354 80048754 00000812 */ mflo $at +/* 049358 80048758 24214000 */ addiu $at, $at, 0x4000 +/* 04935C 8004875C 00010BC3 */ sra $at, $at, 15 +/* 049360 80048760 01415023 */ subu $t2, $t2, $at +/* 049364 80048764 00196C03 */ sra $t5, $t9, 16 +/* 049368 80048768 02CD0018 */ mult $s6, $t5 +/* 04936C 8004876C 00000812 */ mflo $at +/* 049370 80048770 24214000 */ addiu $at, $at, 0x4000 +/* 049374 80048774 00010BC3 */ sra $at, $at, 15 +/* 049378 80048778 01415023 */ subu $t2, $t2, $at +/* 04937C 8004877C 01AA0018 */ mult $t5, $t2 +/* 049380 80048780 00000812 */ mflo $at +/* 049384 80048784 24214000 */ addiu $at, $at, 0x4000 +/* 049388 80048788 00010BC3 */ sra $at, $at, 15 +/* 04938C 8004878C 0036B821 */ addu $s7, $at, $s6 +/* 049390 80048790 00186C00 */ sll $t5, $t8, 16 +/* 049394 80048794 000D6C03 */ sra $t5, $t5, 16 +/* 049398 80048798 02AD0018 */ mult $s5, $t5 +/* 04939C 8004879C 00000812 */ mflo $at +/* 0493A0 800487A0 24214000 */ addiu $at, $at, 0x4000 +/* 0493A4 800487A4 00010BC3 */ sra $at, $at, 15 +/* 0493A8 800487A8 01415023 */ subu $t2, $t2, $at +/* 0493AC 800487AC 01AA0018 */ mult $t5, $t2 +/* 0493B0 800487B0 00000812 */ mflo $at +/* 0493B4 800487B4 24214000 */ addiu $at, $at, 0x4000 +/* 0493B8 800487B8 00010BC3 */ sra $at, $at, 15 +/* 0493BC 800487BC 0035B021 */ addu $s6, $at, $s5 +/* 0493C0 800487C0 00186C03 */ sra $t5, $t8, 16 +/* 0493C4 800487C4 028D0018 */ mult $s4, $t5 +/* 0493C8 800487C8 00000812 */ mflo $at +/* 0493CC 800487CC 24214000 */ addiu $at, $at, 0x4000 +/* 0493D0 800487D0 00010BC3 */ sra $at, $at, 15 +/* 0493D4 800487D4 01415023 */ subu $t2, $t2, $at +/* 0493D8 800487D8 01AA0018 */ mult $t5, $t2 +/* 0493DC 800487DC 00000812 */ mflo $at +/* 0493E0 800487E0 24214000 */ addiu $at, $at, 0x4000 +/* 0493E4 800487E4 00010BC3 */ sra $at, $at, 15 +/* 0493E8 800487E8 0034A821 */ addu $s5, $at, $s4 +/* 0493EC 800487EC 000F6C00 */ sll $t5, $t7, 16 +/* 0493F0 800487F0 000D6C03 */ sra $t5, $t5, 16 +/* 0493F4 800487F4 026D0018 */ mult $s3, $t5 +/* 0493F8 800487F8 00000812 */ mflo $at +/* 0493FC 800487FC 24214000 */ addiu $at, $at, 0x4000 +/* 049400 80048800 00010BC3 */ sra $at, $at, 15 +/* 049404 80048804 01415023 */ subu $t2, $t2, $at +/* 049408 80048808 01AA0018 */ mult $t5, $t2 +/* 04940C 8004880C 00000812 */ mflo $at +/* 049410 80048810 24214000 */ addiu $at, $at, 0x4000 +/* 049414 80048814 00010BC3 */ sra $at, $at, 15 +/* 049418 80048818 0033A021 */ addu $s4, $at, $s3 +/* 04941C 8004881C 000F6C03 */ sra $t5, $t7, 16 +/* 049420 80048820 024D0018 */ mult $s2, $t5 +/* 049424 80048824 00000812 */ mflo $at +/* 049428 80048828 24214000 */ addiu $at, $at, 0x4000 +/* 04942C 8004882C 00010BC3 */ sra $at, $at, 15 +/* 049430 80048830 01415023 */ subu $t2, $t2, $at +/* 049434 80048834 01AA0018 */ mult $t5, $t2 +/* 049438 80048838 00000812 */ mflo $at +/* 04943C 8004883C 24214000 */ addiu $at, $at, 0x4000 +/* 049440 80048840 00010BC3 */ sra $at, $at, 15 +/* 049444 80048844 00329821 */ addu $s3, $at, $s2 +/* 049448 80048848 000E6C00 */ sll $t5, $t6, 16 +/* 04944C 8004884C 000D6C03 */ sra $t5, $t5, 16 +/* 049450 80048850 022D0018 */ mult $s1, $t5 +/* 049454 80048854 00000812 */ mflo $at +/* 049458 80048858 24214000 */ addiu $at, $at, 0x4000 +/* 04945C 8004885C 00010BC3 */ sra $at, $at, 15 +/* 049460 80048860 01415023 */ subu $t2, $t2, $at +/* 049464 80048864 01AA0018 */ mult $t5, $t2 +/* 049468 80048868 00000812 */ mflo $at +/* 04946C 8004886C 24214000 */ addiu $at, $at, 0x4000 +/* 049470 80048870 00010BC3 */ sra $at, $at, 15 +/* 049474 80048874 00319021 */ addu $s2, $at, $s1 +/* 049478 80048878 000E6C03 */ sra $t5, $t6, 16 +/* 04947C 8004887C 020D0018 */ mult $s0, $t5 +/* 049480 80048880 00000812 */ mflo $at +/* 049484 80048884 24214000 */ addiu $at, $at, 0x4000 +/* 049488 80048888 00010BC3 */ sra $at, $at, 15 +/* 04948C 8004888C 01415023 */ subu $t2, $t2, $at +/* 049490 80048890 01AA0018 */ mult $t5, $t2 +/* 049494 80048894 00000812 */ mflo $at +/* 049498 80048898 24214000 */ addiu $at, $at, 0x4000 +/* 04949C 8004889C 00010BC3 */ sra $at, $at, 15 +/* 0494A0 800488A0 00308821 */ addu $s1, $at, $s0 +/* 0494A4 800488A4 01408021 */ addu $s0, $t2, $zero +/* 0494A8 800488A8 34016E14 */ ori $at, $zero, 0x6E14 +/* 0494AC 800488AC 00270018 */ mult $at, $a3 +/* 0494B0 800488B0 00000812 */ mflo $at +/* 0494B4 800488B4 24214000 */ addiu $at, $at, 0x4000 +/* 0494B8 800488B8 00010BC3 */ sra $at, $at, 15 +/* 0494BC 800488BC 01415021 */ addu $t2, $t2, $at +/* 0494C0 800488C0 01403821 */ addu $a3, $t2, $zero +/* 0494C4 800488C4 000A5040 */ sll $t2, $t2, 1 +/* 0494C8 800488C8 000A0BC3 */ sra $at, $t2, 15 +/* 0494CC 800488CC 24210001 */ addiu $at, $at, 0x1 +/* 0494D0 800488D0 00010843 */ sra $at, $at, 1 +/* 0494D4 800488D4 10200004 */ beqz $at, .L800488E8 +/* 0494D8 800488D8 00000000 */ nop +/* 0494DC 800488DC 04200002 */ bltz $at, .L800488E8 +/* 0494E0 800488E0 240A8000 */ addiu $t2, $zero, -0x8000 +/* 0494E4 800488E4 240A7FFF */ addiu $t2, $zero, 0x7FFF +.L800488E8: +/* 0494E8 800488E8 314AFFF8 */ andi $t2, $t2, 0xFFF8 +/* 0494EC 800488EC A50A0000 */ sh $t2, 0x0($t0) +/* 0494F0 800488F0 25080002 */ addiu $t0, $t0, 0x2 +/* 0494F4 800488F4 1D60FF92 */ bgtz $t3, .L80048740 +/* 0494F8 800488F8 256BFFFF */ addiu $t3, $t3, -0x1 +/* 0494FC 800488FC 03E00008 */ jr $ra +/* 049500 80048900 00000000 */ nop + +/* Handwritten function */ +glabel func_80048904 +/* 049504 80048904 27BDFFBC */ addiu $sp, $sp, -0x44 +/* 049508 80048908 AFBF0000 */ sw $ra, 0x0($sp) +/* 04950C 8004890C AFA40004 */ sw $a0, 0x4($sp) +/* 049510 80048910 AFA50008 */ sw $a1, 0x8($sp) +/* 049514 80048914 AFA6000C */ sw $a2, 0xC($sp) +/* 049518 80048918 AFA70010 */ sw $a3, 0x10($sp) +/* 04951C 8004891C AFB00014 */ sw $s0, 0x14($sp) +/* 049520 80048920 AFB10018 */ sw $s1, 0x18($sp) +/* 049524 80048924 AFB2001C */ sw $s2, 0x1C($sp) +/* 049528 80048928 AFB30020 */ sw $s3, 0x20($sp) +/* 04952C 8004892C AFB40024 */ sw $s4, 0x24($sp) +/* 049530 80048930 AFB50028 */ sw $s5, 0x28($sp) +/* 049534 80048934 AFB6002C */ sw $s6, 0x2C($sp) +/* 049538 80048938 AFB70030 */ sw $s7, 0x30($sp) +/* 04953C 8004893C 24810140 */ addiu $at, $a0, 0x140 +/* 049540 80048940 8C300000 */ lw $s0, 0x0($at) +/* 049544 80048944 8C310004 */ lw $s1, 0x4($at) +/* 049548 80048948 8C320008 */ lw $s2, 0x8($at) +/* 04954C 8004894C 8C33000C */ lw $s3, 0xC($at) +/* 049550 80048950 8C340010 */ lw $s4, 0x10($at) +/* 049554 80048954 8C350014 */ lw $s5, 0x14($at) +/* 049558 80048958 8C360018 */ lw $s6, 0x18($at) +/* 04955C 8004895C 8C37001C */ lw $s7, 0x1C($at) +/* 049560 80048960 84870164 */ lh $a3, 0x164($a0) +/* 049564 80048964 04100065 */ bltzal $zero, .L80048AFC +/* 049568 80048968 00000000 */ nop +/* 04956C 8004896C 27EB0190 */ addiu $t3, $ra, 0x190 +/* 049570 80048970 04110039 */ bal .L80048A58 /* handwritten instruction */ +/* 049574 80048974 00000000 */ nop +/* 049578 80048978 24A90000 */ addiu $t1, $a1, 0x0 +/* 04957C 8004897C 24C80000 */ addiu $t0, $a2, 0x0 +/* 049580 80048980 0411FF6F */ bal .L80048740 /* handwritten instruction */ +/* 049584 80048984 340B000C */ ori $t3, $zero, 0xC +/* 049588 80048988 04100062 */ bltzal $zero, .L80048B14 +/* 04958C 8004898C 00000000 */ nop +/* 049590 80048990 27EB0184 */ addiu $t3, $ra, 0x184 +/* 049594 80048994 04110030 */ bal .L80048A58 /* handwritten instruction */ +/* 049598 80048998 00000000 */ nop +/* 04959C 8004899C 24A9001A */ addiu $t1, $a1, 0x1A +/* 0495A0 800489A0 24C8001A */ addiu $t0, $a2, 0x1A +/* 0495A4 800489A4 0411FF66 */ bal .L80048740 /* handwritten instruction */ +/* 0495A8 800489A8 340B000D */ ori $t3, $zero, 0xD +/* 0495AC 800489AC 0410005D */ bltzal $zero, .L80048B24 +/* 0495B0 800489B0 00000000 */ nop +/* 0495B4 800489B4 27EB0170 */ addiu $t3, $ra, 0x170 +/* 0495B8 800489B8 04110027 */ bal .L80048A58 /* handwritten instruction */ +/* 0495BC 800489BC 00000000 */ nop +/* 0495C0 800489C0 24A90036 */ addiu $t1, $a1, 0x36 +/* 0495C4 800489C4 24C80036 */ addiu $t0, $a2, 0x36 +/* 0495C8 800489C8 0411FF5D */ bal .L80048740 /* handwritten instruction */ +/* 0495CC 800489CC 340B000C */ ori $t3, $zero, 0xC +/* 0495D0 800489D0 0410005A */ bltzal $zero, .L80048B3C +/* 0495D4 800489D4 00000000 */ nop +/* 0495D8 800489D8 27EB0164 */ addiu $t3, $ra, 0x164 +/* 0495DC 800489DC 0411001E */ bal .L80048A58 /* handwritten instruction */ +/* 0495E0 800489E0 00000000 */ nop +/* 0495E4 800489E4 24A90050 */ addiu $t1, $a1, 0x50 +/* 0495E8 800489E8 24C80050 */ addiu $t0, $a2, 0x50 +/* 0495EC 800489EC 0411FF54 */ bal .L80048740 /* handwritten instruction */ +/* 0495F0 800489F0 340B0077 */ ori $t3, $zero, 0x77 +/* 0495F4 800489F4 24810140 */ addiu $at, $a0, 0x140 +/* 0495F8 800489F8 AC300000 */ sw $s0, 0x0($at) +/* 0495FC 800489FC AC310004 */ sw $s1, 0x4($at) +/* 049600 80048A00 AC320008 */ sw $s2, 0x8($at) +/* 049604 80048A04 AC33000C */ sw $s3, 0xC($at) +/* 049608 80048A08 AC340010 */ sw $s4, 0x10($at) +/* 04960C 80048A0C AC350014 */ sw $s5, 0x14($at) +/* 049610 80048A10 AC360018 */ sw $s6, 0x18($at) +/* 049614 80048A14 AC37001C */ sw $s7, 0x1C($at) +/* 049618 80048A18 A4870164 */ sh $a3, 0x164($a0) +/* 04961C 80048A1C 8FBF0000 */ lw $ra, 0x0($sp) +/* 049620 80048A20 8FA40004 */ lw $a0, 0x4($sp) +/* 049624 80048A24 8FA50008 */ lw $a1, 0x8($sp) +/* 049628 80048A28 8FA6000C */ lw $a2, 0xC($sp) +/* 04962C 80048A2C 8FA70010 */ lw $a3, 0x10($sp) +/* 049630 80048A30 8FB00014 */ lw $s0, 0x14($sp) +/* 049634 80048A34 8FB10018 */ lw $s1, 0x18($sp) +/* 049638 80048A38 8FB2001C */ lw $s2, 0x1C($sp) +/* 04963C 80048A3C 8FB30020 */ lw $s3, 0x20($sp) +/* 049640 80048A40 8FB40024 */ lw $s4, 0x24($sp) +/* 049644 80048A44 8FB50028 */ lw $s5, 0x28($sp) +/* 049648 80048A48 8FB6002C */ lw $s6, 0x2C($sp) +/* 04964C 80048A4C 8FB70030 */ lw $s7, 0x30($sp) +/* 049650 80048A50 03E00008 */ jr $ra +/* 049654 80048A54 27BD0044 */ addiu $sp, $sp, 0x44 +.L80048A58: +/* 049658 80048A58 84810188 */ lh $at, 0x188($a0) +/* 04965C 80048A5C 24880168 */ addiu $t0, $a0, 0x168 +/* 049660 80048A60 10200003 */ beqz $at, .L80048A70 +/* 049664 80048A64 25090010 */ addiu $t1, $t0, 0x10 +/* 049668 80048A68 01204021 */ addu $t0, $t1, $zero +/* 04966C 80048A6C 24890168 */ addiu $t1, $a0, 0x168 +.L80048A70: +/* 049670 80048A70 03E06821 */ addu $t5, $ra, $zero +/* 049674 80048A74 850A0000 */ lh $t2, 0x0($t0) +/* 049678 80048A78 0160F809 */ jalr $t3 +/* 04967C 80048A7C 852C0000 */ lh $t4, 0x0($t1) +/* 049680 80048A80 000A7400 */ sll $t6, $t2, 16 +/* 049684 80048A84 850A0002 */ lh $t2, 0x2($t0) +/* 049688 80048A88 0160F809 */ jalr $t3 +/* 04968C 80048A8C 852C0002 */ lh $t4, 0x2($t1) +/* 049690 80048A90 01CA7025 */ or $t6, $t6, $t2 +/* 049694 80048A94 850A0004 */ lh $t2, 0x4($t0) +/* 049698 80048A98 0160F809 */ jalr $t3 +/* 04969C 80048A9C 852C0004 */ lh $t4, 0x4($t1) +/* 0496A0 80048AA0 000A7C00 */ sll $t7, $t2, 16 +/* 0496A4 80048AA4 850A0006 */ lh $t2, 0x6($t0) +/* 0496A8 80048AA8 0160F809 */ jalr $t3 +/* 0496AC 80048AAC 852C0006 */ lh $t4, 0x6($t1) +/* 0496B0 80048AB0 01EA7825 */ or $t7, $t7, $t2 +/* 0496B4 80048AB4 850A0008 */ lh $t2, 0x8($t0) +/* 0496B8 80048AB8 0160F809 */ jalr $t3 +/* 0496BC 80048ABC 852C0008 */ lh $t4, 0x8($t1) +/* 0496C0 80048AC0 000AC400 */ sll $t8, $t2, 16 +/* 0496C4 80048AC4 850A000A */ lh $t2, 0xA($t0) +/* 0496C8 80048AC8 0160F809 */ jalr $t3 +/* 0496CC 80048ACC 852C000A */ lh $t4, 0xA($t1) +/* 0496D0 80048AD0 030AC025 */ or $t8, $t8, $t2 +/* 0496D4 80048AD4 850A000C */ lh $t2, 0xC($t0) +/* 0496D8 80048AD8 0160F809 */ jalr $t3 +/* 0496DC 80048ADC 852C000C */ lh $t4, 0xC($t1) +/* 0496E0 80048AE0 000ACC00 */ sll $t9, $t2, 16 +/* 0496E4 80048AE4 850A000E */ lh $t2, 0xE($t0) +/* 0496E8 80048AE8 0160F809 */ jalr $t3 +/* 0496EC 80048AEC 852C000E */ lh $t4, 0xE($t1) +/* 0496F0 80048AF0 01A0F821 */ addu $ra, $t5, $zero +/* 0496F4 80048AF4 03E00008 */ jr $ra +/* 0496F8 80048AF8 032AC825 */ or $t9, $t9, $t2 +.L80048AFC: +/* 0496FC 80048AFC 000A5083 */ sra $t2, $t2, 2 +/* 049700 80048B00 000C6043 */ sra $t4, $t4, 1 +/* 049704 80048B04 014C5021 */ addu $t2, $t2, $t4 +/* 049708 80048B08 000C6043 */ sra $t4, $t4, 1 +/* 04970C 80048B0C 1000000B */ b .L80048B3C +/* 049710 80048B10 014C5021 */ addu $t2, $t2, $t4 +.L80048B14: +/* 049714 80048B14 000A5043 */ sra $t2, $t2, 1 +/* 049718 80048B18 000C6043 */ sra $t4, $t4, 1 +/* 04971C 80048B1C 10000007 */ b .L80048B3C +/* 049720 80048B20 014C5021 */ addu $t2, $t2, $t4 +.L80048B24: +/* 049724 80048B24 000A5043 */ sra $t2, $t2, 1 +/* 049728 80048B28 000C6083 */ sra $t4, $t4, 2 +/* 04972C 80048B2C 018A6021 */ addu $t4, $t4, $t2 +/* 049730 80048B30 000A5043 */ sra $t2, $t2, 1 +/* 049734 80048B34 10000001 */ b .L80048B3C +/* 049738 80048B38 014C5021 */ addu $t2, $t2, $t4 +.L80048B3C: +/* 04973C 80048B3C 05410003 */ bgez $t2, .L80048B4C +/* 049740 80048B40 00006021 */ addu $t4, $zero, $zero +/* 049744 80048B44 000A5023 */ negu $t2, $t2 +/* 049748 80048B48 340C0001 */ ori $t4, $zero, 0x1 +.L80048B4C: +/* 04974C 80048B4C 2541D4CD */ addiu $at, $t2, -0x2B33 +/* 049750 80048B50 04200006 */ bltz $at, .L80048B6C +/* 049754 80048B54 000A0840 */ sll $at, $t2, 1 +/* 049758 80048B58 2541B19A */ addiu $at, $t2, -0x4E66 +/* 04975C 80048B5C 04200003 */ bltz $at, .L80048B6C +/* 049760 80048B60 25412B33 */ addiu $at, $t2, 0x2B33 +/* 049764 80048B64 000A0883 */ sra $at, $t2, 2 +/* 049768 80048B68 24216600 */ addiu $at, $at, 0x6600 +.L80048B6C: +/* 04976C 80048B6C 242A8001 */ addiu $t2, $at, -0x7FFF +/* 049770 80048B70 19400002 */ blez $t2, .L80048B7C +/* 049774 80048B74 00205021 */ addu $t2, $at, $zero +/* 049778 80048B78 340A7FFF */ ori $t2, $zero, 0x7FFF +.L80048B7C: +/* 04977C 80048B7C 15800002 */ bnez $t4, .L80048B88 +/* 049780 80048B80 000A5023 */ negu $t2, $t2 +/* 049784 80048B84 000A5023 */ negu $t2, $t2 +.L80048B88: +/* 049788 80048B88 03E00008 */ jr $ra +/* 04978C 80048B8C 314AFFFF */ andi $t2, $t2, 0xFFFF diff --git a/src/dma.c b/src/dma.c index 7915240..44be775 100644 --- a/src/dma.c +++ b/src/dma.c @@ -1,5 +1,5 @@ #include -#include "common.h" +#include "global.h" #include "dma.h" #include "rsp.h" diff --git a/src/dp_intro.c b/src/dp_intro.c index 1bc98f7..3427d33 100644 --- a/src/dp_intro.c +++ b/src/dp_intro.c @@ -1,6 +1,6 @@ #include #include -#include "common.h" +#include "global.h" #include "dp_intro.h" #include "crash_screen.h" #include "profiler.h" diff --git a/src/fragments/1/fragment1.c b/src/fragments/1/fragment1.c index f1fd001..26bf7ac 100644 --- a/src/fragments/1/fragment1.c +++ b/src/fragments/1/fragment1.c @@ -1,156 +1,153 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812000DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812000DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120019C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120019C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812001E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812001E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812002BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812002BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200358.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200358.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812003EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812003EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812004B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812004B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812005D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812005D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812006AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812006AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812008C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812008C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812009D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812009D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812011D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812011D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120157C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120157C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812015E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812015E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812015EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812015EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812016DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812016DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812018C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812018C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201DDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201DDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812020C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812020C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120241C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120241C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812029B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812029B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202EA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202EA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202FCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202FCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120311C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120311C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120334C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120334C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812033F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812033F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203F3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203F3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81204A84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81204A84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120572C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120572C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206D9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206D9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812070A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812070A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812072B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812072B0.s") -void func_81207330(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207348.s") -void func_81207354(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120735C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120735C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812073A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812073A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812073B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812073B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207494.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207494.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812075C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812075C0.s") -void func_81207690(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207774.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207774.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120806C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120806C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208C08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208C08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208F9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208F9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120935C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120935C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209690.s") diff --git a/src/fragments/10/fragment10.c b/src/fragments/10/fragment10.c index c4a75f9..b8dc796 100644 --- a/src/fragments/10/fragment10.c +++ b/src/fragments/10/fragment10.c @@ -1,43 +1,43 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864001A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864001A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864002F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864002F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864005EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864005EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400BE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400BE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401A9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401A9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401D1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401D1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_8640203C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_8640203C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86402130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86402130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864025A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864025A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864026D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864026D0.s") diff --git a/src/fragments/11/fragment11.c b/src/fragments/11/fragment11.c index 7427c90..5a0e221 100644 --- a/src/fragments/11/fragment11.c +++ b/src/fragments/11/fragment11.c @@ -1,45 +1,45 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865000C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865000C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_8650077C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_8650077C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865013D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865013D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865019E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865019E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865029C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865029C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502BB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502BB8.s") diff --git a/src/fragments/12/fragment12.c b/src/fragments/12/fragment12.c index ac38e2a..d086f67 100644 --- a/src/fragments/12/fragment12.c +++ b/src/fragments/12/fragment12.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_866000FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_866000FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_8660048C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_8660048C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_866004F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_866004F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_866005B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_866005B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_8660070C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_8660070C.s") diff --git a/src/fragments/13/fragment13.c b/src/fragments/13/fragment13.c index 9b916a4..2087cf6 100644 --- a/src/fragments/13/fragment13.c +++ b/src/fragments/13/fragment13.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867000FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867000FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_8670047C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_8670047C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867004E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867004E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867005A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867005A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700648.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700648.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867006FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867006FC.s") diff --git a/src/fragments/14/fragment14.c b/src/fragments/14/fragment14.c index 139889e..3112fc4 100644 --- a/src/fragments/14/fragment14.c +++ b/src/fragments/14/fragment14.c @@ -1,143 +1,143 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86800070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86800070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868001A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868001A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868004F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868004F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868005A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868005A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_8680091C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_8680091C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86800B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86800B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801CA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801CA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_8680262C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_8680262C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868026B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868026B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868026E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868026E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868031A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868031A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868035FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868035FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868038A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868038A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868049C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868049C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804BD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804BD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868051E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868051E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868055D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868055D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868061E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868061E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868063C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868063C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868064BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868064BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806BF0.s") diff --git a/src/fragments/15/fragment15.c b/src/fragments/15/fragment15.c index 6388fd2..4bd1e22 100644 --- a/src/fragments/15/fragment15.c +++ b/src/fragments/15/fragment15.c @@ -1,145 +1,143 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869000F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869000F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869002AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869002AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690060C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690060C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869006DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869006DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690079C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690079C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869009E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869009E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690172C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690172C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869017D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869017D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869018A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869018A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690193C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690193C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869019BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869019BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901FB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901FB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869022D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869022D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869024B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869024B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869025BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869025BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690274C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690274C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902AE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690325C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690325C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690351C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690351C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869035F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869035F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86903888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86903888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86903D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86903D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904070.s") -void func_869043F4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869043F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869043FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869043FC.s") -void func_86904BFC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869050C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869050C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86905734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86905734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86905F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86905F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869066C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869066C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86906E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86906E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869073D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869073D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86908418.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86908418.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86908668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86908668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869089AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869089AC.s") diff --git a/src/fragments/16/fragment16.c b/src/fragments/16/fragment16.c index bfc11c9..40799fb 100644 --- a/src/fragments/16/fragment16.c +++ b/src/fragments/16/fragment16.c @@ -1,53 +1,53 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0003C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0003C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A000B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A000B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0056C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0056C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0092C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0092C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00D00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00D00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A013C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A013C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A014F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A014F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A018C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A018C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A018D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A018D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A02164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A02164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A021C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A021C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A023A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A023A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0240C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0240C.s") diff --git a/src/fragments/17/fragment17.c b/src/fragments/17/fragment17.c index 6d6986e..7677f2a 100644 --- a/src/fragments/17/fragment17.c +++ b/src/fragments/17/fragment17.c @@ -1,349 +1,347 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B000D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B000D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B001B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B001B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B001D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B001D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B001FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B001FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0027C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0027C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B003CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B003CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0054C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0054C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B007EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B007EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B008C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B008C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00B14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00B14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0100C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0100C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0107C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0107C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B010FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B010FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0111C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0111C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0145C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0145C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B014C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B014C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B018D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B018D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B018E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B018E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0194C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0194C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01C00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01C00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B024D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B024D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B025A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B025A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B026C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B026C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B028F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B028F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0299C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0299C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02F34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02F34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B03048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B03048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B034AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B034AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B03B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B03B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B03DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B03DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B040C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B040C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B042B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B042B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0434C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0434C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B044A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B044A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B044B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B044B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B048D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B048D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04DF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04DF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04EBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04EBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B061E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B061E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0630C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0630C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B065C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B065C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B069D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B069D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06FCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06FCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B075EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B075EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07F14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07F14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0819C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0819C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B087A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B087A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B087E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B087E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B088E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B088E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B089B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B089B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B089E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B089E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08AD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08C44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08C44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08EA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08EA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B095C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B095C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0961C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0961C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B097B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B097B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09AD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09AD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09B80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09B80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09F64.s") -void func_86B0A0B0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A0B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A0B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A0B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A15C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A15C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A18C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A18C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A47C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A47C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A7F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A7F8.s") -void func_86B0A81C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A81C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A824.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A824.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B0B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B0B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B12C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B12C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B4D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B4D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B8DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B8DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0BA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0BA18.s") diff --git a/src/fragments/18/fragment18.c b/src/fragments/18/fragment18.c index 54fc62e..9221b9e 100644 --- a/src/fragments/18/fragment18.c +++ b/src/fragments/18/fragment18.c @@ -1,128 +1,127 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C005D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C005D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C0063C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C0063C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00AA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00AA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00EF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00EF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01408.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C014A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C014A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C016C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C016C8.s") -void func_86C01748(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C018B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C018B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C021FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C021FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C022D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C022D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C026F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C026F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C0276C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C0276C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C027BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C027BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C028C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C028C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C030EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C030EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C031E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C031E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C035E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C035E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03BE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03BE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03C64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03C64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03E8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03E8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03ED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03ED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C040B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C040B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C04170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C04170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C041E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C041E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C043C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C043C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C044B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C044B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C046B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C046B0.s") diff --git a/src/fragments/19/fragment19.c b/src/fragments/19/fragment19.c index 9acfb4a..41ce6a9 100644 --- a/src/fragments/19/fragment19.c +++ b/src/fragments/19/fragment19.c @@ -1,17 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D000A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D000A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D000D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D000D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D00134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D00134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D0015C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D0015C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D0032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D0032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D0037C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D0037C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D003EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D003EC.s") diff --git a/src/fragments/2/fragment2.c b/src/fragments/2/fragment2.c index 65db38f..f40ed76 100644 --- a/src/fragments/2/fragment2.c +++ b/src/fragments/2/fragment2.c @@ -1,88 +1,88 @@ -#include "common.h" +#include "global.h" #include "fragment2.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780005C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780005C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878001D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878001D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878001E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878001E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780024C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780024C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878009BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878009BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878010C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878010C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780118C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780118C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878013D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878013D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801824.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801824.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878018F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878018F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801AC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801AC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878021B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878021B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878025D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878025D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780295C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780295C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878029C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878029C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802E1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802E1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802EB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802F4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802F4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780304C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780304C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878038B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878038B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87804320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87804320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87804AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87804AD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87804FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87804FD4.s") diff --git a/src/fragments/2/fragment2.h b/src/fragments/2/fragment2.h index c48216c..55a341a 100644 --- a/src/fragments/2/fragment2.h +++ b/src/fragments/2/fragment2.h @@ -1,7 +1,7 @@ #ifndef _FRAGMENT2_H_ #define _FRAGMENT2_H_ -#include "common.h" +#include "global.h" extern s32 D_87806330; extern s16 D_8780FA2A; diff --git a/src/fragments/20/fragment20.c b/src/fragments/20/fragment20.c index f06e612..66a59ab 100644 --- a/src/fragments/20/fragment20.c +++ b/src/fragments/20/fragment20.c @@ -1,118 +1,117 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E001A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E001A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E001E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E001E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E002E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E002E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0034C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0034C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E004FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E004FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0063C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0063C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0073C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0073C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E007BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E007BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E007CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E007CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00CAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00CAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0103C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0103C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E010E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E010E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E016EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E016EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0172C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0172C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E017C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E017C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0182C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0182C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E019B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E019B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E019F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E019F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01B08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01B08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E021D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E021D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E026D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E026D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E027D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E027D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E027FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E027FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02924.s") -void func_86E0296C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0296C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02A28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02A28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02BB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02BB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02E40.s") diff --git a/src/fragments/21/fragment21.c b/src/fragments/21/fragment21.c index 9455992..8a8d897 100644 --- a/src/fragments/21/fragment21.c +++ b/src/fragments/21/fragment21.c @@ -1,83 +1,83 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F001CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F001CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F002F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F002F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0035C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0035C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F003FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F003FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0048C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0048C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0050C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0050C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F010B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F010B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F011E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F011E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F012B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F012B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0132C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0132C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F013B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F013B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F014B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F014B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F014F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F014F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0164C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0164C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F016D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F016D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0174C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0174C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F018E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F018E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01F58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01F58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0204C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0204C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02520.s") diff --git a/src/fragments/22/fragment22.c b/src/fragments/22/fragment22.c index a4f79f7..3a60558 100644 --- a/src/fragments/22/fragment22.c +++ b/src/fragments/22/fragment22.c @@ -1,49 +1,49 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_8800008C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_8800008C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880001A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880001A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_8800071C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_8800071C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880007C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880007C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880008C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880008C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880008E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880008E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000CC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000CC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_8800233C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_8800233C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88002580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88002580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880025D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880025D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88002628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88002628.s") diff --git a/src/fragments/23/fragment23.c b/src/fragments/23/fragment23.c index c8ee4df..e4766bc 100644 --- a/src/fragments/23/fragment23.c +++ b/src/fragments/23/fragment23.c @@ -1,540 +1,539 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882000E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882000E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882004BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882004BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882004C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882004C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882009B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882009B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200C44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200C44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820104C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820104C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820130C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820130C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882013F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882013F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820213C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820213C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820253C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820253C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882025AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882025AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882025B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882025B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882025E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882025E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882027F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882027F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882028EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882028EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202B74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202B74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202E74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202E74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202EB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88203538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88203538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820399C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820399C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88203A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88203A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88203ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88203ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204E0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204E0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820508C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820508C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882051EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882051EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882052F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882052F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882057B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882057B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882062E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882062E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820634C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820634C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820660C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820660C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882068B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882068B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882069C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882069C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206C4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206C4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820723C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820723C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882079D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882079D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820817C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820817C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820820C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820820C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882082BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882082BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882082FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882082FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882083D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882083D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882091E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882091E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882091F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882091F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820920C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820920C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820927C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820927C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820938C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820938C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88209A88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88209A88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88209AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88209AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88209B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88209B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820ADEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820ADEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820AF78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820AF78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820AFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820AFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B0A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B0A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B0E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B0E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B12C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B12C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B3AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B3AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B3C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B3C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820BE14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820BE14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CA2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CA2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CC30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CC30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D0EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D0EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D0F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D0F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D5E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D5E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D7C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D7C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D9B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D9B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DB98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DB98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DBE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DBE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DC1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DC1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DC90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DC90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DDC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DDC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DDE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DDE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DF38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DF38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E6A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E6A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E90C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E90C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E99C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E99C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EBF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EBF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EC1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EC1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EC68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EC68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EC9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EC9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820ECAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820ECAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820ED14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820ED14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EFD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EFD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EFD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EFD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820F3B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820F3B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820FFF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820FFF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821004C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821004C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882101B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882101B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882101E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882101E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821064C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821064C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882107D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882107D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882107F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882107F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882108A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882108A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882108D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882108D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882109C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882109C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210D8C.s") -void func_88210DA8(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210DA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882110E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882110E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882111C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882111C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882111F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882111F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882112E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882112E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882118CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882118CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88212150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88212150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882121E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882121E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821347C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821347C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882135D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882135D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882136F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882136F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213774.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213774.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882137B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882137B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882138D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882138D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882139C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882139C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213B90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821421C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821421C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88214720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88214720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882147BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882147BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821483C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821483C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882149A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882149A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88214A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88214A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882158BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882158BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882158CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882158CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88215974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88215974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882159AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882159AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882159BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882159BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88215D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88215D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88216000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88216000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882169D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882169D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88216F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88216F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882170A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882170A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821711C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821711C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821738C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821738C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882173EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882173EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882175F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882175F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882176C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882176C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882177A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882177A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BC0.s") diff --git a/src/fragments/24/fragment24.c b/src/fragments/24/fragment24.c index 3692565..7f8da96 100644 --- a/src/fragments/24/fragment24.c +++ b/src/fragments/24/fragment24.c @@ -1,564 +1,561 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883003E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883003E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883006B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883006B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830089C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830089C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830090C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830090C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300B68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300B68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300D54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300D54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830133C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830133C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883013AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883013AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883018D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883018D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301B34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301B34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301BA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301BA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883024E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883024E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883026CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883026CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830290C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830290C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302E04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302E04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88303520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88303520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883036AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883036AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883045C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883045C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883047CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883047CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883050CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883050CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883051B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883051B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883051F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883051F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883054DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883054DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883057F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883057F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883058C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883058C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305CDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305CDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305DA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305DA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305F28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305F28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830681C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830681C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306F90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306F90.s") -void func_88306FE4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306FE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306FEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306FEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883073E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883073E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883074D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883074D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830757C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830757C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830772C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830772C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307C2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307C2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830858C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830858C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830867C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830867C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88308D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88308D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88308DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88308DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88308E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88308E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883092C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883092C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883094CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883094CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883096BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883096BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309774.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309774.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883097D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883097D4.s") -void func_883097E4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883097E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883097EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883097EC.s") -void func_88309808(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883098D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883098D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883099D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883099D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A5E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A5E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830AAA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830AAA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830AADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830AADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830AC0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830AC0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830ACA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830ACA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B2EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B2EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B8A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B8A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B954.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B954.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BAC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BAC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BCE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BCE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BF30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BF30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BF5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BF5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BFE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BFE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CD4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CD4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CE84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CE84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CF88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CF88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D0B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D0B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D11C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D11C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D2F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D2F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DBE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DBE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DC0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DC0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DC58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DC58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DD8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DD8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830E090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830E090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830E4A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830E4A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830E504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830E504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830EE58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830EE58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F05C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F05C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F09C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F09C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F0C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F0C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F2A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F2A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F5DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F5DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830FA10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830FA10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830FA20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830FA20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830FA80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830FA80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883103CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883103CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883105D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883105D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831067C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831067C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883106C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883106C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883112B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883112B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311C64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311C64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883121F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883121F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831221C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831221C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883122E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883122E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831239C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831239C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831247C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831247C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883125B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883125B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831286C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831286C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883128B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883128B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883128FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883128FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883137C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883137C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883139E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883139E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313B4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313B4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313B90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883142F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883142F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883149E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883149E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883151B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883151B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883151E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883151E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831527C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831527C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883152D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883152D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883156B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883156B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883156E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883156E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831577C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831577C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883157D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883157D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315CFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315CFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883160BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883160BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883160DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883160DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883161D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883161D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883163A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883163A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883163B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883163B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883164C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883164C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883166A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883166A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883167CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883167CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883168B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883168B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316E10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316E10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316F98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316F98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88317144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88317144.s") diff --git a/src/fragments/25/fragment25.c b/src/fragments/25/fragment25.c index 1c4658c..bba7caa 100644 --- a/src/fragments/25/fragment25.c +++ b/src/fragments/25/fragment25.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/25/fragment25/func_88400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/25/fragment25/func_88400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/25/fragment25/func_8840007C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/25/fragment25/func_8840007C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/25/fragment25/func_884000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/25/fragment25/func_884000C4.s") diff --git a/src/fragments/26/fragment26.c b/src/fragments/26/fragment26.c index 87dc4bd..7bc9be0 100644 --- a/src/fragments/26/fragment26.c +++ b/src/fragments/26/fragment26.c @@ -1,297 +1,297 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850067C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850067C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850068C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850068C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885006CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885006CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850074C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850074C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885007CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885007CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885008C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885008C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850093C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850093C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885009E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885009E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500F6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500F6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885012A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885012A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88501314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88501314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850143C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850143C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885014BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885014BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850182C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850182C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850189C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850189C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850230C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850230C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885023F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885023F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502D00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502D00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850318C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850318C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885031B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885031B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885031E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885031E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885032E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885032E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885033CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885033CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885033E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885033E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885045FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885045FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504F98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504F98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885054CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885054CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885054D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885054D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850555C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850555C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850562C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850562C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885060BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885060BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850628C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850628C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885062D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885062D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850633C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850633C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885063B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885063B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885065E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885065E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506DCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506DCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850734C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850734C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885075BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885075BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507B80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507B80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507CC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507CC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507D4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507D4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850878C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850878C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850882C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850882C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885088F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885088F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850897C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850897C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88508AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88508AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509E8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509E8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A10C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A10C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A29C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A29C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A2DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A2DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A2FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A2FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A3CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A3CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A3EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A3EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850AB48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850AB48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850ABBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850ABBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850B254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850B254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850B2D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850B2D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BD40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BD40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BD8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BD8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BDC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BDC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BDF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BDF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BF60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BF60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BF80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BF80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C0D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C0D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C1D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C1D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C3B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C3B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CB48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CB48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CBA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CBA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CBF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CBF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CC54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CC54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CC74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CC74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CCA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CCA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CD24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CD24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CD44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CD44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CE80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CE80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CF00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CF00.s") diff --git a/src/fragments/27/fragment27.c b/src/fragments/27/fragment27.c index a16e4fb..3d59cea 100644 --- a/src/fragments/27/fragment27.c +++ b/src/fragments/27/fragment27.c @@ -1,124 +1,123 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600214.s") -void func_88600240(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886002A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886002A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886006D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886006D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600DDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600DDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860115C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860115C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886011EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886011EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886011F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886011F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886015F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886015F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886018C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886018C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860192C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860192C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601DE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601DE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601DF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601DF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602D40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602D40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860308C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860308C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886033E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886033E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88604190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88604190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88604198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88604198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886041F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886041F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860439C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860439C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88604F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88604F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886050C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886050C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886052F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886052F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886056D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886056D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886058B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886058B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605A0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605A0C.s") diff --git a/src/fragments/28/fragment28.c b/src/fragments/28/fragment28.c index 89fe07a..d61bd7a 100644 --- a/src/fragments/28/fragment28.c +++ b/src/fragments/28/fragment28.c @@ -1,129 +1,129 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888002F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888002F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800E20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880123C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880123C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888018E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888018E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880193C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880193C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888019A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888019A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801E1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801E1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880231C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880231C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888025C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888025C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880261C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880261C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888026D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888026D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880276C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880276C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880316C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880316C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888031FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888031FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888038E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888038E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880412C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880412C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880431C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880431C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888044BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888044BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888047D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888047D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880554C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880554C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88805960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88805960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88805AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88805AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888069B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888069B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88806EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88806EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88806EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88806EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88806F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88806F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88807090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88807090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888071C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888071C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880725C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880725C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88807AC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88807AC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88807D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88807D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880812C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880812C.s") diff --git a/src/fragments/29/fragment29.c b/src/fragments/29/fragment29.c index 270e2bf..a0268d7 100644 --- a/src/fragments/29/fragment29.c +++ b/src/fragments/29/fragment29.c @@ -1,23 +1,23 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889000C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889006D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889006D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889007AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889007AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889007BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889007BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889010AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889010AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889010C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889010C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889010D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889010D0.s") diff --git a/src/fragments/3/fragment3.c b/src/fragments/3/fragment3.c index cbedc41..e86af8b 100644 --- a/src/fragments/3/fragment3.c +++ b/src/fragments/3/fragment3.c @@ -1,157 +1,157 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790002C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790002C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879000C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879001A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879001A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879002B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879002B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879002FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879002FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879003A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879003A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879004F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879004F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879005AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879005AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879005C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879005C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790060C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790060C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879009B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879009B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879010A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879010A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790168C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790168C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879018B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879018B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901A28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901A28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901B08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901B08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901BB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901BB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790215C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790215C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902318.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902318.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879023EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879023EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879024DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879024DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879026D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879026D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879027F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879027F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879028E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879028E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879029F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879029F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790320C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790320C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879032BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879032BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903358.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903358.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879033FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879033FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790354C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790354C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879036B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879036B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790370C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790370C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879037D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879037D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879038AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879038AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903D64.s") diff --git a/src/fragments/30/fragment30.c b/src/fragments/30/fragment30.c index d4e8084..7eaf735 100644 --- a/src/fragments/30/fragment30.c +++ b/src/fragments/30/fragment30.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/30/fragment30/func_88A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/30/fragment30/func_88A00020.s") diff --git a/src/fragments/31/fragment31.c b/src/fragments/31/fragment31.c index e873c14..e23c33e 100644 --- a/src/fragments/31/fragment31.c +++ b/src/fragments/31/fragment31.c @@ -1,103 +1,103 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810002DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810002DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810004E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810004E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_8100059C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_8100059C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810005F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810005F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810007A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810007A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810007F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810007F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_8100080C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_8100080C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810010BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810010BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81001D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81001D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81001E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81001E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810024E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810024E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810027E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810027E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810029B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810029B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002BC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002C00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002C00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003138.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003138.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810031C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810031C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810033C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810033C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810035C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810035C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003678.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003678.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810038D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810038D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003A24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003F20.s") diff --git a/src/fragments/32/fragment32.c b/src/fragments/32/fragment32.c index 6369fbc..6da0e8d 100644 --- a/src/fragments/32/fragment32.c +++ b/src/fragments/32/fragment32.c @@ -1,13 +1,13 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_81100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_81100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811001C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811001C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811002D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811002D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_81100368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_81100368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811007AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811007AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811007F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811007F8.s") diff --git a/src/fragments/34/fragment34.c b/src/fragments/34/fragment34.c index d7edc59..4b519af 100644 --- a/src/fragments/34/fragment34.c +++ b/src/fragments/34/fragment34.c @@ -1,1037 +1,1035 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814000E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814000E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140012C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140012C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140015C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140015C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140018C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140018C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814001DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814001DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814002A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814002A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814002F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814002F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140033C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140033C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814003F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814003F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140043C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140043C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814004D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814004D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814005EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814005EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814006CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814006CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140082C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140082C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814008B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814008B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140094C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140094C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140099C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140099C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814009D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814009D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400BBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400BBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400D00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400D00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400E8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400E8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814010D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814010D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140119C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140119C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814011E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814011E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401268.s") -void func_8140138C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140138C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814014E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814014E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814015A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814015A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814015F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814015F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814017E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814017E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401ABC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401ABC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140203C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140203C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814020B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814020B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140213C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140213C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814021A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814021A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140227C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140227C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814022EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814022EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140238C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140238C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402494.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402494.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814024C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814024C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140297C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140297C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814030C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814030C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814032B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814032B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140353C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140353C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403EA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403EA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814040E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814040E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140419C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140419C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814041BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814041BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814041DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814041DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814042C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814042C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140430C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140430C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140437C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140437C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140439C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140439C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814043BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814043BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140441C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140441C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814044FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814044FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814045CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814045CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404A6C.s") -void func_81404AB4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404ABC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404ABC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404CF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404CF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404DB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404DB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814050BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814050BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140515C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140515C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814054B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814054B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814059C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814059C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405E04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405E04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814060D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814060D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814064B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814064B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140679C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140679C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814067F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814067F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814072B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814072B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140743C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140743C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814078B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814078B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814080EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814080EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140810C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140810C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140819C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140819C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814081BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814081BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814081F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814081F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140826C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140826C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814084D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814084D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814087F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814087F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408864.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408864.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814089AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814089AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408C68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408C68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408C88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408C88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408DD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408DD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140901C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140901C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140908C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140908C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140910C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140910C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814091B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814091B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814092C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814092C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140935C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140935C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814093B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814093B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140948C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140948C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140959C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140959C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409708.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409708.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814097D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814097D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814098A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814098A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814098E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814098E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409900.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409900.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409918.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409918.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814099C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814099C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814099E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814099E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409AD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409AD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409B18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409B18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409BC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409BC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409DD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A03C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A03C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A07C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A07C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A0AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A0AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A0C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A0C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A11C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A11C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A24C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A24C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A52C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A52C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A5B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A5B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A5CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A5CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A6BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A6BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A6E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A6E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A73C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A73C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A7DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A7DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A878.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A878.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A8C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A8C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A91C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A91C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A9C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A9C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AA18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AC70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AC70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AD8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AD8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140ADA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140ADA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140ADBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140ADBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AE40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AE40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AE84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AE84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AFA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AFA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AFFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AFFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B0F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B0F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B14C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B14C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B1C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B1C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B1EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B1EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B23C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B23C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B2B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B2B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B3AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B3AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B42C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B42C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B4A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B4A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B7C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B7C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B95C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B95C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B98C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B98C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B9D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B9D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BA48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BA48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BA84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BA84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BAC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BAC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BAE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BAE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BBC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BBC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BBF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BBF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BC2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BC2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BC5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BC5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BCA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BCA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BCBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BCBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BD08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BD08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BD34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BD34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BD80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BD80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BDAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BDAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BDD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BDD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BEF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BEF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BFEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BFEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C0D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C0D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C13C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C13C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C1C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C1C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C1E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C1E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C2D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C4CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C4CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C5D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C5D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C7C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C7C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C7EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C7EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C84C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C84C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C8B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C8B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C8F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C8F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C96C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C96C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C9B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C9B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C9EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C9EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CA30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CA30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CA64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CA64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CA90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CA90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CAC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CAC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CC04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CC04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CC90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CC90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CD80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CD80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CDDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CDDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CE68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CE68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CF30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CF30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D1FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D1FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D4A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D4A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D4E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D4E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D5A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D5A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D5F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D5F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D708.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D708.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D7C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D7C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140DA40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140DA40.s") diff --git a/src/fragments/35/fragment35.c b/src/fragments/35/fragment35.c index 60a9b61..ad2dc54 100644 --- a/src/fragments/35/fragment35.c +++ b/src/fragments/35/fragment35.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_82000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_82000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_820002B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_820002B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_820002F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_820002F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_8200036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_8200036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_820003A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_820003A4.s") diff --git a/src/fragments/36/fragment36.c b/src/fragments/36/fragment36.c index 596d3b8..909c5de 100644 --- a/src/fragments/36/fragment36.c +++ b/src/fragments/36/fragment36.c @@ -1,40 +1,39 @@ -#include "common.h" +#include "global.h" -void func_82100020(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821000C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821002F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821002F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_8210046C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_8210046C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821005EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821005EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_8210071C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_8210071C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821009AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821009AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821009B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821009B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100C98.s") diff --git a/src/fragments/37/fragment37.c b/src/fragments/37/fragment37.c index 4d67c48..d5d5580 100644 --- a/src/fragments/37/fragment37.c +++ b/src/fragments/37/fragment37.c @@ -1,64 +1,63 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82201108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82201108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822012E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822012E8.s") -void func_822014C0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822014C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822014C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822014C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82201654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82201654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822018D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822018D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82201AC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82201AC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822022C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822022C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822023A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822023A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_8220263C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_8220263C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822026BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822026BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822027E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822027E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202DC4.s") diff --git a/src/fragments/38/fragment38.c b/src/fragments/38/fragment38.c index 746d192..1b61c70 100644 --- a/src/fragments/38/fragment38.c +++ b/src/fragments/38/fragment38.c @@ -1,113 +1,113 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82300214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82300214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230047C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230047C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82300C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82300C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230147C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230147C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301CC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301CC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823020B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823020B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823023F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823023F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823025B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823025B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823031B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823031B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230340C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230340C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823034AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823034AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230391C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230391C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303F58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303F58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303FB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303FB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303FE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303FE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304358.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304358.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230443C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230443C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823045D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823045D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823046C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823046C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823047B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823047B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230495C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230495C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82305038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82305038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230519C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230519C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230527C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230527C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82305370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82305370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823056C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823056C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823057E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823057E4.s") diff --git a/src/fragments/39/fragment39.c b/src/fragments/39/fragment39.c index cb0ff7c..7f581e1 100644 --- a/src/fragments/39/fragment39.c +++ b/src/fragments/39/fragment39.c @@ -1,146 +1,145 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825001B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825001B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250042C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250042C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250088C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250088C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500D14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500D14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825010A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825010A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825014B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825014B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825017F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825017F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250182C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250182C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501B18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501B18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501C88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501C88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825023D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825023D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250244C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250244C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825024C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825024C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250281C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250281C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502BB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502BB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825031FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825031FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825032BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825032BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825039AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825039AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250416C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250416C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825042A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825042A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825045C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825045C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825046AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825046AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504A08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504A08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825053B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825053B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825054F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825054F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505720.s") -void func_825057A0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825057A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825057A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825057A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505B94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505B94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505C10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505C10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825060E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825060E0.s") diff --git a/src/fragments/4/fragment4.c b/src/fragments/4/fragment4.c index 7537897..3d36bbc 100644 --- a/src/fragments/4/fragment4.c +++ b/src/fragments/4/fragment4.c @@ -1,19 +1,19 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A0002C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A0002C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A005BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A005BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A009F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A009F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A010C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A010C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A010D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A010D4.s") diff --git a/src/fragments/4/fragment4.h b/src/fragments/4/fragment4.h index 1f1238d..eaa62ea 100644 --- a/src/fragments/4/fragment4.h +++ b/src/fragments/4/fragment4.h @@ -1,7 +1,7 @@ #ifndef _FRAGMENT4_H_ #define _FRAGMENT4_H_ -#include "common.h" +#include "global.h" void func_87A00020(unk_D_86002F34_00C*); Gfx* func_87A0002C(Gfx*); diff --git a/src/fragments/40/fragment40.c b/src/fragments/40/fragment40.c index 949a667..5387f3a 100644 --- a/src/fragments/40/fragment40.c +++ b/src/fragments/40/fragment40.c @@ -1,47 +1,47 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_8310024C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_8310024C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831006D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831006D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831006F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831006F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100CD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100CD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100D4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100D4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_8310102C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_8310102C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831010B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831010B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831010E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831010E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831011D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831011D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831013FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831013FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831016D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831016D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101A98.s") diff --git a/src/fragments/41/fragment41.c b/src/fragments/41/fragment41.c index 88bf148..1dae2bd 100644 --- a/src/fragments/41/fragment41.c +++ b/src/fragments/41/fragment41.c @@ -1,421 +1,419 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F000C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F000C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00138.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00138.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F002BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F002BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00378.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00378.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F003F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F003F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00838.s") -void func_82F00960(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00AC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00AC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00C14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00C14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00E88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00E88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00F3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00F3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0109C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0109C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F014E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F014E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F018F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F018F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01FE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01FE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F020B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F020B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F022DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F022DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F028AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F028AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F029FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F029FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02CE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02CE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02FEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02FEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F037EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F037EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F04010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F04010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F040D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F040D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F043A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F043A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F04604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F04604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F04FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F04FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0504C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0504C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F051B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F051B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0525C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0525C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F052F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F052F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F053F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F053F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F056D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F056D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06E04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06E04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06E38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06E38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06F9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06F9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0761C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0761C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0763C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0763C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F077E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F077E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F081FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F081FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0822C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0822C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F083B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F083B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F084EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F084EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0856C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0856C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0866C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0866C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F087F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F087F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F088F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F088F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0917C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0917C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F094B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F094B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F097D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F097D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A0A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A0A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A23C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A23C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A5F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A5F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0AA50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0AA50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0AB68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0AB68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0ACC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0ACC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0B2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0B2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0B3E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0B3E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0B7B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0B7B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BBE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BBE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BD38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BD38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BE7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BE7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BEF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BEF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C16C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C16C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C630.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C630.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C7FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C7FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C8EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C8EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0CA7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0CA7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0CB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0CB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0CC3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0CC3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D27C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D27C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D2F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D2F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D3F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D3F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D51C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D51C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D64C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D64C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D6D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D6D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0DA60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0DA60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0DCF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0DCF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0DD90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0DD90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0E5C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0E5C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0E97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0E97C.s") -void func_82F0ECA4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0ECA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0ECAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0ECAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0EE58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0EE58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0EF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0EF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0EFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0EFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F2AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F2AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F79C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F79C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F89C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F89C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F9E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F9E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0FCC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0FCC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0FDCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0FDCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0FDEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0FDEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F101C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F101C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1050C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1050C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1084C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1084C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1091C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1091C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10A24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F11264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F11264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F115F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F115F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1198C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1198C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F11D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F11D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1228C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1228C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F12614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F12614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F12DE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F12DE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F132D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F132D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13B4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13B4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13B64.s") diff --git a/src/fragments/42/fragment42.c b/src/fragments/42/fragment42.c index 67e1b44..ec66be2 100644 --- a/src/fragments/42/fragment42.c +++ b/src/fragments/42/fragment42.c @@ -1,55 +1,55 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_8330032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_8330032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833005CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833005CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83301090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83301090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833013C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833013C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833015C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833015C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833017BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833017BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83301998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83301998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83301D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83301D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833023D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833023D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_8330267C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_8330267C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_8330277C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_8330277C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833028FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833028FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833029F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833029F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302E3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302E3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302FD8.s") diff --git a/src/fragments/43/fragment43.c b/src/fragments/43/fragment43.c index 1e02156..56526a9 100644 --- a/src/fragments/43/fragment43.c +++ b/src/fragments/43/fragment43.c @@ -1,114 +1,113 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834002C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834002C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834002E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834002E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400410.s") -void func_8340051C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_8340051C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834006A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834006A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834006BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834006BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834006CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834006CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834007B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834007B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834008DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834008DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_8340144C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_8340144C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834016C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834016C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834018C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834018C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834020D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834020D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834021C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834021C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834021D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834021D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834021EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834021EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834023A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834023A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834023CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834023CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834023FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834023FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834024C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834024C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834026A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834026A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834028C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834028C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834028D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834028D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402DC8.s") diff --git a/src/fragments/44/fragment44.c b/src/fragments/44/fragment44.c index b2f3ca2..c283fb2 100644 --- a/src/fragments/44/fragment44.c +++ b/src/fragments/44/fragment44.c @@ -1,61 +1,61 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_8350057C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_8350057C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500D9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500D9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500FE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500FE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501FA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501FA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835022F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835022F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835023F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835023F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835024FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835024FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835028D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835028D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83502F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83502F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835034A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835034A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_8350355C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_8350355C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835035E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835035E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_8350365C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_8350365C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835038DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835038DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835039C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835039C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503C9C.s") diff --git a/src/fragments/45/fragment45.c b/src/fragments/45/fragment45.c index 0cc938d..d455ad9 100644 --- a/src/fragments/45/fragment45.c +++ b/src/fragments/45/fragment45.c @@ -1,53 +1,53 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_8360086C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_8360086C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_836009A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_836009A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600E20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601F28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601F28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_8360282C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_8360282C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_836028E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_836028E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_8360296C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_8360296C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602C14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602C14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602F4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602F4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602FF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602FF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_836030A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_836030A8.s") diff --git a/src/fragments/46/fragment46.c b/src/fragments/46/fragment46.c index 2b87d2d..4ca0e4b 100644 --- a/src/fragments/46/fragment46.c +++ b/src/fragments/46/fragment46.c @@ -1,18 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700020.s") -void func_83700090(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_8370023C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_8370023C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_8370026C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_8370026C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_837002EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_837002EC.s") diff --git a/src/fragments/47/fragment47.c b/src/fragments/47/fragment47.c index 586f3ad..13bc9cd 100644 --- a/src/fragments/47/fragment47.c +++ b/src/fragments/47/fragment47.c @@ -1,135 +1,135 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380008C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380008C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838003B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838003B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800730.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800900.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800900.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800AA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800AA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800EFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800EFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380101C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380101C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380142C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380142C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838014B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838014B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838015F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838015F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801C94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801C94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380217C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380217C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838022C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838022C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380248C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380248C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838024C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838024C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838024EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838024EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380252C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380252C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838029D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838029D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838030A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838030A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380311C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380311C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838031F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838031F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838032C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838032C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838033DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838033DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380355C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380355C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380369C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380369C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803F34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803F34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380419C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380419C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838043F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838043F8.s") diff --git a/src/fragments/48/fragment48.c b/src/fragments/48/fragment48.c index 9413674..09d4199 100644 --- a/src/fragments/48/fragment48.c +++ b/src/fragments/48/fragment48.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839000E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839000E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839002B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839002B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839002F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839002F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839003DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839003DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839004B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839004B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839004F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839004F4.s") diff --git a/src/fragments/49/fragment49.c b/src/fragments/49/fragment49.c index 581e2ba..a4bdfef 100644 --- a/src/fragments/49/fragment49.c +++ b/src/fragments/49/fragment49.c @@ -1,19 +1,19 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A0031C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A0031C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A009C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A009C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00A4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00A4C.s") diff --git a/src/fragments/5/fragment5.c b/src/fragments/5/fragment5.c index ea2c2f9..816f007 100644 --- a/src/fragments/5/fragment5.c +++ b/src/fragments/5/fragment5.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/5/fragment5/func_87B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/5/fragment5/func_87B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/5/fragment5/func_87B00050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/5/fragment5/func_87B00050.s") diff --git a/src/fragments/50/fragment50.c b/src/fragments/50/fragment50.c index d9368b6..598b156 100644 --- a/src/fragments/50/fragment50.c +++ b/src/fragments/50/fragment50.c @@ -1,83 +1,81 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826000D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826000D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826007C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826007C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826007F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826007F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600C00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600C00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600C10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600C10.s") -void func_82600CFC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600CFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600D44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600D44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_8260125C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_8260125C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826024F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826024F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826026D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826026D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826028B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826028B8.s") -void func_826028CC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826028CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826028D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826028D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602AD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602AD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_8260332C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_8260332C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826034EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826034EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826035D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826035D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_8260365C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_8260365C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603D20.s") diff --git a/src/fragments/51/fragment51.c b/src/fragments/51/fragment51.c index 5d7c18c..f52a20d 100644 --- a/src/fragments/51/fragment51.c +++ b/src/fragments/51/fragment51.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/51/fragment51/func_82800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/51/fragment51/func_82800020.s") diff --git a/src/fragments/52/fragment52.c b/src/fragments/52/fragment52.c index e699001..b98e662 100644 --- a/src/fragments/52/fragment52.c +++ b/src/fragments/52/fragment52.c @@ -1,13 +1,13 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_829001D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_829001D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_829002E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_829002E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900390.s") diff --git a/src/fragments/53/fragment53.c b/src/fragments/53/fragment53.c index 8b9ced7..71f5ee3 100644 --- a/src/fragments/53/fragment53.c +++ b/src/fragments/53/fragment53.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A000F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A000F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A00144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A00144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A00224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A00224.s") diff --git a/src/fragments/54/fragment54.c b/src/fragments/54/fragment54.c index 80b16b1..8ffad4a 100644 --- a/src/fragments/54/fragment54.c +++ b/src/fragments/54/fragment54.c @@ -1,35 +1,35 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B000F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B000F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B0029C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B0029C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B003B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B003B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B005AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B005AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00BC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00BC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B0104C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B0104C.s") diff --git a/src/fragments/55/fragment55.c b/src/fragments/55/fragment55.c index bafe58a..b7d80e7 100644 --- a/src/fragments/55/fragment55.c +++ b/src/fragments/55/fragment55.c @@ -1,111 +1,111 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830003A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830003A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000418.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000418.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830004BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830004BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_8300059C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_8300059C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830007C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830007C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830007F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830007F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830014B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830014B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830015EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830015EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830017C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830017C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001A9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001A9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001C4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001C4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001CF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001CF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830020D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830020D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830022B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830022B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830023B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830023B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830023CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830023CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_8300243C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_8300243C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830025F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830025F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_8300269C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_8300269C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830026C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830026C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830026D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830026D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830027C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830027C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002A0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002A0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002BA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002BA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002F9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002F9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83003054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83003054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830032D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830032D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830033F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830033F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83003484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83003484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830038DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830038DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83003988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83003988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830039AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830039AC.s") diff --git a/src/fragments/56/fragment56.c b/src/fragments/56/fragment56.c index bc37771..cb6aa77 100644 --- a/src/fragments/56/fragment56.c +++ b/src/fragments/56/fragment56.c @@ -1,29 +1,29 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C0025C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C0025C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00AA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00AA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00E10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00E10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00F88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00F88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C01054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C01054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C0115C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C0115C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C0120C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C0120C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C012FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C012FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C014FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C014FC.s") diff --git a/src/fragments/57/fragment57.c b/src/fragments/57/fragment57.c index 0ad0fd2..03f3c9d 100644 --- a/src/fragments/57/fragment57.c +++ b/src/fragments/57/fragment57.c @@ -1,101 +1,101 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D00088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D00088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D002C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D002C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0053C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0053C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D00D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D00D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0153C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0153C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D01758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D01758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0180C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0180C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D018AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D018AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0194C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0194C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D01AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D01AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D021B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D021B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D022E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D022E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D029E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D029E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D043CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D043CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0442C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0442C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04EB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D053F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D053F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0580C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0580C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D063E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D063E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0670C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0670C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D067A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D067A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06D0C.s") diff --git a/src/fragments/58/fragment58.c b/src/fragments/58/fragment58.c index 53538d0..8b3ee7b 100644 --- a/src/fragments/58/fragment58.c +++ b/src/fragments/58/fragment58.c @@ -1,67 +1,67 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840000F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840000F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84000200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84000200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840003A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840003A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840004A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840004A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84000698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84000698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_8400094C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_8400094C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_8400114C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_8400114C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840012B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840012B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840017AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840017AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840019A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840019A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840019BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840019BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840021CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840021CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840021F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840021F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840023B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840023B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840024B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840024B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_8400253C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_8400253C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840025FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840025FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840026D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840026D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002A84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002A84.s") diff --git a/src/fragments/59/fragment59.c b/src/fragments/59/fragment59.c index ca902a9..21bd82c 100644 --- a/src/fragments/59/fragment59.c +++ b/src/fragments/59/fragment59.c @@ -1,35 +1,35 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_841003F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_841003F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_8410048C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_8410048C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_841014E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_841014E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84102140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84102140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84102210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84102210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_841022C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_841022C0.s") diff --git a/src/fragments/6/fragment6.c b/src/fragments/6/fragment6.c index 73f48ac..c6d67df 100644 --- a/src/fragments/6/fragment6.c +++ b/src/fragments/6/fragment6.c @@ -482,7 +482,7 @@ void func_86000020(void) { } } #else -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86000020.s") #endif s32 func_86000410(void) { @@ -646,7 +646,7 @@ static u8 D_86002B88[] = { 150, }; void func_860005B8(s32 arg0); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_860005B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_860005B8.s") #endif static Gfx D_86002B90[] = { @@ -1144,7 +1144,7 @@ void func_86001C90(void) { } #else void func_86001C90(void); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86001C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86001C90.s") #endif s32 func_86001EEC(void) { @@ -1296,7 +1296,7 @@ void func_86001F64(void) { } #else void func_86001F64(void); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86001F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86001F64.s") #endif void func_86002264(void) { @@ -1426,7 +1426,7 @@ void func_86002440(void) { } #else void func_86002440(void); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86002440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86002440.s") #endif void func_86002778(UNUSED s32 arg0, UNUSED s32 arg1) { diff --git a/src/fragments/6/fragment6.h b/src/fragments/6/fragment6.h index 5d952a0..c845363 100644 --- a/src/fragments/6/fragment6.h +++ b/src/fragments/6/fragment6.h @@ -1,7 +1,7 @@ #ifndef _FRAGMENT6_H_ #define _FRAGMENT6_H_ -#include "common.h" +#include "global.h" diff --git a/src/fragments/60/fragment60.c b/src/fragments/60/fragment60.c index 1c94476..624b0ec 100644 --- a/src/fragments/60/fragment60.c +++ b/src/fragments/60/fragment60.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E0036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E0036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E0045C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E0045C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00F2C.s") diff --git a/src/fragments/61/fragment61.c b/src/fragments/61/fragment61.c index a406489..40bd07a 100644 --- a/src/fragments/61/fragment61.c +++ b/src/fragments/61/fragment61.c @@ -1,458 +1,457 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842000C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842000C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842000F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842000F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842001B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842001B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420092C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420092C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420112C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420112C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420192C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420192C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201A00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201A00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201AD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201AD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842023E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842023E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842024DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842024DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420305C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420305C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420318C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420318C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842034E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842034E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842037AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842037AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842039B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842039B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203BBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203BBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420448C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420448C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204BF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204BF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204E0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204E0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842050CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842050CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420545C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420545C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420563C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420563C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420570C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420570C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842057AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842057AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420594C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420594C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842062D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842062D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842068DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842068DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206BF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206D10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206D10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206DE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206DE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206E88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206E88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206FF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206FF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420720C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420720C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842073A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842073A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842076A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842076A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842076F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842076F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420776C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420776C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842078C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842078C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842079B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842079B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842079F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842079F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207E3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207E3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420804C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420804C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842081A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842081A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842081B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842081B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842082D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842082D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842084BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842084BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842088A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842088A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209340.s") -void func_84209CEC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A0BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A0BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A1B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A3E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A3E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A4B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A4B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A678.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A678.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A7D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A7D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A9B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A9B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AA08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AA08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AB50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AB50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420ABC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420ABC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AC00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AC00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420ACA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420ACA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AF1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AF1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B0C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B0C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B1D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B1D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B20C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B20C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B5A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B5A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B71C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B71C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B8CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B8CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C4DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C4DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C60C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C60C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C6D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C6D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CA00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CA00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CAD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CAD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CC54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CC54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CCAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CCAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CE24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CE24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D2BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D2BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D4F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D75C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D75C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D9B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D9B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DA28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DA28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DAF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DAF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DB48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DB48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DC78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DC78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DD14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DD14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420E46C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420E46C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420E63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420E63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420EA88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420EA88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420EB7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420EB7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420ED0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420ED0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420EE54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420EE54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F1BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F1BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F1E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F1E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F4FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F4FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F53C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F53C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F5F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F5F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F86C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F86C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F9C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F9C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FA88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FA88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FB4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FB4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FC0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FC0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FCCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FCCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FDDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FDDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FE50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FE50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FEC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FEC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421009C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421009C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421015C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421015C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421059C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421059C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842106FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842106FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421089C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421089C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210C80.s") diff --git a/src/fragments/62/fragment62.c b/src/fragments/62/fragment62.c index 467dc87..0373c76 100644 --- a/src/fragments/62/fragment62.c +++ b/src/fragments/62/fragment62.c @@ -1,4036 +1,4027 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843000C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843000C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430012C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430012C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843001FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843001FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300B34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300B34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300D44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300D44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300E88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300E88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843010EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843010EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430123C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430123C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430128C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430128C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843013E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843013E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301430.s") -void func_84301A24(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301DDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301DDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430203C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430203C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843020B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843020B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843020F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843020F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843021E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843021E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430245C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430245C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430255C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430255C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843025BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843025BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843029D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843029D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430305C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430305C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843031A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843031A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430334C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430334C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843033E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843033E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843034D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843034D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843037CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843037CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303BB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303BB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843043FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843043FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843045DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843045DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843046BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843046BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843048C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843048C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843049FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843049FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304F54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304F54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430506C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430506C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843052C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843052C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843054F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843054F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843055E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843055E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843056DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843056DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843056E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843056E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843058A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843058A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843058C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843058C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843059C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843059C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305CAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305CAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430602C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430602C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843060EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843060EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843061EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843061EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843062F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843062F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306584.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306584.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843065C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843065C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430663C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430663C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843066E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843066E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306DA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306DA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843071B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843071B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430732C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430732C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430741C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430741C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430742C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430742C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430743C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430743C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430744C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430744C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430745C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430745C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430746C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430746C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430748C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430748C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843074A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843074A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843074EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843074EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843074F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843074F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430751C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430751C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430753C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430753C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430754C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430754C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843075D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843075D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843077B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843077B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843078F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843078F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843079C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843079C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430808C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430808C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843083A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843083A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843085C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843085C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843085E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843085E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843085F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843085F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430862C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430862C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843087F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843087F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430897C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430897C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843089DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843089DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843089F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843089F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843089FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843089FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308A4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308A4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308BD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308BD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308D54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308D54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308ED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308ED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430920C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430920C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843092B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843092B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843093F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843093F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843095A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843095A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843096EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843096EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309A24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A17C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A17C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A22C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A22C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A3E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A3E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A4E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A4E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A6AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A6AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A7BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A7BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A8DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A8DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AA18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AA84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AA84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AB00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AB00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430ABF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430ABF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AD10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AD10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AD7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AD7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430ADE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430ADE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AF08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AF08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AF80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AF80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B104.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B104.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B2AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B2AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B3C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B3C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B6F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B6F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B8FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B8FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BB0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BB0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BB24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BB24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BBE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BBE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BC44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BC44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BD9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BD9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BDB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BDB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BDBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BDBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BE08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BE08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BEC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BEC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C138.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C138.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C19C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C19C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C1E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C1E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C4F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C59C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C59C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C7B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C7B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C7E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C7E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C8A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C8A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CA4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CA4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CB3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CB3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CC84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CC84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CCC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CCC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CD0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CD0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CDAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CDAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D02C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D02C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D6D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D6D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D8C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D8C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D9EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D9EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DE20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DE20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DF60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DF60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DFCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DFCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E1CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E1CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E5AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E5AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E72C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E72C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EB1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EB1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EBA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EBA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430ED88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430ED88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EE50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EE50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EF4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EF4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F0C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F0C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F27C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F27C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F4AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F4AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F5F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F5F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F8B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F8B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FB20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FB20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FB68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FB68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FC28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FC28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310368.s") -void func_843109EC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843109EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843109F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843109F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843112C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843112C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843116D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843116D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843118A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843118A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843128A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843128A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843133B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843133B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843135B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843135B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431379C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431379C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431493C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431493C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84314B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84314B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84314B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84314B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84314F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84314F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431524C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431524C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431595C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431595C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315BC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843160C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843160C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843161F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843161F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843162E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843162E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843163C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843163C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84316610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84316610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84316640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84316640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843167D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843167D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431694C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431694C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84316A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84316A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431712C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431712C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843172A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843172A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431790C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431790C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843179F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843179F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317EDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317EDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843180AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843180AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843184E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843184E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843184FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843184FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84318514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84318514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84318640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84318640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84318CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84318CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843190A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843190A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843193F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843193F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319408.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843194A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843194A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431962C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431962C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843196A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843196A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843197A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843197A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319878.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319878.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843198EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843198EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431995C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431995C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319AE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A1C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A1C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A2C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A2C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A4C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A4C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A7B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A7B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A8B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A8B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A94C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A94C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A9E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A9E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AA3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AA3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AA78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AA78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AAAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AAAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AAFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AAFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AD20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AD20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AD68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AD68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431ADAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431ADAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431ADF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431ADF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AF58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AF58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AFB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AFB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AFD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AFD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AFE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AFE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B34C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B34C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B42C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B42C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B4C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B4C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BA5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BA5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BB24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BB24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BB80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BB80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BBDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BBDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BCA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BCA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BD10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BD10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BD18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BD18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BD94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BD94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C71C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C71C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C8E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C8E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CB54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CB54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CCFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CCFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CEF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CEF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CFA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CFA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D318.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D318.s") -void func_8431D5C8(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D5C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D5D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D5D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D764.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D764.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D7C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D7C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D7D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D7D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DA38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DA38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DC78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DC78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DF98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DF98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E1DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E1DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E4DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E4DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E7D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E7D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E90C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E90C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EBD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EBD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431ECEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431ECEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EE08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EE08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FC74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FC74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FCCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FCCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FFD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FFD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843200B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843200B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843202A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843202A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432056C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432056C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843206B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843206B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432079C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432079C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320864.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320864.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843208B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843208B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432103C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432103C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843210BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843210BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432113C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432113C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843221A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843221A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843223FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843223FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843224C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843224C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843226A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843226A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843226E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843226E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843229A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843229A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843230D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843230D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843233E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843233E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843234A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843234A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843234FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843234FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843235F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843235F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843239EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843239EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843248B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843248B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843249F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843249F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843251D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843251D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843255DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843255DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325724.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325724.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325CAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325CAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325CDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325CDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843261CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843261CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843266D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843266D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432691C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432691C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432734C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432734C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843275F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843275F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327B90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328BF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843290A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843290A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843292D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843292D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843293A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843293A8.s") -void func_843293B0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843293B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843293B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843293B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843294A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843294A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843295D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843295D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843296B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843296B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A2D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A2D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A41C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A41C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A4B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A4B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ABBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ABBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ADD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ADD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432AEE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432AEE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432AF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432AF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B13C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B13C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B1BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B1BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B38C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B38C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B4B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B4B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B4D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B4D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B4F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B4F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B588.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B588.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B5B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B5B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432BBC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432BBC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432BF88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432BF88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C0D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C0D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C14C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C14C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C1E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C1E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C3F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C3F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C4CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C4CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C6C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C6C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C7A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C7A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C80C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C80C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C86C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C86C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C8BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C8BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C9C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C9C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CA48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CA48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CAD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CAD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CB60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CB60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CB68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CB68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CBF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CBF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CC54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CC54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CD14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CD14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CEF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CEF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CF74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CF74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CFCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CFCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D0D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D0D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D4F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D4F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D55C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D55C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D5B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D5B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D61C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D61C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D6B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D6B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D6C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D6C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D9BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D9BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DA64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DA64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DAEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DAEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DE0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DE0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E4B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E4B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E5A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E5A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E6B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E6B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E8B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E8B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E8BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E8BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E8EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E8EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E99C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E99C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E9AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E9AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E9B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E9B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EA60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EA60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EC28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EC28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ECA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ECA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ED0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ED0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ED74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ED74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EDE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EDE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EE5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EE5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EF40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EF40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EFB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EFB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F104.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F104.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F1E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F1E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F2C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F2C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F3C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F3C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F4BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F4BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F5B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F5B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F6B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F6B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F7A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F7A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F93C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F93C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FA0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FA0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FA30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FA30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FA54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FA54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FB38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FB38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FBBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FBBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FCB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FCB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FCF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FCF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FDF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FDF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FE24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FE24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FE44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FE44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FEC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FEC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843300B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843300B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433010C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433010C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843304AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843304AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433079C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433079C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330B18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330B18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330F4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330F4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843310A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843310A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843311D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843311D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433157C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433157C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843316A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843316A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843317D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843317D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843318F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843318F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843320A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843320A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843321BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843321BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433227C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433227C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843322C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843322C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433237C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433237C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843323BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843323BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843324A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843324A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843324EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843324EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843325C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843325C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843326EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843326EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843327B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843327B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843328A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843328A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332AD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332AD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332BA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332BA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332F90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332F90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843330A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843330A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843332B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843332B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843334DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843334DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433378C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433378C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843340B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843340B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843343F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843343F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843344A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843344A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843345A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843345A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843346BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843346BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843347A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843347A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843348DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843348DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433507C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433507C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843351C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843351C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843352AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843352AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843353C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843353C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843354E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843354E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433574C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433574C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433595C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433595C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335A84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335A84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335D10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335D10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335EF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335EF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433617C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433617C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433661C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433661C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433679C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433679C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843369AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843369AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336DD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336DD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843371C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843371C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843372D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843372D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843374A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843374A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843375B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843375B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433766C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433766C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843378D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843378D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337F6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337F6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843380B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843380B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843380F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843380F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433837C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433837C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843386B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843386B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843388A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843388A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338B44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338B44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433903C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433903C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843390E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843390E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433913C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433913C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843393E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843393E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843394D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843394D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433958C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433958C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843397A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843397A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843398F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843398F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339CDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339CDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339E38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339E38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A0E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A0E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A378.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A378.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A4D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A4D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A5C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A5C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A954.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A954.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AA28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AA28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AB08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AB08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AC00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AC00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433ADE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433ADE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B2E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B2E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B3D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B3D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B4AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B4AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B58C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B58C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B6FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B6FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B7E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B7E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BB78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BB78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BD08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BD08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BDFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BDFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C06C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C06C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CAFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CAFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CCFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CCFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CDAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CDAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CEA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CEA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CEFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CEFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CFA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CFA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D3B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D3B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D6EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D6EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D90C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D90C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DA54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DA54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DAF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DAF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DBDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DBDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DC80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DC80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DFF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DFF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E33C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E33C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E46C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E46C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E8A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E8A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EA04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EA04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EB0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EB0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EB9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EB9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433ED3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433ED3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EE10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EE10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F06C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F06C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F4CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F4CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F5B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F5B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FAF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FAF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FD30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FD30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FD80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FD80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FDC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FDC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FE80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FE80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FF44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FF44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843400BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843400BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434016C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434016C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843403D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843403D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340D14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340D14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340E40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843416B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843416B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434171C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434171C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434174C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434174C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843417AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843417AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843418C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843418C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434234C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434234C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843423C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843423C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434261C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434261C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843431B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843431B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843432E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843432E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434411C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434411C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843441F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843441F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344318.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344318.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843443E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843443E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434459C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434459C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843445E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843445E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843448D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843448D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434495C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434495C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344A4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344A4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344CE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344CE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344DA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344DA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344E20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344F58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344F58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843450B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843450B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434523C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434523C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843452F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843452F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434539C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434539C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843453E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843453E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843456DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843456DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434575C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434575C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843459A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843459A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345E3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345E3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434605C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434605C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843460EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843460EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843461D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843461D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843463C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843463C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434669C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434669C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843466EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843466EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843467B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843467B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843467F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843467F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843469A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843469A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434719C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434719C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434729C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434729C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843473BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843473BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434749C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434749C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843476D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843476D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434775C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434775C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843477F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843477F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843482D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843482D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843483D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843483D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348630.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348630.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843489FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843489FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348D4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348D4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843490A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843490A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434915C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434915C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434917C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434917C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843491D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843491D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843492AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843492AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434933C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434933C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843494AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843494AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843495F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843495F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434967C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434967C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843497A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843497A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843498D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843498D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349AE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349D10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349D10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A18C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A18C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A1D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A1D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A2B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A2B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A6D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A6D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A7DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A7DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A9CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A9CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A9EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A9EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AA6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AA6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AAEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AAEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AC44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AC44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AC8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AC8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ACEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ACEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AD1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AD1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AE68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AE68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B0D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B0D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B14C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B14C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B21C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B21C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BA28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BA28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BA70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BA70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BF2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BF2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C0C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C0C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C29C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C29C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C3A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C3A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C3F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C3F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C5F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C5F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CA48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CA48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CA90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CA90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CAD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CAD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CC68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CC68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CE14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CE14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CF64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CF64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D0F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D0F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D1B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D2E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D2E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D4A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D4A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D5EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D5EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D72C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D72C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D77C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D77C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D8D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D8D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D9F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D9F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DA94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DA94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DB40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DB40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DD08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DD08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DE24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DE24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DE6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DE6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DFC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DFC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E02C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E02C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E0CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E0CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E21C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E21C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E6AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E6AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E6F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E6F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E74C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E74C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E7CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E7CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E8E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E8E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E9A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E9A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EA10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EA10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EC08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EC08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EC68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EC68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ECF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ECF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ED48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ED48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ED70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ED70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EEA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EEA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F0B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F0B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F3E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F3E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FA98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FA98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FB3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FB3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FBE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FBE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FD6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FD6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FE58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FE58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FF40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FF40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435000C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435000C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843501CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843501CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435043C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435043C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843508F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843508F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350CD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350CD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843512AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843512AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843513F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843513F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843514B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843514B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843515C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843515C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843516A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843516A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435226C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435226C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435235C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435235C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843526A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843526A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843529D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843529D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352F90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352F90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435324C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435324C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843532B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843532B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843534BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843534BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843535F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843535F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435375C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435375C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353BD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353BD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353E10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353E10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843540FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843540FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354D58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354D58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354FA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354FA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843553BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843553BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355584.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355584.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435581C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435581C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435586C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435586C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435593C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435593C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355B08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355B08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355F88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355F88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843560B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843560B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843561A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843561A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843561F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843561F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435643C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435643C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843565DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843565DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843566F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843566F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435674C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435674C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843567F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843567F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843568C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843568C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843569A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843569A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356AC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356AC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435727C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435727C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435742C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435742C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843574FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843574FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435783C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435783C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843579C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843579C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357B80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357B80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357CC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357CC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435811C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435811C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843581FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843581FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435839C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435839C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843584C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843584C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843588D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843588D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358DE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358DE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358EDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358EDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358F6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358F6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843590E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843590E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843592E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843592E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359338.s") -void func_84359340(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843596DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843596DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843596FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843596FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843597AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843597AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843597CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843597CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435989C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435989C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843598BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843598BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359910.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359910.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435998C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435998C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843599AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843599AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359A00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359A00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359A8C.s") -void func_84359AE0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AE8.s") -void func_84359AF0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A0D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A0D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A2CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A2CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A33C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A33C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A42C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A42C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A4F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A56C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A56C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A6F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A6F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A72C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A72C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A79C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A79C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A7F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A7F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A81C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A81C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A99C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A99C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A9F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A9F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AB9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AB9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ABF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ABF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ACC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ACC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ACE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ACE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AD38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AD38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AD68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AD68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AD88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AD88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ADDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ADDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AE08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AE08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B0B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B0B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B0DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B0DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B2C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B2C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B408.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B4A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B4A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B5B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B5B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B918.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B918.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B98C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B98C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BB98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BB98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BF08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BF08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BF28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BF28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BF7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BF7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C2C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C2C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C96C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C96C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C9AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C9AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CA08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CA08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CA70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CA70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CAE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CAE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D1E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D1E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D24C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D24C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D8C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D8C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435DB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435DB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435DED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435DED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435E158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435E158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435E530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435E530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435EB9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435EB9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435EDF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435EDF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435EE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435EE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435FB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435FB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435FCD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435FCD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435FD50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435FD50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843605C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843605C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843606D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843606D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436090C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436090C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84360B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84360B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84360EFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84360EFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843612F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843612F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843616B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843616B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84361744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84361744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84361FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84361FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84362084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84362084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843638E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843638E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84363A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84363A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84363FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84363FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843640A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843640A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843648E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843648E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843651D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843651D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436611C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436611C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843661D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843661D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436643C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436643C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366DCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366DCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843670C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843670C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843684CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843684CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843692E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843692E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843697F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843697F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369BF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436ABA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436ABA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436AC44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436AC44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B5C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B5C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B8D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B8D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436BE70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436BE70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436BFB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436BFB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C3CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C3CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C62C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C62C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C6A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C6A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436CB60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436CB60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436CE34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436CE34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436D370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436D370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436D4A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436D4A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436D920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436D920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DA38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DA38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DAC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DAC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DE60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DE60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DFB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DFB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E0E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E0E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E3BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E3BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EA0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EA0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EB54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EB54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436ECB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436ECB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EDE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EDE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EEE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EEE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EEF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EEF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EF48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EF48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EFE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EFE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F664.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F664.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F6C0.s") -void func_8436F6D0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F6D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F6D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F6D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FA80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FA80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FC7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FC7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FD54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FD54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FD9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FD9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FDBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FDBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FDF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FDF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843700F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843700F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843703BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843703BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843706E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843706E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843708A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843708A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843708CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843708CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370B44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370B44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437114C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437114C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843712CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843712CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843714D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843714D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843715C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843715C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437166C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437166C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437176C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437176C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843718E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843718E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371DCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371DCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843732B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843732B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437345C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437345C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843736B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843736B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843741C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843741C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843744F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843744F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437483C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437483C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374D58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374D58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374E08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374E08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843751F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843751F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843752C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843752C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843755E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843755E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843759C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843759C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843759DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843759DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843759F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843759F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375C60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375C60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375DA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375DA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437600C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437600C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843765E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843765E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437670C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437670C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843767E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843767E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843768D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843768D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376E40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437717C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437717C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843772E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843772E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437731C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437731C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437738C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437738C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843776FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843776FC.s") -void func_843779C0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843779C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843779C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843779C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843780FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843780FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437828C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437828C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843783CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843783CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437865C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437865C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843787F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843787F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843791AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843791AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843791E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843791E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84379224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84379224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843793E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843793E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843794CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843794CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437AC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437AC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437ACB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437ACB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437AEA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437AEA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437B0CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437B0CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437ECFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437ECFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437ED54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437ED54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437EDB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437EDB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437EFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437EFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437F068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437F068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437F2EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437F2EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437F85C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437F85C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FCCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FCCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FD74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FD74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843804F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843804F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843811D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843811D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843813D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843813D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381584.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381584.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381DD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843820B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843820B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438220C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438220C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438223C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438223C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438249C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438249C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438255C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438255C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843825D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843825D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843831A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843831A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438363C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438363C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84383B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84383B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84384124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84384124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843841C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843841C4.s") diff --git a/src/fragments/63/fragment63.c b/src/fragments/63/fragment63.c index 0cd282e..5c1d013 100644 --- a/src/fragments/63/fragment63.c +++ b/src/fragments/63/fragment63.c @@ -1,409 +1,409 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B000F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B000F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B001D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B001D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0037C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0037C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B003D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B003D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B004C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B004C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0053C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0053C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0117C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0117C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B014DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B014DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B016F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B016F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0174C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0174C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B017AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B017AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01AA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01AA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01C2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01C2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0204C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0204C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B021FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B021FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B022A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B022A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B023C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B023C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B025D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B025D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02E5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02E5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B033E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B033E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0345C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0345C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B038F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B038F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03CC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03CC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B040AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B040AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04798.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04798.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0492C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0492C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04CCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04CCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0509C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0509C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B050AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B050AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0535C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0535C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B053F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B053F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B055B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B055B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05FCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05FCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B062E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B062E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B064FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B064FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B067B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B067B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06E08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06E08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B070EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B070EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B071C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B071C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B073D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B073D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07CF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07CF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B080F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B080F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B083D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B083D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0852C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0852C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08954.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08954.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08D54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08D54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B091A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B091A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0962C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0962C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B099D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B099D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A18C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A18C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A1F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A1F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A36C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A36C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A82C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A82C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A9D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A9D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AC60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AC60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AD48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AD48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AF48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AF48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B05C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B05C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B6EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B6EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B7F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B7F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BC6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BC6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BDCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BDCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BE28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BE28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BF10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BF10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BFE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BFE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C3A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C3A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C45C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C45C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C5E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C5E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C6B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C6B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C7D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C7D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CA34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CA34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CBCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CBCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CC7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CC7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CCFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CCFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CDEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CDEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D31C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D31C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D3E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D3E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D4B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D4B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D54C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D54C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D7A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D7A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D878.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D878.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D8F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D8F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DA90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DA90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DAA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DAA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DB30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DB30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DD5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DD5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DE04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DE04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E2D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E50C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E50C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0EC18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0EC18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0ECE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0ECE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0EF14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0EF14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F6C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F6C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F8BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F8BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0FACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0FACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0FADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0FADC.s") diff --git a/src/fragments/64/fragment64.c b/src/fragments/64/fragment64.c index 9170099..636aaa7 100644 --- a/src/fragments/64/fragment64.c +++ b/src/fragments/64/fragment64.c @@ -1,73 +1,73 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480067C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480067C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848007B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848007B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848009E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848009E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800C68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800C68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848012A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848012A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84801340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84801340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848015F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848015F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84801800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84801800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84801A88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84801A88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480218C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480218C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480225C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480225C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480247C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480247C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848025A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848025A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848027F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848027F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480290C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480290C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84803110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84803110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84803368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84803368.s") diff --git a/src/fragments/65/fragment65.c b/src/fragments/65/fragment65.c index 97015af..3ce294c 100644 --- a/src/fragments/65/fragment65.c +++ b/src/fragments/65/fragment65.c @@ -1,47 +1,47 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A003BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A003BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A008A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A008A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00B44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00B44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00FEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00FEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A012B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A012B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A0207C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A0207C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02D14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02D14.s") diff --git a/src/fragments/66/fragment66.c b/src/fragments/66/fragment66.c index be17e27..8e528ba 100644 --- a/src/fragments/66/fragment66.c +++ b/src/fragments/66/fragment66.c @@ -1,59 +1,59 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832000A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832000A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320029C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320029C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320037C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320037C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320058C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320058C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832005E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832005E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832007A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832007A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320084C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320084C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200CD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200CD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200FF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200FF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832010BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832010BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320118C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320118C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320126C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320126C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832016F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832016F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832018DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832018DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201DD4.s") diff --git a/src/fragments/67/fragment67.c b/src/fragments/67/fragment67.c index 751562d..143b51b 100644 --- a/src/fragments/67/fragment67.c +++ b/src/fragments/67/fragment67.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/67/fragment67/func_8F000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/67/fragment67/func_8F000020.s") diff --git a/src/fragments/68/fragment68.c b/src/fragments/68/fragment68.c index 76ff4cc..c421f1b 100644 --- a/src/fragments/68/fragment68.c +++ b/src/fragments/68/fragment68.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/68/fragment68/func_8F100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/68/fragment68/func_8F100020.s") diff --git a/src/fragments/69/fragment69.c b/src/fragments/69/fragment69.c index b7db25c..26d098c 100644 --- a/src/fragments/69/fragment69.c +++ b/src/fragments/69/fragment69.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/69/fragment69/func_8F200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/69/fragment69/func_8F200020.s") diff --git a/src/fragments/7/fragment7.c b/src/fragments/7/fragment7.c index 6641dca..2c269fc 100644 --- a/src/fragments/7/fragment7.c +++ b/src/fragments/7/fragment7.c @@ -1,115 +1,115 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100798.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100798.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861017E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861017E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610197C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610197C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101DD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101F88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101F88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861020E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861020E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610228C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610228C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861023E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861023E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610268C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610268C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861029E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861029E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102FDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102FDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861032D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861032D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861035B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861035B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610426C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610426C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86104380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86104380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86104474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86104474.s") diff --git a/src/fragments/70/fragment70.c b/src/fragments/70/fragment70.c index 7730bec..52cecd7 100644 --- a/src/fragments/70/fragment70.c +++ b/src/fragments/70/fragment70.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/70/fragment70/func_8F300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/70/fragment70/func_8F300020.s") diff --git a/src/fragments/71/fragment71.c b/src/fragments/71/fragment71.c index ae3a9dc..5107b30 100644 --- a/src/fragments/71/fragment71.c +++ b/src/fragments/71/fragment71.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/71/fragment71/func_8F400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/71/fragment71/func_8F400020.s") diff --git a/src/fragments/72/fragment72.c b/src/fragments/72/fragment72.c index d4fd9c8..cb55caa 100644 --- a/src/fragments/72/fragment72.c +++ b/src/fragments/72/fragment72.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/72/fragment72/func_8F500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/72/fragment72/func_8F500020.s") diff --git a/src/fragments/73/fragment73.c b/src/fragments/73/fragment73.c index d797202..c92bf1c 100644 --- a/src/fragments/73/fragment73.c +++ b/src/fragments/73/fragment73.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/73/fragment73/func_8F600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/73/fragment73/func_8F600020.s") diff --git a/src/fragments/74/fragment74.c b/src/fragments/74/fragment74.c index a9a7a0f..cf0b6ed 100644 --- a/src/fragments/74/fragment74.c +++ b/src/fragments/74/fragment74.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/74/fragment74/func_8F700020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/74/fragment74/func_8F700020.s") diff --git a/src/fragments/75/fragment75.c b/src/fragments/75/fragment75.c index d5293c9..bd65228 100644 --- a/src/fragments/75/fragment75.c +++ b/src/fragments/75/fragment75.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA0047C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA0047C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA00510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA00510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA0051C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA0051C.s") diff --git a/src/fragments/76/fragment76.c b/src/fragments/76/fragment76.c index 6c33574..22d2290 100644 --- a/src/fragments/76/fragment76.c +++ b/src/fragments/76/fragment76.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/76/fragment76/func_8FB00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/76/fragment76/func_8FB00020.s") diff --git a/src/fragments/77/fragment77.c b/src/fragments/77/fragment77.c index b36aed7..8871126 100644 --- a/src/fragments/77/fragment77.c +++ b/src/fragments/77/fragment77.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/77/fragment77/func_8FC00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/77/fragment77/func_8FC00020.s") diff --git a/src/fragments/8/fragment8.c b/src/fragments/8/fragment8.c index 4f09447..f369b5b 100644 --- a/src/fragments/8/fragment8.c +++ b/src/fragments/8/fragment8.c @@ -1,60 +1,59 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200034.s") -void func_862002EC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862002EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862002F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862002F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862004D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862004D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862011E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862011E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862013C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862013C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862015A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862015A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862015C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862015C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201900.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201900.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201CD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201CD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862022CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862022CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862023F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862023F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202F3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202F3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86203008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86203008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862030D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862030D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86203380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86203380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_8620369C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_8620369C.s") diff --git a/src/fragments/9/fragment9.c b/src/fragments/9/fragment9.c index dda921f..bf404f9 100644 --- a/src/fragments/9/fragment9.c +++ b/src/fragments/9/fragment9.c @@ -1,31 +1,31 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_8630011C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_8630011C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863006D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863006D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300764.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300764.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863008C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863008C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863009FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863009FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863011C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863011C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301474.s") diff --git a/src/libleo/driverominit.c b/src/libleo/driverominit.c index 565532f..c1609ee 100644 --- a/src/libleo/driverominit.c +++ b/src/libleo/driverominit.c @@ -4,7 +4,7 @@ void __osPiRelAccess(void); void __osPiGetAccess(void); -OSPiHandle __DriveRomHandle; +OSPiHandle DriveRomHandle; OSPiHandle* osDriveRomInit(void) { register s32 status; @@ -16,15 +16,15 @@ OSPiHandle* osDriveRomInit(void) { __osPiGetAccess(); if (!first) { __osPiRelAccess(); - return &__DriveRomHandle; + return &DriveRomHandle; } first = 0; - __DriveRomHandle.type = DEVICE_TYPE_BULK; - __DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1); - __DriveRomHandle.domain = PI_DOMAIN1; - __DriveRomHandle.speed = 0; - bzero(&__DriveRomHandle.transferInfo, sizeof(__OSTranxInfo)); + DriveRomHandle.type = DEVICE_TYPE_BULK; + DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1); + DriveRomHandle.domain = PI_DOMAIN1; + DriveRomHandle.speed = 0; + bzero(&DriveRomHandle.transferInfo, sizeof(__OSTranxInfo)); while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {} @@ -40,12 +40,12 @@ OSPiHandle* osDriveRomInit(void) { HW_REG(PI_BSD_DOM1_RLS_REG, u32) = 3; HW_REG(PI_BSD_DOM1_PWD_REG, u32) = 0xff; - // Read the PI settings from DDROM and put it in __DriveRomHandle - value = HW_REG(__DriveRomHandle.baseAddress, u32); - __DriveRomHandle.latency = value & 0xFF; - __DriveRomHandle.pageSize = (value >> 0x10) & 0xF; - __DriveRomHandle.relDuration = (value >> 0x14) & 0xF; - __DriveRomHandle.pulse = (value >> 8) & 0xFF; + // Read the PI settings from DDROM and put it in DriveRomHandle + value = HW_REG(DriveRomHandle.baseAddress, u32); + DriveRomHandle.latency = value & 0xFF; + DriveRomHandle.pageSize = (value >> 0x10) & 0xF; + DriveRomHandle.relDuration = (value >> 0x14) & 0xF; + DriveRomHandle.pulse = (value >> 8) & 0xFF; // Put back the previous PI settings HW_REG(PI_BSD_DOM1_LAT_REG, u32) = latency; @@ -54,10 +54,10 @@ OSPiHandle* osDriveRomInit(void) { HW_REG(PI_BSD_DOM1_PWD_REG, u32) = pulse; saveMask = __osDisableInt(); - __DriveRomHandle.next = __osPiTable; - __osPiTable = &__DriveRomHandle; + DriveRomHandle.next = __osPiTable; + __osPiTable = &DriveRomHandle; __osRestoreInt(saveMask); __osPiRelAccess(); - return &__DriveRomHandle; + return &DriveRomHandle; } diff --git a/src/libleo/leocmdex.c b/src/libleo/leocmdex.c index 54d759f..dec3007 100644 --- a/src/libleo/leocmdex.c +++ b/src/libleo/leocmdex.c @@ -7,7 +7,7 @@ extern u16 LEOrw_flags; // D_8007DA40 const u8 leo_sys_form_lbas[] = { 0, 1, 8, 9, 0, 0, 0, 0 }; // EXTRA 0 IS A HACK -#pragma GLOBAL_ASM("asm/nonmatchings/libleo/leocmdex/leomain.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/libleo/leocmdex/leomain.s") /*const LEOCmdRead leo_sys_read_cmd = { diff --git a/src/libleo/leodiskinit.c b/src/libleo/leodiskinit.c index eb77d93..1408bc8 100644 --- a/src/libleo/leodiskinit.c +++ b/src/libleo/leodiskinit.c @@ -7,7 +7,7 @@ extern OSPiHandle* __osDiskHandle; extern OSPiHandle* __osPiTable; OSPiHandle* osLeoDiskInit(void) { - u32 prevInt; + u32 saveMask; __LeoDiskHandle.type = DEVICE_TYPE_64DD; __LeoDiskHandle.baseAddress = PHYS_TO_K1(PI_DOM2_ADDR1); @@ -19,13 +19,12 @@ OSPiHandle* osLeoDiskInit(void) { __LeoDiskHandle.speed = 0; bzero(&__LeoDiskHandle.transferInfo, sizeof(__OSTranxInfo)); - prevInt = __osDisableInt(); - + + saveMask = __osDisableInt(); __LeoDiskHandle.next = __osPiTable; __osPiTable = &__LeoDiskHandle; __osDiskHandle = &__LeoDiskHandle; - - __osRestoreInt(prevInt); + __osRestoreInt(saveMask); return &__LeoDiskHandle; } diff --git a/src/libultra/al/.clang-format b/src/libultra/al/.clang-format deleted file mode 100644 index 15f9b6f..0000000 --- a/src/libultra/al/.clang-format +++ /dev/null @@ -1,2 +0,0 @@ -DisableFormat: true -SortIncludes: Never \ No newline at end of file diff --git a/src/libultra/al/sl.c b/src/libultra/al/sl.c deleted file mode 100644 index 5f9a9dc..0000000 --- a/src/libultra/al/sl.c +++ /dev/null @@ -1,40 +0,0 @@ -#include - -extern ALGlobals* D_80079640; - -void alUnlink(ALLink *ln) -{ - if (ln->next) { - ln->next->prev = ln->prev; - } - - if (ln->prev) { - ln->prev->next = ln->next; - } -} - -void alLink(ALLink *ln, ALLink *to) -{ - ln->next = to->next; - ln->prev = to; - - if (to->next) { - to->next->prev = ln; - } - - to->next = ln; -} - -void alClose(ALGlobals* glob) { - if (alGlobals != NULL) { - alSynDelete(&glob->drvr); - alGlobals = NULL; - } -} - -void alInit(ALGlobals* glob, ALSynConfig* c) { - if (alGlobals == NULL) { - alGlobals = glob; - alSynNew(&glob->drvr, c); - } -} diff --git a/src/libultra/gu/perspective.c b/src/libultra/gu/perspective.c deleted file mode 100644 index b7ce6a0..0000000 --- a/src/libultra/gu/perspective.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include "math.h" - -#define GU_PI 3.1415926 - -// todo, fix when pragma aliases this -extern float __cosf(float angle); - -void guPerspectiveF(f32 mf[4][4], u16* perspNorm, f32 fovy, f32 aspect, f32 near, f32 far, f32 scale) { - f32 yscale; - s32 row; - s32 col; - - guMtxIdentF(mf); - - fovy *= GU_PI / 180.0; - yscale = __cosf(fovy / 2) / sinf(fovy / 2); - mf[0][0] = yscale / aspect; - mf[1][1] = yscale; - mf[2][2] = (near + far) / (near - far); - mf[2][3] = -1; - mf[3][2] = 2 * near * far / (near - far); - mf[3][3] = 0.0f; - - for (row = 0; row < 4; row++) { - for (col = 0; col < 4; col++) { - mf[row][col] *= scale; - } - } - - if (perspNorm != NULL) { - if (near + far <= 2.0) { - *perspNorm = 65535; - } else { - *perspNorm = (f64)(1 << 17) / (near + far); - if (*perspNorm <= 0) { - *perspNorm = 1; - } - } - } -} -void guPerspective(Mtx* m, u16* perspNorm, f32 fovy, f32 aspect, f32 near, f32 far, f32 scale) { - f32 mf[4][4]; - - guPerspectiveF(mf, perspNorm, fovy, aspect, near, far, scale); - guMtxF2L((MtxF*)mf, m); -} diff --git a/src/libultra/gu/scale.c b/src/libultra/gu/scale.c deleted file mode 100644 index fdb838d..0000000 --- a/src/libultra/gu/scale.c +++ /dev/null @@ -1,20 +0,0 @@ -#include - -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) -{ - f32 mf[4][4]; - - guScaleF(mf, x, y, z); - - guMtxF2L(mf, m); -} diff --git a/src/libultra/gu/sinf.c b/src/libultra/gu/sinf.c deleted file mode 100644 index 2c21848..0000000 --- a/src/libultra/gu/sinf.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include "libc/math.h" -#include "macros.h" - -#pragma weak sinf = __sinf - -// Coefficients of a degree 9 polynomial approximation of sine. It is not the Maclaurin polynamial, but some as-yet -// undetermined more uniform approximation. -static const du P[] = { - { 1.0 }, - { -0.16666659550427756 }, - { 0.008333066246082155 }, - { -0.0001980960290193795 }, - { 0.000002605780637968037 }, -}; - -static const du rpi = { 1 / 3.14159265358979323846 }; // 1/M_PI, "reciprocal of pi" - -// pihi + pilo is the closest double to pi, this representation allows more precise calculations since pi itself is not -// an exact float -static const du pihi = { 3.1415926218032837 }; - -static const du pilo = { 3.178650954705639E-8 }; - -static const fu zero = { 0x00000000 }; - -/** - * Returns the sine of a float as a float, using the Maclaurin series and shifting. - */ -f32 __sinf(f32 x) { - f64 dx; // x promoted to double - f64 xSq; // square of dx - f64 polyApprox; // Most of the polynomial approximation to sin(x) - f64 dn; // n promoted to double - s32 n; // number of multiples of pi away from the first half-period - f64 result; - s32 ix = *(s32*)&x; // Type-pun x into an s32, i.e. its IEEE-754 hex representation - s32 xpt = (ix >> 22); // Obtain the exponent of x (actually 2 * exponent + 127) - - xpt &= 0x1FF; // Remove the sign bit - - // |x| < 1 - if (xpt < 255) { - dx = x; - - // |x| > 2^{-12}: for x smaller in magnitude than this, sin(x) - x is too small for a float to register the - // error - if (xpt >= 230) { - xSq = SQ(dx); - polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; - - result = dx + (dx * xSq) * polyApprox; - return (f32)result; - } - return x; - } - - // |x| < 2^{28} (beyond this range, floats are too sparse to make the trig functions useable) - if (xpt < 310) { - dx = x; - dn = dx * rpi.d; - n = ROUND(dn); - dn = n; - - // Bring x to the first half-period where the Maclaurin polynomial can be used - dx -= dn * pihi.d; - dx -= dn * pilo.d; - - xSq = SQ(dx); - polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; - result = dx + (dx * xSq) * polyApprox; // Actual Maclaurin polynomial for sin(x) - - // add a minus sign if x is an odd number of multiples of pi away from the first half-period - if (n % 2 == 0) { - return (f32)result; - } - return -(f32)result; - } - - // if x is NaN - if (x != x) { - return __libm_qnan_f; - } - - return zero.f; -} diff --git a/src/libultra/gu/sqrtf.c b/src/libultra/gu/sqrtf.c deleted file mode 100644 index 7cfab9c..0000000 --- a/src/libultra/gu/sqrtf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#pragma intrinsic(sqrtf) - -#ifndef __GNUC__ -#define __builtin_sqrtf sqrtf -#endif - -f32 sqrtf(f32 f) { - return __builtin_sqrtf(f); -} diff --git a/src/libultra/io/aisetfreq.c b/src/libultra/io/aisetfreq.c deleted file mode 100644 index fbd899d..0000000 --- a/src/libultra/io/aisetfreq.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "PR/rcp.h" - -extern s32 osViClock; - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -s32 osAiSetFrequency(u32 frequency) { - register unsigned int dacRate; - register unsigned char bitRate; - register float f; - - f = osViClock / (float)frequency + .5f; - dacRate = f; - - if (dacRate < AI_MIN_DAC_RATE) { - return -1; - } - - bitRate = dacRate / 66; - - if (bitRate > AI_MAX_BIT_RATE) { - bitRate = AI_MAX_BIT_RATE; - } - - IO_WRITE(AI_DACRATE_REG, dacRate - 1); - IO_WRITE(AI_BITRATE_REG, bitRate - 1); - // IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); - return osViClock / (s32)dacRate; -} diff --git a/src/libultra/io/aisetnextbuf.c b/src/libultra/io/aisetnextbuf.c deleted file mode 100644 index d789133..0000000 --- a/src/libultra/io/aisetnextbuf.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "../os/osint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -s32 osAiSetNextBuffer(void *bufPtr, u32 size) { - static u8 hdwrBugFlag = FALSE; - char *bptr; - - bptr = bufPtr; - - if (hdwrBugFlag) { - bptr -= 0x2000; - } - - if ((((u32)bufPtr + size) & 0x1fff) == 0) { - hdwrBugFlag = TRUE; - } else { - hdwrBugFlag = FALSE; - } - - if (__osAiDeviceBusy()) { - return -1; - } - - IO_WRITE(AI_DRAM_ADDR_REG, osVirtualToPhysical(bptr)); - IO_WRITE(AI_LEN_REG, size); - return 0; -} diff --git a/src/libultra/io/cartrominit.c b/src/libultra/io/cartrominit.c deleted file mode 100644 index 35d6e38..0000000 --- a/src/libultra/io/cartrominit.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include "PR/os_internal.h" -#include "PR/R4300.h" -#include "PR/rcp.h" - -OSPiHandle __CartRomHandle; -OSPiHandle *osCartRomInit(void) -{ - u32 value; - u32 saveMask; - static int first = 1; - register u32 stat; - u32 latency; - u32 pulse; - u32 pageSize; - u32 relDuration; - - __osPiGetAccess(); - - if (!first) { - __osPiRelAccess(); - return &__CartRomHandle; - } - - first = 0; - __CartRomHandle.type = DEVICE_TYPE_CART; - __CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); - __CartRomHandle.domain = PI_DOMAIN1; - __CartRomHandle.speed = 0; - - bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); - - while (stat = IO_READ(PI_STATUS_REG), stat & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { - ; - } - - latency = IO_READ(PI_BSD_DOM1_LAT_REG); - pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); - relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); - pulse = IO_READ(PI_BSD_DOM1_PWD_REG); - - IO_WRITE(PI_BSD_DOM1_LAT_REG, 0xFF); - IO_WRITE(PI_BSD_DOM1_PGS_REG, 0); - IO_WRITE(PI_BSD_DOM1_RLS_REG, 3); - IO_WRITE(PI_BSD_DOM1_PWD_REG, 0xFF); - - value = IO_READ(__CartRomHandle.baseAddress); - __CartRomHandle.latency = value & 0xFF; - __CartRomHandle.pageSize = (value >> 0x10) & 0xF; - __CartRomHandle.relDuration = (value >> 0x14) & 0xF; - __CartRomHandle.pulse = (value >> 8) & 0xFF; - - IO_WRITE(PI_BSD_DOM1_LAT_REG, latency); - IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize); - IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration); - IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse); - - saveMask = __osDisableInt(); - __CartRomHandle.next = __osPiTable; - __osPiTable = &__CartRomHandle; - __osRestoreInt(saveMask); - __osPiRelAccess(); - - return &__CartRomHandle; -} diff --git a/src/libultra/io/conteeplongread.c b/src/libultra/io/conteeplongread.c deleted file mode 100644 index f7ca599..0000000 --- a/src/libultra/io/conteeplongread.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, int length) -{ - s32 ret; - ret = 0; - - while (length > 0) { - ERRCK(osEepromRead(mq, address, buffer)); - length -= EEPROM_BLOCK_SIZE; - address++; - buffer += EEPROM_BLOCK_SIZE; - } - - return ret; -} diff --git a/src/libultra/io/conteeplongwrite.c b/src/libultra/io/conteeplongwrite.c deleted file mode 100644 index 0124860..0000000 --- a/src/libultra/io/conteeplongwrite.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, int length) -{ - s32 ret; - ret = 0; - while (length > 0) - { - ERRCK(osEepromWrite(mq, address, buffer)); - length -= EEPROM_BLOCK_SIZE; - address++; - buffer += EEPROM_BLOCK_SIZE; - osSetTimer(&__osEepromTimer, 562500, 0, &__osEepromTimerQ, &__osEepromTimerMsg); - osRecvMesg(&__osEepromTimerQ, NULL, OS_MESG_BLOCK); - } - return ret; -} diff --git a/src/libultra/io/conteepprobe.c b/src/libultra/io/conteepprobe.c deleted file mode 100644 index 040fe47..0000000 --- a/src/libultra/io/conteepprobe.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -s32 osEepromProbe(OSMesgQueue *mq) -{ - s32 ret; - u16 type; - OSContStatus sdata; - ret = 0; - __osSiGetAccess(); - ret = __osEepStatus(mq, &sdata); - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - if (ret != 0) - { - ret = 0; - } - else - { - switch (type) - { - case CONT_EEPROM: - ret = EEPROM_TYPE_4K; - break; - case CONT_EEPROM | CONT_EEP16K: - ret = EEPROM_TYPE_16K; - break; - default: - ret = 0; - break; - } - } - __osSiRelAccess(); - return ret; -} diff --git a/src/libultra/io/conteepread.c b/src/libultra/io/conteepread.c deleted file mode 100644 index b42b0b2..0000000 --- a/src/libultra/io/conteepread.c +++ /dev/null @@ -1,106 +0,0 @@ -#include -#include "PR/rcp.h" -#include "ultra64/controller.h" -#include "siint.h" - -void __osPackEepReadData(u8 address); -OSPifRam __osEepPifRam; - -#define CONT_RANGE_ERROR -1 - -s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) -{ - s32 ret; - int i; - u16 type; - u8 *ptr; - OSContStatus sdata; - __OSContEepromFormat eepromformat; - ret = 0; - i = 0; - ptr = (u8 *)&__osEepPifRam.ramarray; - __osSiGetAccess(); - ret = __osEepStatus(mq, &sdata); - - if (ret == 0) { - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - - switch (type) { - case CONT_EEPROM: - // @bug: Should be > EEPROM_MAXBLOCKS - if (address >= EEPROM_MAXBLOCKS) { - ret = -1; - } - break; - case CONT_EEPROM | CONT_EEP16K: - // @bug: Should be > EEP16K_MAXBLOCKS - if (address >= EEP16K_MAXBLOCKS) { - ret = -1; - } else { - // __osEepromRead16K support seems to have been removed from this particular - // revision. - //__osEepromRead16K = -1; - } - break; - default: - ret = CONT_NO_RESPONSE_ERROR; - } - } - - if (ret != 0) { - __osSiRelAccess(); - return ret; - } - - while (sdata.status & CONT_EEPROM_BUSY) { - __osEepStatus(mq, &sdata); - } - - __osPackEepReadData(address); - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); - __osContLastCmd = CONT_CMD_READ_EEPROM; - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - for (i = 0; i < 4; i++) { - ptr++; - } - - eepromformat = *(__OSContEepromFormat *)ptr; - - ret = CHNL_ERR(eepromformat); - - if (ret == 0) { - for (i = 0; i < ARRLEN(eepromformat.data); i++) { - *buffer++ = eepromformat.data[i]; - } - } - - __osSiRelAccess(); - - return ret; -} - -void __osPackEepReadData(u8 address) { - u8 *ptr = (u8 *)&__osEepPifRam.ramarray; - __OSContEepromFormat eepromformat; - int i; - - __osEepPifRam.pifstatus = CONT_CMD_EXE; - - eepromformat.txsize = CONT_CMD_READ_EEPROM_TX; - eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX; - eepromformat.cmd = CONT_CMD_READ_EEPROM; - eepromformat.address = address; - - for (i = 0; i < MAXCONTROLLERS; i++) { - *ptr++ = 0; - } - - *(__OSContEepromFormat *)(ptr) = eepromformat; - ptr += sizeof(__OSContEepromFormat); - ptr[0] = CONT_CMD_END; -} diff --git a/src/libultra/io/conteepwrite.c b/src/libultra/io/conteepwrite.c deleted file mode 100644 index 705f74d..0000000 --- a/src/libultra/io/conteepwrite.c +++ /dev/null @@ -1,157 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" -#include - -void __osPackEepWriteData(u8 address, u8 *buffer); - -s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) -{ - s32 ret; - u16 type; - u8 *ptr; - __OSContEepromFormat eepromformat; - OSContStatus sdata; - - ret = 0; - ptr = (u8 *)&__osEepPifRam.ramarray; - __osSiGetAccess(); - ret = __osEepStatus(mq, &sdata); - - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - - if (ret == 0) { - switch (type) { - case CONT_EEPROM: - // @bug: Should be > EEPROM_MAXBLOCKS - if (address >= EEPROM_MAXBLOCKS) { - ret = -1; - } - break; - case CONT_EEPROM | CONT_EEP16K: - // @bug: Should be > EEP16K_MAXBLOCKS - if (address >= EEP16K_MAXBLOCKS) { - ret = -1; - } - break; - default: - if (1); - ret = CONT_NO_RESPONSE_ERROR; - break; - } - } - - if (ret != 0) { - __osSiRelAccess(); - return ret; - } - - while (sdata.status & CONT_EEPROM_BUSY) { - __osEepStatus(mq, &sdata); - } - - __osPackEepWriteData(address, buffer); - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); - __osContLastCmd = CONT_CMD_WRITE_EEPROM; - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ptr += 4; - - eepromformat = *(__OSContEepromFormat *)ptr; - - ret = CHNL_ERR(eepromformat); - - __osSiRelAccess(); - return ret; -} - -void __osPackEepWriteData(u8 address, u8 *buffer) -{ - u8 *ptr; - __OSContEepromFormat eepromformat; - int i; - ptr = (u8 *)&__osEepPifRam.ramarray; - __osEepPifRam.pifstatus = CONT_CMD_EXE; - - eepromformat.txsize = CONT_CMD_WRITE_EEPROM_TX; - eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX; - eepromformat.cmd = CONT_CMD_WRITE_EEPROM; - eepromformat.address = address; - - for (i = 0; i < ARRLEN(eepromformat.data); i++) { - eepromformat.data[i] = *buffer++; - } - - for (i = 0; i < 4; i++) { - *ptr++ = 0; - } - - *(__OSContEepromFormat *)(ptr) = eepromformat; - ptr += sizeof(__OSContEepromFormat); - ptr[0] = CONT_CMD_END; -} - -s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) -{ - s32 ret; - int i; - u8 *ptr; - __OSContRequestFormat requestformat; - - ret = 0; - ptr = (u8 *)__osEepPifRam.ramarray; - - for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { - __osEepPifRam.ramarray[i] = 0; - } - - __osEepPifRam.pifstatus = CONT_CMD_EXE; - ptr = (u8 *)__osEepPifRam.ramarray; - - for (i = 0; i < 4; i++) { - *ptr++ = 0; - } - - requestformat.dummy = CONT_CMD_NOP; - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = CONT_CMD_REQUEST_STATUS; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - requestformat.dummy1 = CONT_CMD_NOP; - *(__OSContRequestFormat *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormat); - *ptr = CONT_CMD_END; - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - __osContLastCmd = CONT_CMD_END; - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - if (ret != 0) { - return ret; - } - - ptr = (u8 *)&__osEepPifRam; - - for (i = 0; i < 4; i++) { - *ptr++ = 0; - } - - requestformat = *(__OSContRequestFormat *)ptr; - data->errno = CHNL_ERR(requestformat); - data->type = (requestformat.typel << 8) | requestformat.typeh; - data->status = requestformat.status; - - if (data->errno != 0) { - return data->errno; - } - - return 0; -} diff --git a/src/libultra/io/contpfs.c b/src/libultra/io/contpfs.c deleted file mode 100644 index 39bbf33..0000000 --- a/src/libultra/io/contpfs.c +++ /dev/null @@ -1,315 +0,0 @@ -#include -#include "ultra64/controller.h" - -extern u8 __osPfsInodeCacheBank; -extern s32 __osPfsInodeCacheChannel; - -extern __OSInode __osPfsInodeCache; - -#define PFS_INODE_SIZE_PER_PAGE 128 - -u16 __osSumcalc(u8* ptr, s32 length) { - s32 i; - u32 sum = 0; - u8* temp = ptr; - - for (i = 0; i < length; i++) { - sum += *temp++; - } - return sum & 0xFFFF; -} - -s32 __osIdCheckSum(u16* ptr, u16* checkSum, u16* idSum) { - u16 data = 0; - u32 i; - - *checkSum = *idSum = 0; - for (i = 0; i < ((sizeof(__OSPackId) - sizeof(u32)) / sizeof(u8)); i += sizeof(u16)) { - data = *((u16*)((uintptr_t)ptr + i)); - *checkSum += data; - *idSum += ~data; - } - return 0; -} - -s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) { - s32 ret = 0; - u8 temp[BLOCKSIZE]; - u8 comp[BLOCKSIZE]; - u8 mask = 0; - s32 i; - s32 j = 0; - u16 index[4]; - - newid->repaired = -1; - newid->random = osGetCount(); - newid->serial_mid = badid->serial_mid; - newid->serial_low = badid->serial_low; - - if ((pfs->activebank != 0) && ((ret = __osPfsSelectBank(pfs, 0)) != 0)) { - return ret; - } - - do { - if ((ret = __osPfsSelectBank(pfs, j)) != 0) { - return ret; - } - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, temp)) != 0) { - return ret; - } - temp[0] = j | 0x80; - for (i = 1; i < BLOCKSIZE; i++) { - temp[i] = ~temp[i]; - } - - if ((ret = __osContRamWrite(pfs->queue, pfs->channel, 0, temp, 0)) != 0) { - return ret; - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, comp)) != 0) { - return (ret); - } - for (i = 0; i < BLOCKSIZE; i++) { - if (comp[i] != temp[i]) { - break; - } - } - if (i != BLOCKSIZE) { - break; - } - - if (j > 0) { - if ((ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, temp)) != 0) { - return ret; - } - if (temp[0] != 0x80) { - break; - } - } - - j++; - } while (j < PFS_MAX_BANKS); - - if ((pfs->activebank != 0) && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - mask = (j > 0) ? 1 : 0; - newid->deviceid = (badid->deviceid & 0xFFFE) | mask; - newid->banks = j; - newid->version = badid->version; - __osIdCheckSum((u16*)newid, &newid->checksum, &newid->inverted_checksum); - - index[0] = PFS_ID_0AREA; - index[1] = PFS_ID_1AREA; - index[2] = PFS_ID_2AREA; - index[3] = PFS_ID_3AREA; - for (i = 0; i < 4; i++) { - if ((ret = __osContRamWrite(pfs->queue, pfs->channel, index[i], (u8*)newid, PFS_FORCE)) != 0) { - return ret; - } - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - return ret; - } - for (i = 0; i < BLOCKSIZE; i++) { - if (temp[i] != ((u8*)newid)[i]) { - return PFS_ERR_DEVICE; - } - } - return 0; -} - -s32 __osCheckPackId(OSPfs* pfs, __OSPackId* check) { - u16 index[4]; - s32 ret = 0; - u16 sum; - u16 idSum; - s32 i; - s32 j; - - if (pfs->activebank != 0 && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - index[0] = PFS_ID_0AREA; - index[1] = PFS_ID_1AREA; - index[2] = PFS_ID_2AREA; - index[3] = PFS_ID_3AREA; - - for (i = 1; i < ARRAY_COUNT(index); i++) { - if ((ret = __osContRamRead(pfs->queue, pfs->channel, index[i], (u8*)check)) != 0) { - return ret; - } - __osIdCheckSum((u16*)check, &sum, &idSum); - if (check->checksum == sum && check->inverted_checksum == idSum) { - break; - } - } - if (i == ARRAY_COUNT(index)) { - return PFS_ERR_ID_FATAL; - } - - for (j = 0; j < ARRAY_COUNT(index); j++) { - if (j != i) { - if ((ret = __osContRamWrite(pfs->queue, pfs->channel, index[j], (u8*)check, PFS_FORCE)) != 0) { - return ret; - } - } - } - return 0; -} - -s32 __osGetId(OSPfs* pfs) { - u16 sum; - u16 isum; - u8 temp[BLOCKSIZE]; - __OSPackId* id; - __OSPackId newid; - s32 ret; - - if (pfs->activebank != 0 && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - return ret; - } - - __osIdCheckSum((u16*)temp, &sum, &isum); - id = (__OSPackId*)temp; - if (id->checksum != sum || id->inverted_checksum != isum) { - if ((ret = __osCheckPackId(pfs, id)) == PFS_ERR_ID_FATAL) { - ret = __osRepairPackId(pfs, id, &newid); - if (ret) { - return ret; - } - id = &newid; - } else if (ret != 0) { - return ret; - } - } - - if ((id->deviceid & 1) == 0) { - ret = __osRepairPackId(pfs, id, &newid); - if (ret) { - return ret; - } - id = &newid; - if ((id->deviceid & 1) == 0) { - return PFS_ERR_DEVICE; - } - } - - _bcopy(id, pfs->id, BLOCKSIZE); - - if (0) {} - - pfs->version = id->version; - - pfs->banks = id->banks; - pfs->inode_start_page = 1 + DEF_DIR_PAGES + (2 * pfs->banks); - pfs->dir_size = DEF_DIR_PAGES * PFS_ONE_PAGE; - pfs->inode_table = 1 * PFS_ONE_PAGE; - pfs->minode_table = (1 + pfs->banks) * PFS_ONE_PAGE; - pfs->dir_table = pfs->minode_table + (pfs->banks * PFS_ONE_PAGE); - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label)) != 0) { - return ret; - } - - return 0; -} - -s32 __osCheckId(OSPfs* pfs) { - u8 temp[BLOCKSIZE]; - s32 ret; - - if (pfs->activebank != 0) { - ret = __osPfsSelectBank(pfs, 0); - if (ret == PFS_ERR_NEW_PACK) { - ret = __osPfsSelectBank(pfs, 0); - } - if (ret != 0) { - return ret; - } - } - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - if (ret != PFS_ERR_NEW_PACK) { - return ret; - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - return ret; - } - } - - if (bcmp(pfs->id, temp, BLOCKSIZE) != 0) { - return PFS_ERR_NEW_PACK; - } - - return 0; -} - -s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) { - u8 sum; - s32 j; - s32 ret; - s32 offset; - u8* addr; - - if (flag == PFS_READ && bank == __osPfsInodeCacheBank && (pfs->channel == __osPfsInodeCacheChannel)) { - _bcopy(&__osPfsInodeCache, inode, sizeof(__OSInode)); - return 0; - } - - if ((pfs->activebank != 0) && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - offset = ((bank > 0) ? 1 : pfs->inode_start_page); - - if (flag == PFS_WRITE) { - inode->inode_page[0].inode_t.page = - __osSumcalc((u8*)(inode->inode_page + offset), (PFS_INODE_SIZE_PER_PAGE - offset) * 2); - } - - for (j = 0; j < PFS_ONE_PAGE; j++) { - addr = (u8*)(((u8*)inode) + (j * BLOCKSIZE)); - if (flag == PFS_WRITE) { - ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + (bank * PFS_ONE_PAGE) + j, addr, 0); - ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + (bank * PFS_ONE_PAGE) + j, addr, 0); - } else { - ret = __osContRamRead(pfs->queue, pfs->channel, pfs->inode_table + (bank * PFS_ONE_PAGE) + j, addr); - } - if (ret) { - return ret; - } - } - - if (flag == PFS_READ) { - sum = __osSumcalc((u8*)(inode->inode_page + offset), (PFS_INODE_SIZE_PER_PAGE - offset) * 2); - if (sum != inode->inode_page[0].inode_t.page) { - for (j = 0; j < PFS_ONE_PAGE; j++) { - addr = (((u8*)inode->inode_page) + (j * BLOCKSIZE)); - ret = __osContRamRead(pfs->queue, pfs->channel, pfs->minode_table + (bank * PFS_ONE_PAGE) + j, addr); - } - sum = __osSumcalc((u8*)(inode->inode_page + offset), (PFS_INODE_SIZE_PER_PAGE - offset) * 2); - if (sum != inode->inode_page[0].inode_t.page) { - return PFS_ERR_INCONSISTENT; - } - for (j = 0; j < PFS_ONE_PAGE; j++) { - addr = (((u8*)inode->inode_page) + (j * BLOCKSIZE)); - ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + (bank * PFS_ONE_PAGE) + j, addr, 0); - } - } - } - __osPfsInodeCacheBank = bank; - _bcopy(inode, &__osPfsInodeCache, sizeof(__OSInode)); - __osPfsInodeCacheChannel = pfs->channel; - - return 0; -} diff --git a/src/libultra/io/contramread.c b/src/libultra/io/contramread.c deleted file mode 100644 index cc85547..0000000 --- a/src/libultra/io/contramread.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "ultra64/controller.h" - -extern s32 __osPfsLastChannel; - -#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) - -s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { - s32 ret; - s32 i; - u8* ptr; - s32 retry = 2; - - __osSiGetAccess(); - - do { - ptr = (u8*)&__osPfsPifRam; - - if (__osContLastCmd != CONT_CMD_READ_MEMPACK || __osPfsLastChannel != channel) { - __osContLastCmd = CONT_CMD_READ_MEMPACK; - __osPfsLastChannel = channel; - - for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } - - __osPfsPifRam.pifstatus = CONT_CMD_EXE; - - READFORMAT(ptr)->dummy = CONT_CMD_NOP; - READFORMAT(ptr)->txsize = CONT_CMD_READ_MEMPACK_TX; - READFORMAT(ptr)->rxsize = CONT_CMD_READ_MEMPACK_RX; - READFORMAT(ptr)->cmd = CONT_CMD_READ_MEMPACK; - READFORMAT(ptr)->datacrc = 0xFF; - - ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; - } else { - ptr += channel; - } - - READFORMAT(ptr)->hi = address >> 3; - READFORMAT(ptr)->lo = (u8)(__osContAddressCrc(address) | (address << 5)); - - __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4); - - if (!ret) { - if (__osContDataCrc(&READFORMAT(ptr)->data) != READFORMAT(ptr)->datacrc) { - ret = __osPfsGetStatus(mq, channel); - - if (ret) { - break; - } - - ret = PFS_ERR_CONTRFAIL; - } else { - _bcopy(&READFORMAT(ptr)->data, buffer, BLOCKSIZE); - } - } else { - ret = PFS_ERR_NOPACK; - } - if (ret != PFS_ERR_CONTRFAIL) { - break; - } - } while (0 <= retry--); - __osSiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/contramwrite.c b/src/libultra/io/contramwrite.c deleted file mode 100644 index 8499892..0000000 --- a/src/libultra/io/contramwrite.c +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "ultra64/controller.h" - -extern s32 __osPfsLastChannel; - -#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) - -s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) { - s32 ret = 0; - s32 i; - u8* ptr; - s32 retry = 2; - u8 crc; - - if ((force != PFS_FORCE) && (address < PFS_LABEL_AREA) && (address != 0)) { - return 0; - } - - __osSiGetAccess(); - - do { - ptr = (u8*)(&__osPfsPifRam.ramarray); - - if (__osContLastCmd != CONT_CMD_WRITE_MEMPACK || __osPfsLastChannel != channel) { - __osContLastCmd = CONT_CMD_WRITE_MEMPACK; - __osPfsLastChannel = channel; - - // clang-format off - for (i = 0; i < channel; i++) { *ptr++ = 0; } - // clang-format on - - __osPfsPifRam.pifstatus = 1; - - READFORMAT(ptr)->dummy = CONT_CMD_NOP; - READFORMAT(ptr)->txsize = CONT_CMD_WRITE_MEMPACK_TX; - READFORMAT(ptr)->rxsize = CONT_CMD_WRITE_MEMPACK_RX; - READFORMAT(ptr)->cmd = CONT_CMD_WRITE_MEMPACK; - READFORMAT(ptr)->datacrc = 0xFF; - - ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; - } else { - ptr += channel; - } - READFORMAT(ptr)->hi = address >> 3; - READFORMAT(ptr)->lo = ((address << 5) | __osContAddressCrc(address)); - - _bcopy(buffer, READFORMAT(ptr)->data, BLOCKSIZE); - - ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - crc = __osContDataCrc(buffer); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4); - if (!ret) { - if (crc != ((__OSContRamReadFormat*)ptr)->datacrc) { - if ((ret = __osPfsGetStatus(mq, channel))) { - break; - } else { - ret = PFS_ERR_CONTRFAIL; - } - } - } else { - ret = PFS_ERR_NOPACK; - } - } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); - __osSiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/contreaddata.c b/src/libultra/io/contreaddata.c deleted file mode 100644 index 81ac291..0000000 --- a/src/libultra/io/contreaddata.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include "ultra64/controller.h" - -void __osPackReadData(void); - -s32 osContStartReadData(OSMesgQueue *mq) -{ - s32 ret = 0; - s32 i; - - __osSiGetAccess(); - - if (__osContLastCmd != 1) { - __osPackReadData(); - ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - } - - ret = __osSiRawStartDma(OS_READ, &__osContPifRam); - - __osContLastCmd = 1; - __osSiRelAccess(); - - return ret; -} - -void osContGetReadData(OSContPad *data) -{ - u8 *ptr; - __OSContReadFormat readformat; - int i; - ptr = (u8 *)&__osContPifRam.ramarray; - - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContReadFormat), data++) { - readformat = *(__OSContReadFormat *)ptr; - data->errno = CHNL_ERR(readformat); - - if (data->errno == 0) { - data->button = readformat.button; - data->stick_x = readformat.stick_x; - data->stick_y = readformat.stick_y; - } - } -} - -void __osPackReadData(void) -{ - u8 *ptr; - __OSContReadFormat readformat; - int i; - - ptr = (u8*)&__osContPifRam.ramarray; - - for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { - __osContPifRam.ramarray[i] = 0; - } - - __osContPifRam.pifstatus = CONT_CMD_EXE; - readformat.dummy = CONT_CMD_NOP; - readformat.txsize = CONT_CMD_READ_BUTTON_TX; - readformat.rxsize = CONT_CMD_READ_BUTTON_RX; - readformat.cmd = CONT_CMD_READ_BUTTON; - readformat.button = -1; - readformat.stick_x = -1; - readformat.stick_y = -1; - - for(i=0; i < __osMaxControllers; i++) { - *(__OSContReadFormat*)ptr = readformat; - ptr += sizeof(__OSContReadFormat); - } - - *ptr = CONT_CMD_END; -} diff --git a/src/libultra/io/controller.c b/src/libultra/io/controller.c deleted file mode 100644 index 10c5c76..0000000 --- a/src/libultra/io/controller.c +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include "ultra64/controller.h" - -extern OSPifRam __osContPifRam; -extern u8 __osContLastCmd; -extern u8 __osMaxControllers; -extern OSTimer __osEepromTimer; -extern OSMesgQueue __osEepromTimerQ; -extern OSMesg __osEepromTimerMsg; - -extern u32 __osContInitialized; - -void __osContGetInitData(u8 *pattern, OSContStatus *data); -void __osPackRequestData(u8 cmd); - -s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus *data) -{ - OSMesg dummy; - s32 ret; - OSTime t; - OSTimer mytimer; - OSMesgQueue timerMesgQueue; - - ret = 0; - - if (__osContInitialized) { - return ret; - } - - __osContInitialized = TRUE; - t = osGetTime(); - - if (t < 23437500) { - osCreateMesgQueue(&timerMesgQueue, &dummy, 1); - osSetTimer(&mytimer, 23437500 - t, 0, &timerMesgQueue, &dummy); - osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); - } - - __osMaxControllers = MAXCONTROLLERS; - __osPackRequestData(CONT_CMD_REQUEST_STATUS); - - ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osContPifRam); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); - - __osContGetInitData(bitpattern, data); - __osContLastCmd = CONT_CMD_REQUEST_STATUS; - __osSiCreateAccessQueue(); - - osCreateMesgQueue(&__osEepromTimerQ, &__osEepromTimerMsg, 1); - - return ret; -} - -void __osContGetInitData(u8 *pattern, OSContStatus *data) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - u8 bits; - bits = 0; - ptr = (u8 *)&__osContPifRam; - - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContRequestFormat), data++) { - requestformat = *(__OSContRequestFormat *)ptr; - data->errno = CHNL_ERR(requestformat); - - if (data->errno == 0) { - data->type = (requestformat.typel << 8) | requestformat.typeh; - data->status = requestformat.status; - bits |= 1 << i; - } - } - - *pattern = bits; -} - -void __osPackRequestData(u8 cmd) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - - for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { - __osContPifRam.ramarray[i] = 0; - } - - __osContPifRam.pifstatus = CONT_CMD_EXE; - - ptr = (u8 *)&__osContPifRam.ramarray; - - requestformat.dummy = CONT_CMD_NOP; - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = cmd; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - requestformat.dummy1 = CONT_CMD_NOP; - - for (i = 0; i < __osMaxControllers; i++) { - *(__OSContRequestFormat *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormat); - } - - ptr[0] = CONT_CMD_END; -} diff --git a/src/libultra/io/crc.c b/src/libultra/io/crc.c deleted file mode 100644 index 7d39201..0000000 --- a/src/libultra/io/crc.c +++ /dev/null @@ -1,96 +0,0 @@ -#include "PR/os_internal.h" - -u8 __osContAddressCrc(u16 inaddr) -{ - u32 crc; - u32 mask; - u32 addr = inaddr; - - crc = 0; - - for (mask = 0x400; mask != 0; mask >>= 1) { - crc *= 2; - - if (addr & mask) { - if (crc & 0x20) { - crc ^= 20; - } else { - crc++; - } - } else { - if (crc & 0x20) { - crc ^= 21; - } - } - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - return crc & 0x1f; -} - -u8 __osContDataCrc(u8 *data) -{ - u32 i; - u32 mask; - u32 crc = 0; - - for (i = 32; i != 0; i--) { - for (mask = 0x80; mask != 0; mask >>= 1) { - crc *= 2; - - if (*data & mask) { - if (crc & 0x100) { - crc ^= 132; - } else { - crc++; - } - } else { - if (crc & 0x100) { - crc ^= 133; - } - } - } - - data++; - } - - do { - crc <<= 1; - - if (crc & 0x100) { - crc ^= 133; - } - i++; - } while (i < 8); - - return crc; -} diff --git a/src/libultra/io/devmgr.c b/src/libultra/io/devmgr.c deleted file mode 100644 index 6ddacce..0000000 --- a/src/libultra/io/devmgr.c +++ /dev/null @@ -1,114 +0,0 @@ -#include -#include -#include "piint.h" - -void __osDevMgrMain(void *args) -{ - OSIoMesg *mb; - OSMesg em; - OSMesg dummy; - s32 ret; - OSDevMgr *dm; - s32 messageSend; - - messageSend = 0; - mb = NULL; - ret = 0; - dm = (OSDevMgr *)args; - while (TRUE) - { - osRecvMesg(dm->cmdQueue, (OSMesg)&mb, OS_MESG_BLOCK); - if (mb->piHandle != NULL && - mb->piHandle->type == DEVICE_TYPE_64DD && - (mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0 || - mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_1)) - { - __OSBlockInfo *blockInfo; - __OSTranxInfo *info; - info = &mb->piHandle->transferInfo; - blockInfo = &info->block[info->blockNum]; - info->sectorNum = -1; - if (info->transferMode != LEO_SECTOR_MODE) - { - blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr - blockInfo->sectorSize); - } - if (info->transferMode == LEO_TRACK_MODE && mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0) - messageSend = 1; - else - messageSend = 0; - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - __osResetGlobalIntMask(OS_IM_PI); - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, (info->bmCtlShadow | 0x80000000)); - while (TRUE) - { - - osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); - info = &mb->piHandle->transferInfo; - blockInfo = &info->block[info->blockNum]; - if (blockInfo->errStatus == LEO_ERROR_29) - { - u32 stat; - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); //TODO: remove magic constants - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow); - osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat); - - if (stat & LEO_STATUS_MECHANIC_INTERRUPT) //TODO: remove magic constants - { - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); - } - - blockInfo->errStatus = LEO_ERROR_4; - IO_WRITE(PI_STATUS_REG, PI_CLR_INTR); - __osSetGlobalIntMask(OS_IM_PI | SR_IBIT4); - } - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - - if (messageSend != 1) - break; - if (mb->piHandle->transferInfo.block[0].errStatus != LEO_ERROR_GOOD) - break; - messageSend = 0; - } - osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); - if (mb->piHandle->transferInfo.blockNum == 1) - osYieldThread(); - } - else - { - switch (mb->hdr.type) - { - case OS_MESG_TYPE_DMAREAD: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_DMAWRITE: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_EDMAREAD: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr, - mb->size); - break; - case OS_MESG_TYPE_EDMAWRITE: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - ret = dm->edma(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr, - mb->size); - break; - case OS_MESG_TYPE_LOOPBACK: - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - ret = -1; - break; - default: - ret = -1; - break; - } - if (ret == 0) - { - osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); - } - } - } -} diff --git a/src/libultra/io/epidma.c b/src/libultra/io/epidma.c deleted file mode 100644 index 6009385..0000000 --- a/src/libultra/io/epidma.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include "piint.h" - -s32 osEPiStartDma(OSPiHandle *pihandle, OSIoMesg *mb, s32 direction) -{ - register s32 ret; - - if (!__osPiDevMgr.active) - return -1; - mb->piHandle = pihandle; - if (direction == OS_READ) - { - mb->hdr.type = OS_MESG_TYPE_EDMAREAD; - } - else - { - mb->hdr.type = OS_MESG_TYPE_EDMAWRITE; - } - if (mb->hdr.pri == OS_MESG_PRI_HIGH) - { - ret = osJamMesg(osPiGetCmdQueue(), mb, OS_MESG_NOBLOCK); - } - else - { - ret = osSendMesg(osPiGetCmdQueue(), mb, OS_MESG_NOBLOCK); - } - return ret; -} diff --git a/src/libultra/io/epirawdma.c b/src/libultra/io/epirawdma.c deleted file mode 100644 index 0dc889f..0000000 --- a/src/libultra/io/epirawdma.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "piint.h" - -s32 osEPiRawStartDma(OSPiHandle *pihandle, s32 direction, u32 devAddr, void *dramAddr, u32 size) -{ - u32 stat; - u32 domain; - - EPI_SYNC(pihandle, stat, domain); - IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS(pihandle->baseAddress | devAddr)); - - switch (direction) - { - case OS_READ: - IO_WRITE(PI_WR_LEN_REG, size - 1); - break; - case OS_WRITE: - IO_WRITE(PI_RD_LEN_REG, size - 1); - break; - default: - return -1; - } - return 0; -} diff --git a/src/libultra/io/epirawread.c b/src/libultra/io/epirawread.c deleted file mode 100644 index 44be711..0000000 --- a/src/libultra/io/epirawread.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "piint.h" - -s32 osEPiRawReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { - u32 stat; - u32 domain; - - EPI_SYNC(pihandle, stat, domain); - *data = IO_READ(pihandle->baseAddress | devAddr); - - return 0; -} diff --git a/src/libultra/io/epirawwrite.c b/src/libultra/io/epirawwrite.c deleted file mode 100644 index f5798b1..0000000 --- a/src/libultra/io/epirawwrite.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include "piint.h" - -s32 osEPiRawWriteIo(OSPiHandle *handle, u32 devAddr, u32 data) -{ - u32 stat = IO_READ(PI_STATUS_REG); - - while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) { - stat = IO_READ(PI_STATUS_REG); - } - - if (__osCurrentHandle[handle->domain]->type != handle->type) { - OSPiHandle *cHandle = __osCurrentHandle[handle->domain]; - - if (handle->domain == PI_DOMAIN1) { - if (cHandle->latency != handle->latency) { - IO_WRITE(PI_BSD_DOM1_LAT_REG, handle->latency); - } - - if (cHandle->pageSize != handle->pageSize) { - IO_WRITE(PI_BSD_DOM1_PGS_REG, handle->pageSize); - } - - if (cHandle->relDuration != handle->relDuration) { - IO_WRITE(PI_BSD_DOM1_RLS_REG, handle->relDuration); - } - - if (cHandle->pulse != handle->pulse) { - IO_WRITE(PI_BSD_DOM1_PWD_REG, handle->pulse); - } - } else { - if (cHandle->latency != handle->latency) { - IO_WRITE(PI_BSD_DOM2_LAT_REG, handle->latency); - } - - if (cHandle->pageSize != handle->pageSize) { - IO_WRITE(PI_BSD_DOM2_PGS_REG, handle->pageSize); - } - - if (cHandle->relDuration != handle->relDuration) { - IO_WRITE(PI_BSD_DOM2_RLS_REG, handle->relDuration); - } - - if (cHandle->pulse != handle->pulse) { - IO_WRITE(PI_BSD_DOM2_PWD_REG, handle->pulse); - } - } - - cHandle->type = handle->type; - cHandle->latency = handle->latency; - cHandle->pageSize = handle->pageSize; - cHandle->relDuration = handle->relDuration; - cHandle->pulse = handle->pulse; - } - - IO_WRITE(handle->baseAddress | devAddr, data); - return 0; -} diff --git a/src/libultra/io/epiread.c b/src/libultra/io/epiread.c deleted file mode 100644 index c20e61a..0000000 --- a/src/libultra/io/epiread.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "piint.h" - -s32 osEPiRawReadIo(OSPiHandle*, u32, u32*); - -s32 osEPiReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { - register s32 ret; - - __osPiGetAccess(); - ret = osEPiRawReadIo(pihandle, devAddr, data); - __osPiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/epiwrite.c b/src/libultra/io/epiwrite.c deleted file mode 100644 index e5c7a33..0000000 --- a/src/libultra/io/epiwrite.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "piint.h" - -s32 osEPiRawWriteIo(OSPiHandle*, u32, u32); - -s32 osEPiWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) { - register s32 ret; - - __osPiGetAccess(); - ret = osEPiRawWriteIo(pihandle, devAddr, data); - __osPiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/gbpakcheckconnector.c b/src/libultra/io/gbpakcheckconnector.c deleted file mode 100644 index d6ed4ad..0000000 --- a/src/libultra/io/gbpakcheckconnector.c +++ /dev/null @@ -1,218 +0,0 @@ -#include - -/** - * The internal operations performed by the osGbpakCheckConnector function are - * as follows. - * - * - Checks the ROM area addresses of the Game Boy Game Pak and performs the - * following processing for 0x0000, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, - * 0x1000, 0x2000, and 0x4000. - * - * 1. Compares data starting at the above addresses with neighboring data in - * 32-byte units. - * 2. If the data are identical, compares the next 32 bytes, and if this is - * also the same, compares the next 32 bytes. Up to 4 comparisons (ie, 128 - * bytes) are performed. If all data are identical, the address line is - * considered insecurely connected and an error is returned. If different - * data are detected even once, it is determined that the data are being - * read properly and the function advances. - * 3. Data at each of the above addresses are compared with the data starting - * at 0x0000 in 32-byte units. - * 4. As in 2., up to 4 comparisons (128 bytes) are made. If all the data are - * identical, an error is returned. If different data are detected even - * once, it is determined that the data are being read properly and the - * function advances. - * - * - If a RAM area exists, the function checks the address of the Game Boy Game - * Pak RAM area and performs the following processing for 0x2000 and 0xa000. - * - * 1. Compares the data starting at the above addresses in 32-byte units. - * 2. If the data are identical, compares the next 32 bytes, and if this is - * also the same, compares the next 32 bytes. Up to 4 comparisons (ie, 128 - * bytes) are performed. If all the data are the same, the address line is - * evaluated to be insecurely connected and an error is returned. If - * different data are detected even once, it is determined that the data - * are being read properly and the function advances. - */ -s32 osGbpakCheckConnector(OSPfs *pfs, u8 *status) -{ - s32 ret; - s32 thisslot = 1; - s32 prevslot = 0; - u16 thischunkaddr; - u16 prevchunkaddr = 0; - u16 offset; - u16 blocknum; - u8 blocks[3][4][0x20]; - u8 blocksloaded[3][4]; - s32 stilllooking; - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = osGbpakGetStatus(pfs, status); - } - - if (ret == PFS_ERR_NEW_GBCART) { - return PFS_ERR_CONTRFAIL; - } - - if (ret == 0) { - if ((*status & OS_GBPAK_POWER) == 0) { - ret = osGbpakPower(pfs, OS_GBPAK_POWER_ON); - - if (ret != 0) { - return ret; - } - } - - bzero(blocksloaded, 12); - - for (thischunkaddr = 0x80; thischunkaddr <= 0x4000; thischunkaddr *= 2) { - blocknum = 0; - offset = 0; - - do { - // Load the current block - ret = osGbpakReadWrite(pfs, PFS_READ, thischunkaddr + offset, blocks[thisslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[thisslot][blocknum] = 1; - - // Load the same block from the previous chunk if not already loaded - // (This only applies for the 0x0000 chunk) - if (blocksloaded[prevslot][blocknum] == 0) { - ret = osGbpakReadWrite(pfs, PFS_READ, prevchunkaddr + offset, blocks[prevslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[prevslot][blocknum] = 1; - } - - // Compare them and bail out if different - if (bcmp(blocks[thisslot][blocknum], blocks[prevslot][blocknum], 32) != 0) { - blocknum = 0; - break; - } - - stilllooking = blocknum < 3; - offset += 0x20; blocknum++; - } while (stilllooking); - - if (blocknum); - if (blocknum); - if (blocknum); - if (blocknum); - if (blocknum); - if (blocknum); - - stilllooking = blocknum; - - if (stilllooking) { - return PFS_ERR_CONTRFAIL; - } - - // Now compare each block in this chunk with each block in the - // 0x0000 chunk - blocknum = 0; - offset = 0; - - if (prevslot != 0) { - do { - // Make sure the current block is loaded - if (blocksloaded[thisslot][blocknum] == 0) { - ret = osGbpakReadWrite(pfs, PFS_READ, thischunkaddr + offset, blocks[thisslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[thisslot][blocknum] = 1; - } - - // Make sure this block in chunk 0x0000 is loaded - if (blocksloaded[0][blocknum] == 0) { - ret = osGbpakReadWrite(pfs, PFS_READ, offset, blocks[0][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[0][blocknum] = 1; - } - - // Compare them and bail out if different - if (bcmp(blocks[thisslot][blocknum], blocks[0][blocknum], 32) != 0) { - stilllooking = 0; - goto end; - } - - stilllooking = blocknum < 3; - offset += 0x20; blocknum++; - } while (stilllooking); - - stilllooking = blocknum; - } - -end: - if (stilllooking) { - return PFS_ERR_CONTRFAIL; - } - - if (prevslot != 0) { - bzero(&blocksloaded[prevslot][0], 4); - } - - prevchunkaddr = thischunkaddr; - prevslot = thisslot; - thisslot ^= 3; // toggle between 1 and 2 - } - - // Check RAM if present - if (pfs->dir_size >= 2 || pfs->version == 2) { - blocknum = 0; - offset = 0; - - do { - ret = osGbpakReadWrite(pfs, PFS_READ, 0xa000 + offset, blocks[thisslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - ret = osGbpakReadWrite(pfs, PFS_READ, 0x2000 + offset, blocks[prevslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - if (bcmp(blocks[thisslot][blocknum], blocks[prevslot][blocknum], 32) != 0) { - blocknum = 0; - break; - } - - stilllooking = blocknum < 3; - offset += 0x20; blocknum++; - } while (stilllooking); - - stilllooking = blocknum; - - if (stilllooking) { - return PFS_ERR_CONTRFAIL; - } - } - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = PFS_ERR_CONTRFAIL; - } - } - - return ret; -} diff --git a/src/libultra/io/gbpakgetstatus.c b/src/libultra/io/gbpakgetstatus.c deleted file mode 100644 index 2d45bb3..0000000 --- a/src/libultra/io/gbpakgetstatus.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -s32 osGbpakGetStatus(OSPfs *pfs, u8 *status) -{ - s32 ret; - s32 i; - u8 buffer[32]; - - ret = __osContRamRead(pfs->queue, pfs->channel, 0x400, buffer); - - if (ret == PFS_ERR_NEW_PACK || buffer[31] != (OS_GBPAK_RSTB_DETECTION | OS_GBPAK_GBCART_ON)) { - ret = osGbpakInit(pfs->queue, pfs, pfs->channel); - - if (ret != 0) { - return ret; - } - } - - ret = __osContRamRead(pfs->queue, pfs->channel, 0x580, buffer); - - if (ret == 0) { - ret = __osPfsGetStatus(pfs->queue, pfs->channel); - - if (ret != 0) { - return ret; - } - - *status = buffer[0]; - - for (i = 1; i < 32; i++) { - *status |= ((u8 *)buffer)[i]; - } - - *status &= (OS_GBPAK_RSTB_DETECTION | OS_GBPAK_GBCART_PULL); - *status |= buffer[31]; - - if ((*status & OS_GBPAK_GBCART_ON) == 0) { - ret = PFS_ERR_NO_GBCART; - } else if (*status & OS_GBPAK_GBCART_PULL) { - ret = PFS_ERR_NEW_GBCART; - } - } else if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - return ret; -} diff --git a/src/libultra/io/gbpakinit.c b/src/libultra/io/gbpakinit.c deleted file mode 100644 index b61eae5..0000000 --- a/src/libultra/io/gbpakinit.c +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include "ultra64/controller.h" - -// .bss -extern OSTimer var80090ab0; -extern OSMesgQueue g_GbpakMesgQueue; -extern OSMesg var80090ae8; - -s32 osGbpakInit(OSMesgQueue *queue, OSPfs *pfs, int channel) -{ - s32 ret; - s32 i; - u8 buffer[32]; - - pfs->status = 0; - - for (i = 0; i < 32; i++) { - buffer[i] = 0xfe; - } - - ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); - } - - if (ret != 0) { - return ret; - } - - ret = __osContRamRead(queue, channel, 0x400, buffer); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - if (buffer[31] == 0xfe) { - return PFS_ERR_DEVICE; - } - - // ok but why tho. the earlier loop isnt like this - for (i = 0; i < 32; i+=4) { - buffer[i+0] = 0x84; - buffer[i+1] = 0x84; - buffer[i+2] = 0x84; - buffer[i+3] = 0x84; - } - - ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - ret = __osContRamRead(queue, channel, 0x400, buffer); - - if (ret == 2) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - if (buffer[31] != 0x84) { - return PFS_ERR_DEVICE; - } - - ret = __osPfsGetStatus(queue, channel); - - if (ret != 0) { - return ret; - } - - osCreateMesgQueue(&g_GbpakMesgQueue, &var80090ae8, 1); - osSetTimer(&var80090ab0, 9000000, 0, &g_GbpakMesgQueue, &var80090ae8); - osRecvMesg(&g_GbpakMesgQueue, 0, OS_MESG_BLOCK); - - pfs->queue = queue; - pfs->status = 0x10; - pfs->channel = channel; - pfs->activebank = 0x84; - pfs->banks = 0xff; - pfs->version = 0xff; - pfs->dir_size = 0xff; - - return 0; -} diff --git a/src/libultra/io/gbpakpower.c b/src/libultra/io/gbpakpower.c deleted file mode 100644 index 0eaf8ee..0000000 --- a/src/libultra/io/gbpakpower.c +++ /dev/null @@ -1,40 +0,0 @@ -#include - -extern OSTimer var80090ab0; -extern OSMesgQueue g_GbpakMesgQueue; -extern OSMesg var80090ae8; - -s32 osGbpakPower(OSPfs *pfs, s32 flag) -{ - s32 i; - s32 ret; - u8 buffer[32]; - - for (i = 0; i < 32; i+=4) { - buffer[i+0] = flag; - buffer[i+1] = flag; - buffer[i+2] = flag; - buffer[i+3] = flag; - } - - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x580, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = osGbpakInit(pfs->queue, pfs, pfs->channel); - - if (ret == 0) { - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x580, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - } - } - - if (flag != OS_GBPAK_POWER_OFF) { - osSetTimer(&var80090ab0, 0x55D4A8, 0, &g_GbpakMesgQueue, &var80090ae8); - osRecvMesg(&g_GbpakMesgQueue, NULL, OS_MESG_BLOCK); - } - - return ret; -} diff --git a/src/libultra/io/gbpakreadid.c b/src/libultra/io/gbpakreadid.c deleted file mode 100644 index 3585c99..0000000 --- a/src/libultra/io/gbpakreadid.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -extern void _bcopy(void *, void *, u32); - -u32 g_OsGbNintendoData[] = { - 0xceed6666, 0xcc0d000b, 0x03730083, 0x000c000d, - 0x0008111f, 0x8889000e, 0xdccc6ee6, 0xddddd999, - 0xbbbb6763, 0x6e0eeccc, 0xdddc999f, 0xbbb9333e, -}; - -u8 g_OsGbCartVersions[] = { - 0x00, 0x01, 0x01, 0x01, - 0xff, 0x02, 0x02, 0xff, - 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x03, - 0x03, 0x03, 0x03, 0x03, -}; - -s32 osGbpakReadId(OSPfs *pfs, OSGbpakId *id, u8 *status) -{ - s32 i; - s32 ret; - u8 sum; - u8 buffer[0x60]; - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = osGbpakGetStatus(pfs, status); - } - - if (ret == PFS_ERR_NEW_GBCART) { - return PFS_ERR_CONTRFAIL; - } - - if (ret == 0) { - if ((*status & OS_GBPAK_POWER) == 0) { - ret = osGbpakPower(pfs, OS_GBPAK_POWER_ON); - - if (ret != 0) { - return ret; - } - } - - ret = osGbpakReadWrite(pfs, PFS_READ, 0x100, buffer, 0x60); - - if (ret != 0) { - return ret; - } - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - // Compare id->nintendo_chr with expected data - if (bcmp(g_OsGbNintendoData, &buffer[4], sizeof(id->nintendo_chr)) != 0) { - return PFS_ERR_CONTRFAIL; - } - - // Sum game_title through to isum - sum = 0; - - for (i = 0x34; i < 0x4e; i++) { - sum += buffer[i]; - } - - sum = (sum + 25) & 0xff; - - if (sum != 0) { - return PFS_ERR_CONTRFAIL; - } - - _bcopy(buffer, id, sizeof(OSGbpakId)); - - if (id->cart_type < 20) { - pfs->version = g_OsGbCartVersions[id->cart_type]; - } - - pfs->dir_size = id->ram_size; - } - - return ret; -} diff --git a/src/libultra/io/gbpakreadwrite.c b/src/libultra/io/gbpakreadwrite.c deleted file mode 100644 index d1c8436..0000000 --- a/src/libultra/io/gbpakreadwrite.c +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 osGbpakReadWrite(OSPfs *pfs, u16 flag, u16 address, u8 *buffer, u16 size) -{ - s32 i; - s32 ret; - u8 bank; - u16 addr; - - bank = address >> 14; - - if (bank != pfs->banks) { - ret = __osGbpakSelectBank(pfs, bank); - - if (ret != 0) { - return ret; - } - } - - size = size >> 5; - address = (address | 0xc000) >> 5; - - if (flag == PFS_WRITE) { - for (i = 0; i < size; i++) { - ret = __osContRamWrite(pfs->queue, pfs->channel, address, buffer, 0); - - if (ret != 0) { - break; - } - - address++; - - if (address >= 0x800 && i < size - 1) { - bank++; - ret = __osGbpakSelectBank(pfs, bank); - - if (ret != 0) { - break; - } - - address = 0x600; - } - - buffer += BLOCKSIZE; - } - } else { - for (i = 0; i < size; i++) { - ret = __osContRamRead(pfs->queue, pfs->channel, address, buffer); - - if (ret != 0) { - break; - } - - address++; - - if (address >= 0x800 && i < size - 1) { - bank++; - ret = __osGbpakSelectBank(pfs, bank); - - if (ret != 0) { - break; - } - - address = 0x600; - } - - buffer += BLOCKSIZE; - } - } - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - return ret; -} diff --git a/src/libultra/io/gbpakselectbank.c b/src/libultra/io/gbpakselectbank.c deleted file mode 100644 index 27de904..0000000 --- a/src/libultra/io/gbpakselectbank.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -s32 __osGbpakSelectBank(OSPfs *pfs, u8 bank) -{ - s32 ret; - s32 i; - u8 buffer[32]; - s32 j; - - if (bank >= 3) { - return PFS_ERR_INVALID; - } - - for (i = 0; i < 32; i+=4) { - buffer[i+0] = bank; - buffer[i+1] = bank; - buffer[i+2] = bank; - buffer[i+3] = bank; - } - - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x500, (u8 *)buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = osGbpakInit(pfs->queue, pfs, pfs->channel); - - if (ret == 0) { - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x500, (u8 *)buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - } - } - - if (ret == 0) { - pfs->banks = bank; - } - - return ret; -} diff --git a/src/libultra/io/pfsgetstatus.c b/src/libultra/io/pfsgetstatus.c deleted file mode 100644 index dc4afdb..0000000 --- a/src/libultra/io/pfsgetstatus.c +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include "ultra64/controller.h" - -void __osPfsRequestOneChannel(int channel, u8 cmd); -void __osPfsGetOneChannelData(int channel, OSContStatus *data); - -extern u8 __osPfsInodeCacheBank; - -s32 __osPfsGetStatus(OSMesgQueue *queue, int channel) -{ - s32 ret; - OSMesg dummy; - OSContStatus data; - - ret = 0; - __osPfsInodeCacheBank = 0xfa; - - __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); - ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - __osPfsGetOneChannelData(channel, &data); - - if ((data.status & CONT_CARD_ON) && (data.status & CONT_CARD_PULL)) { - return PFS_ERR_NEW_PACK; - } - - if (data.errno != 0 || (data.status & CONT_CARD_ON) == 0) { - return PFS_ERR_NOPACK; - } - - if (data.status & CONT_ADDR_CRC_ER) { - return PFS_ERR_CONTRFAIL; - } - - return ret; -} - -void __osPfsRequestOneChannel(int channel, u8 cmd) -{ - u8 *ptr; - __OSContRequestFormatShort requestformat; - int i; - - __osContLastCmd = CONT_CMD_END; - __osPfsPifRam.pifstatus = CONT_CMD_EXE; - ptr = (u8 *)&__osPfsPifRam; - - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = cmd; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - - for (i = 0; i < channel; i++) { - *ptr++ = 0; - } - - *(__OSContRequestFormatShort *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormatShort); - *ptr = CONT_CMD_END; -} - -void __osPfsGetOneChannelData(int channel, OSContStatus *data) -{ - u8 *ptr; - __OSContRequestFormatShort requestformat; - int i; - - ptr = (u8*)&__osPfsPifRam; - - for (i = 0; i < channel; i++) { - ptr++; - } - - requestformat = *(__OSContRequestFormatShort *)ptr; - data->errno = CHNL_ERR(requestformat); - - if (data->errno == 0) { - data->type = (requestformat.typel << 8) | (requestformat.typeh); - data->status = requestformat.status; - } -} diff --git a/src/libultra/io/pfsisplug.c b/src/libultra/io/pfsisplug.c deleted file mode 100644 index 7b35ef4..0000000 --- a/src/libultra/io/pfsisplug.c +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -extern OSPifRam __osPfsPifRam; -s32 osPfsIsPlug(OSMesgQueue *queue, u8 *pattern) -{ - s32 ret; - OSMesg dummy; - u8 bitpattern; - OSContStatus data[MAXCONTROLLERS]; - int channel; - u8 bits; - int crc_error_cnt; - ret = 0; - bits = 0; - crc_error_cnt = 3; - __osSiGetAccess(); - while (TRUE) - { - __osPfsRequestData(CONT_CMD_REQUEST_STATUS); - ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - __osPfsGetInitData(&bitpattern, data); - for (channel = 0; channel < __osMaxControllers; channel++) - { - if ((data[channel].status & CONT_ADDR_CRC_ER) == 0) - { - crc_error_cnt--; - break; - } - } - if (__osMaxControllers == channel) - crc_error_cnt = 0; - if (crc_error_cnt < 1) - { - for (channel = 0; channel < __osMaxControllers; channel++) - { - if (data[channel].errno == 0 && (data[channel].status & CONT_CARD_ON) != 0) - bits |= 1 << channel; - } - __osSiRelAccess(); - *pattern = bits; - return ret; - } - } -} -void __osPfsRequestData(u8 cmd) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - ptr = (u8 *)&__osPfsPifRam; - __osContLastCmd = cmd; - __osPfsPifRam.pifstatus = CONT_CMD_EXE; - requestformat.dummy = CONT_CMD_NOP; - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = cmd; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - requestformat.dummy1 = CONT_CMD_NOP; - for (i = 0; i < __osMaxControllers; i++) - { - *(__OSContRequestFormat *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormat); - } - *ptr = CONT_CMD_END; -} -void __osPfsGetInitData(u8 *pattern, OSContStatus *data) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - u8 bits; - bits = 0; - ptr = (u8 *)&__osPfsPifRam; - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContRequestFormat)) - { - requestformat = *(__OSContRequestFormat *)ptr; - data->errno = CHNL_ERR(requestformat); - if (data->errno == 0) - { - data->type = (requestformat.typel << 8) | (requestformat.typeh); - data->status = requestformat.status; - bits |= 1 << i; - } - data++; - } - *pattern = bits; -} diff --git a/src/libultra/io/pfsselectbank.c b/src/libultra/io/pfsselectbank.c deleted file mode 100644 index 4c03254..0000000 --- a/src/libultra/io/pfsselectbank.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 __osPfsSelectBank(OSPfs *pfs, u8 bank) -{ - u8 temp[8][4]; - int i, j; - s32 ret; - ret = 0; - - for (i = 0; i < 8; i++) { - for(j = 0; j < 4; j++) { - temp[i][j] = bank; - } - } - - ret = __osContRamWrite(pfs->queue, pfs->channel, 1024, (u8*)temp, FALSE); - - if (ret == 0) { - pfs->activebank = bank; - } - - return ret; -} diff --git a/src/libultra/io/piacs.c b/src/libultra/io/piacs.c deleted file mode 100644 index e61222d..0000000 --- a/src/libultra/io/piacs.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -extern u32 __osPiAccessQueueEnabled; -extern OSMesg piAccessBuf[1]; -extern OSMesgQueue __osPiAccessQueue; - -void __osPiCreateAccessQueue(void) { - __osPiAccessQueueEnabled = 1; - osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, ARRAY_COUNT(piAccessBuf)); - osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); -} - -void __osPiGetAccess(void) { - OSMesg msg; - - if (!__osPiAccessQueueEnabled) { - __osPiCreateAccessQueue(); - } - - osRecvMesg(&__osPiAccessQueue, &msg, OS_MESG_BLOCK); -} - -void __osPiRelAccess(void) { - osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); -} diff --git a/src/libultra/io/pigetcmdq.c b/src/libultra/io/pigetcmdq.c deleted file mode 100644 index a820be0..0000000 --- a/src/libultra/io/pigetcmdq.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "common.h" - -extern s32 D_8007A860; -extern s32 D_8007A868; - -// TODO: This returns an OSMesgQueue pointer. D_8007A860 should -// be __osPiDevMgr.active and D_8007A868 should be -// __osPiDevMgr.cmdQueue. -s32 osPiGetCmdQueue(void) { - if (D_8007A860 == 0) { - return 0; - } - return D_8007A868; -} diff --git a/src/libultra/io/pimgr.c b/src/libultra/io/pimgr.c deleted file mode 100644 index 53843dd..0000000 --- a/src/libultra/io/pimgr.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include "piint.h" - -extern s32 osPiRawStartDma(s32, u32, void *, u32); // TODO: DEFINE -extern s32 osEPiRawStartDma(OSPiHandle *, s32, u32, void *, u32); // TODO: DEFINE - -extern OSDevMgr __osPiDevMgr; -extern OSPiHandle *__osPiTable; -extern OSPiHandle *__osCurrentHandle[2]; -extern OSThread piThread; -extern char piThreadStack[OS_PIM_STACKSIZE]; -#ifdef _DEBUG -extern OSThread ramromThread; -extern char ramromThreadStack[OS_RAMROM_STACKSIZE]; -extern OSMesgQueue getRamromQ; -extern OSMesg getRamromBuf[1]; -extern OSMesgQueue freeRamromQ; -extern OSMesg freeRamromBuf[1]; -#endif -extern OSMesgQueue piEventQueue; -extern OSMesg piEventBuf[1]; -void osCreatePiManager(OSPri pri, OSMesgQueue *cmdQ, OSMesg *cmdBuf, s32 cmdMsgCnt) -{ - u32 savedMask; - OSPri oldPri; - OSPri myPri; - if (!__osPiDevMgr.active) - { - osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt); - osCreateMesgQueue(&piEventQueue, (OSMesg*)&piEventBuf, 1); - if (!__osPiAccessQueueEnabled) - __osPiCreateAccessQueue(); - osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222); - oldPri = -1; - myPri = osGetThreadPri(NULL); - if (myPri < pri) - { - oldPri = myPri; - osSetThreadPri(NULL, pri); - } - savedMask = __osDisableInt(); - __osPiDevMgr.active = 1; - __osPiDevMgr.thread = &piThread; - __osPiDevMgr.cmdQueue = cmdQ; - __osPiDevMgr.evtQueue = &piEventQueue; - __osPiDevMgr.acsQueue = &__osPiAccessQueue; - __osPiDevMgr.dma = osPiRawStartDma; - __osPiDevMgr.edma = osEPiRawStartDma; - osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, &piThreadStack[OS_PIM_STACKSIZE], pri); - osStartThread(&piThread); - __osRestoreInt(savedMask); - if (oldPri != -1) - { - osSetThreadPri(NULL, oldPri); - } - } -} diff --git a/src/libultra/io/pirawdma.c b/src/libultra/io/pirawdma.c deleted file mode 100644 index 9fc7901..0000000 --- a/src/libultra/io/pirawdma.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include "piint.h" - -s32 osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) -{ - register u32 stat; - WAIT_ON_IOBUSY(stat); - IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS((u32)osRomBase | devAddr)); - switch (direction) - { - case OS_READ: - IO_WRITE(PI_WR_LEN_REG, size - 1); - break; - case OS_WRITE: - IO_WRITE(PI_RD_LEN_REG, size - 1); - break; - default: - return -1; - } - return 0; -} diff --git a/src/libultra/io/si.c b/src/libultra/io/si.c deleted file mode 100644 index c20c71b..0000000 --- a/src/libultra/io/si.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "siint.h" - -int __osSiDeviceBusy() -{ - register u32 stat = IO_READ(SI_STATUS_REG); - if (stat & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) - return 1; - return 0; -} diff --git a/src/libultra/io/siacs.c b/src/libultra/io/siacs.c deleted file mode 100644 index 8001295..0000000 --- a/src/libultra/io/siacs.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -extern OSMesg siAccessBuf; -extern u32 var8009c7c4; -extern OSMesgQueue __osSiAccessQueue; - -extern u32 __osSiAccessQueueEnabled; - -void __osSiCreateAccessQueue(void) -{ - __osSiAccessQueueEnabled = 1; - osCreateMesgQueue(&__osSiAccessQueue, &siAccessBuf, 1); - osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); -} - -void __osSiGetAccess(void) -{ - OSMesg dummyMesg; - - if (!__osSiAccessQueueEnabled) { - __osSiCreateAccessQueue(); - } - - osRecvMesg(&__osSiAccessQueue, &dummyMesg, OS_MESG_BLOCK); -} - -void __osSiRelAccess(void) -{ - osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); -} diff --git a/src/libultra/io/sirawdma.c b/src/libultra/io/sirawdma.c deleted file mode 100644 index b464a10..0000000 --- a/src/libultra/io/sirawdma.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -s32 __osSiRawStartDma(s32 direction, void *dramAddr) -{ - if (IO_READ(SI_STATUS_REG) & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) { - return -1; - } - - if (direction == OS_WRITE) { - osWritebackDCache(dramAddr, 64); - } - - IO_WRITE(SI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - - if (direction == OS_READ) { - IO_WRITE(SI_PIF_ADDR_RD64B_REG, 0x1fc007c0); - } else { - IO_WRITE(SI_PIF_ADDR_WR64B_REG, 0x1fc007c0); - } - - if (direction == OS_READ) { - osInvalDCache(dramAddr, 64); - } - - return 0; -} diff --git a/src/libultra/io/sirawread.c b/src/libultra/io/sirawread.c deleted file mode 100644 index ea27761..0000000 --- a/src/libultra/io/sirawread.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "siint.h" - -s32 __osSiRawReadIo(u32 devAddr, u32 *data) -{ - if (__osSiDeviceBusy()) - return -1; - *data = IO_READ(devAddr); - return 0; -} diff --git a/src/libultra/io/sp.c b/src/libultra/io/sp.c deleted file mode 100644 index 9517083..0000000 --- a/src/libultra/io/sp.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -int __osSpDeviceBusy() -{ - register u32 stat = IO_READ(SP_STATUS_REG); - if (stat & (SP_STATUS_DMA_BUSY | SP_STATUS_DMA_FULL | SP_STATUS_IO_FULL)) - return 1; - return 0; -} diff --git a/src/libultra/io/sprawdma.c b/src/libultra/io/sprawdma.c deleted file mode 100644 index 9d20e5e..0000000 --- a/src/libultra/io/sprawdma.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -s32 __osSpRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) -{ - if (__osSpDeviceBusy()) { - return -1; - } - - IO_WRITE(SP_MEM_ADDR_REG, devAddr); - IO_WRITE(SP_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - - if (direction == OS_READ) { - IO_WRITE(SP_WR_LEN_REG, size - 1); - } else { - IO_WRITE(SP_RD_LEN_REG, size - 1); - } - - return 0; -} diff --git a/src/libultra/io/sptask.c b/src/libultra/io/sptask.c deleted file mode 100644 index a0ebde9..0000000 --- a/src/libultra/io/sptask.c +++ /dev/null @@ -1,60 +0,0 @@ -#include - -#define _osVirtualToPhysical(ptr) \ - if (ptr != NULL) { \ - ptr = (void*)osVirtualToPhysical(ptr); \ - } - -extern OSTask sTmpTask; - -OSTask* _VirtualToPhysicalTask(OSTask* intp) { - OSTask* tp = &sTmpTask; - - _bcopy(intp, tp, sizeof(OSTask)); - - _osVirtualToPhysical(tp->t.ucode); - _osVirtualToPhysical(tp->t.ucode_data); - _osVirtualToPhysical(tp->t.dram_stack); - _osVirtualToPhysical(tp->t.output_buff); - _osVirtualToPhysical(tp->t.output_buff_size); - _osVirtualToPhysical(tp->t.data_ptr); - _osVirtualToPhysical(tp->t.yield_data_ptr); - - return tp; -} - -void osSpTaskLoad(OSTask* intp) { - OSTask* tp = _VirtualToPhysicalTask(intp); - - if (tp->t.flags & OS_TASK_YIELDED) { - tp->t.ucode_data = tp->t.yield_data_ptr; - tp->t.ucode_data_size = tp->t.yield_data_size; - intp->t.flags &= ~OS_TASK_YIELDED; - - if (tp->t.flags & OS_TASK_LOADABLE) { - tp->t.ucode = (u64*)HW_REG((u32)intp->t.yield_data_ptr + OS_YIELD_DATA_SIZE - 4, u32); - } - } - osWritebackDCache(tp, sizeof(OSTask)); - __osSpSetStatus(SP_CLR_SIG0 | SP_CLR_SIG1 | SP_CLR_SIG2 | SP_SET_INTR_BREAK); - - while (__osSpSetPc((void*)SP_IMEM_START) == -1) { - ; - } - while (__osSpRawStartDma(OS_WRITE, (void*)(SP_IMEM_START - sizeof(*tp)), tp, sizeof(OSTask)) == -1) { - ; - } - while (__osSpDeviceBusy()) { - ; - } - while (__osSpRawStartDma(OS_WRITE, (void*)SP_IMEM_START, tp->t.ucode_boot, tp->t.ucode_boot_size) == -1) { - ; - } -} - -void osSpTaskStartGo(OSTask* tp) { - while (__osSpDeviceBusy()) { - ; - } - __osSpSetStatus(SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT); -} diff --git a/src/libultra/io/sptaskyield.c b/src/libultra/io/sptaskyield.c deleted file mode 100644 index 78637ce..0000000 --- a/src/libultra/io/sptaskyield.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -void osSpTaskYield(void) -{ - __osSpSetStatus(SP_SET_YIELD); -} diff --git a/src/libultra/io/sptaskyielded.c b/src/libultra/io/sptaskyielded.c deleted file mode 100644 index 030f46e..0000000 --- a/src/libultra/io/sptaskyielded.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/sptask.h" -#include "PR/rcp.h" - -OSYieldResult osSpTaskYielded(OSTask *tp) { - u32 status; - OSYieldResult result; - - status = __osSpGetStatus(); - - if (status & SP_STATUS_YIELDED) { - result = OS_TASK_YIELDED; - } else { - result = 0; - } - - if (status & SP_STATUS_YIELD) { - tp->t.flags |= result; - tp->t.flags &= ~(OS_TASK_DP_WAIT); - } - - return result; -} diff --git a/src/libultra/io/vi.c b/src/libultra/io/vi.c deleted file mode 100644 index 93a6795..0000000 --- a/src/libultra/io/vi.c +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -static __OSViContext vi[2] = {0}; -__OSViContext *__osViCurr = &vi[0]; -__OSViContext *__osViNext = &vi[1]; - -void __osViInit(void) { - bzero(vi, sizeof(vi)); - __osViCurr = &vi[0]; - __osViNext = &vi[1]; - __osViNext->retraceCount = 1; - __osViCurr->retraceCount = 1; - __osViNext->framep = (void*)K0BASE; - __osViCurr->framep = (void*)K0BASE; - - if (osTvType == OS_TV_TYPE_PAL) { - __osViNext->modep = &osViModePalLan1; - } else if (osTvType == OS_TV_TYPE_MPAL) { - __osViNext->modep = &osViModeMpalLan1; - } else { - __osViNext->modep = &osViModeNtscLan1; - } - - __osViNext->state = VI_STATE_BLACK; - __osViNext->control = __osViNext->modep->comRegs.ctrl; - - while (IO_READ(VI_CURRENT_REG) > 10) { //wait for vsync? - } - - IO_WRITE(VI_CONTROL_REG, 0); //pixel size blank (no data, no sync) - __osViSwapContext(); -} diff --git a/src/libultra/io/vigetcurrframebuf.c b/src/libultra/io/vigetcurrframebuf.c deleted file mode 100644 index 987e86b..0000000 --- a/src/libultra/io/vigetcurrframebuf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "viint.h" - -void *osViGetCurrentFramebuffer(void) { - register u32 saveMask = __osDisableInt(); - void *framep = __osViCurr->framep; - - __osRestoreInt(saveMask); - return framep; -} diff --git a/src/libultra/io/vimgr.c b/src/libultra/io/vimgr.c deleted file mode 100644 index 0377d64..0000000 --- a/src/libultra/io/vimgr.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include "viint.h" -#include "../os/osint.h" - -#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0]))) - -OSDevMgr __osViDevMgr = {0}; -u32 __additional_scanline = 0; -static OSThread viThread; -static unsigned char viThreadStack[OS_VIM_STACKSIZE]; -static OSMesgQueue viEventQueue; -static OSMesg viEventBuf[5]; -static OSIoMesg viRetraceMsg; -static OSIoMesg viCounterMsg; - -static void viMgrMain(void *arg); -void osCreateViManager(OSPri pri) -{ - u32 savedMask; - OSPri oldPri; - OSPri myPri; - - if (!__osViDevMgr.active) { - __osTimerServicesInit(); - __additional_scanline = 0; - osCreateMesgQueue(&viEventQueue, viEventBuf, ARRLEN(viEventBuf)); - viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE; - viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL; - viRetraceMsg.hdr.retQueue = NULL; - viCounterMsg.hdr.type = OS_MESG_TYPE_COUNTER; - viCounterMsg.hdr.pri = OS_MESG_PRI_NORMAL; - viCounterMsg.hdr.retQueue = NULL; - osSetEventMesg(OS_EVENT_VI, &viEventQueue, &viRetraceMsg); - osSetEventMesg(OS_EVENT_COUNTER, &viEventQueue, &viCounterMsg); - oldPri = -1; - myPri = osGetThreadPri(NULL); - - if (myPri < pri) { - oldPri = myPri; - osSetThreadPri(NULL, pri); - } - - savedMask = __osDisableInt(); - __osViDevMgr.active = TRUE; - __osViDevMgr.thread = &viThread; - __osViDevMgr.cmdQueue = &viEventQueue; - __osViDevMgr.evtQueue = &viEventQueue; - __osViDevMgr.acsQueue = NULL; - __osViDevMgr.dma = NULL; - __osViDevMgr.edma = NULL; - osCreateThread(&viThread, 0, viMgrMain, &__osViDevMgr, &viThreadStack[OS_VIM_STACKSIZE], pri); - __osViInit(); - osStartThread(&viThread); - __osRestoreInt(savedMask); - - if (oldPri != -1) { - osSetThreadPri(0, oldPri); - } - } -} - -static void viMgrMain(void *arg) { - __OSViContext *vc; - OSDevMgr *dm; - OSIoMesg *mb; - static u16 retrace; - s32 first; - u32 count; - - mb = NULL; - first = 0; - vc = __osViGetCurrentContext(); - retrace = vc->retraceCount; - if (retrace == 0) - retrace = 1; - dm = (OSDevMgr *)arg; - - while (TRUE) { - osRecvMesg(dm->evtQueue, (OSMesg)&mb, OS_MESG_BLOCK); - switch (mb->hdr.type) { - case OS_MESG_TYPE_VRETRACE: - __osViSwapContext(); - retrace--; - - if (retrace == 0) { - vc = __osViGetCurrentContext(); - if (vc->msgq != NULL) - osSendMesg(vc->msgq, vc->msg, OS_MESG_NOBLOCK); - retrace = vc->retraceCount; - } - - __osViIntrCount++; - - if (first) { - count = osGetCount(); - __osCurrentTime = count; - first = 0; - } - - count = __osBaseCounter; - __osBaseCounter = osGetCount(); - count = __osBaseCounter - count; - __osCurrentTime = __osCurrentTime + count; - break; - case OS_MESG_TYPE_COUNTER: - __osTimerInterrupt(); - break; - } - } -} diff --git a/src/libultra/io/virepeatline.c b/src/libultra/io/virepeatline.c deleted file mode 100644 index 0eaf66e..0000000 --- a/src/libultra/io/virepeatline.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include "viint.h" - -void osViRepeatLine(u8 active) -{ - register u32 saveMask; - saveMask = __osDisableInt(); - if (active) - { - __osViNext->state |= VI_STATE_REPEATLINE; - } - else - __osViNext->state &= ~VI_STATE_REPEATLINE; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/visetevent.c b/src/libultra/io/visetevent.c deleted file mode 100644 index 589647a..0000000 --- a/src/libultra/io/visetevent.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -void osViSetEvent(OSMesgQueue *mq, OSMesg m, u32 retraceCount) { - register u32 saveMask = __osDisableInt(); - - __osViNext->msgq = mq; - __osViNext->msg = m; - __osViNext->retraceCount = retraceCount; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/visetmode.c b/src/libultra/io/visetmode.c deleted file mode 100644 index 03ddae7..0000000 --- a/src/libultra/io/visetmode.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include "viint.h" - -void osViSetMode(OSViMode *modep) -{ - register u32 saveMask; - saveMask = __osDisableInt(); - __osViNext->modep = modep; - __osViNext->state = VI_STATE_MODE_UPDATED; - __osViNext->control = __osViNext->modep->comRegs.ctrl; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/visetxscale.c b/src/libultra/io/visetxscale.c deleted file mode 100644 index 328987c..0000000 --- a/src/libultra/io/visetxscale.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -void osViSetXScale(f32 value) { - register u32 nomValue; - register u32 saveMask = __osDisableInt(); - - __osViNext->x.factor = value; - __osViNext->state |= VI_STATE_XSCALE_UPDATED; - nomValue = __osViNext->modep->comRegs.xScale & VI_SCALE_MASK; - __osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & VI_SCALE_MASK; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/visetyscale.c b/src/libultra/io/visetyscale.c deleted file mode 100644 index 525e0eb..0000000 --- a/src/libultra/io/visetyscale.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -void osViSetYScale(f32 value) { - register u32 saveMask = __osDisableInt(); - - __osViNext->y.factor = value; - __osViNext->state |= VI_STATE_YSCALE_UPDATED; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/viswapbuf.c b/src/libultra/io/viswapbuf.c deleted file mode 100644 index ee58f17..0000000 --- a/src/libultra/io/viswapbuf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "viint.h" - -void osViSwapBuffer(void* frameBufPtr) { - u32 saveMask = __osDisableInt(); - - __osViNext->framep = frameBufPtr; - __osViNext->state |= VI_STATE_BUFFER_UPDATED; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/libc/ldiv.c b/src/libultra/libc/ldiv.c deleted file mode 100644 index 3a7d57c..0000000 --- a/src/libultra/libc/ldiv.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -lldiv_t lldiv(long long num, long long denom) -{ - lldiv_t ret; - - ret.quot = num / denom; - ret.rem = num - denom * ret.quot; - - if (ret.quot < 0 && ret.rem > 0) { - ret.quot++; - ret.rem -= denom; - } - - return ret; -} - -ldiv_t ldiv(long num, long denom) -{ - ldiv_t ret; - - ret.quot = num / denom; - ret.rem = num - denom * ret.quot; - - if (ret.quot < 0 && ret.rem > 0) { - ret.quot++; - ret.rem -= denom; - } - - return ret; -} diff --git a/src/libultra/libc/ll.c b/src/libultra/libc/ll.c deleted file mode 100644 index f05204a..0000000 --- a/src/libultra/libc/ll.c +++ /dev/null @@ -1,47 +0,0 @@ -#include - -s64 __ull_rshift(u64 l, s64 r) { - return l >> r; -} - -u64 __ull_rem(u64 l, u64 r) { - return l % r; -} - -u64 __ull_div(u64 l, u64 r) { - return l / r; -} - -s64 __ll_lshift(s64 l, s64 r) { - return l << r; -} - -s64 __ll_rem(s64 l, u64 r) { - return l % r; -} - -s64 __ll_div(s64 l, s64 r) { - return l / r; -} - -s64 __ll_mul(s64 l, s64 r) { - return l * r; -} - -void __ull_divremi(u64* quotient, u64* remainder, u64 dividend, u16 divisor) { - *quotient = dividend / divisor; - *remainder = dividend % divisor; -} - -s64 __ll_mod(s64 l, s64 r) { - s64 remainder = l % r; - - if (((remainder < 0) && (r > 0)) || ((remainder > 0) && (r < 0))) { - remainder += r; - } - return remainder; -} - -s64 __ll_rshift(s64 l, s64 r) { - return l >> r; -} diff --git a/src/libultra/libc/sprintf.c b/src/libultra/libc/sprintf.c deleted file mode 100644 index fb0eb6e..0000000 --- a/src/libultra/libc/sprintf.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include "stdarg.h" - -typedef unsigned long uintptr_t; - -int _Printf(char *(*prout)(char *, const char *, size_t), char *dst, const char *fmt, va_list args); - -void* proutSprintf(void* dst, const char* fmt, size_t size) { - return (void*)((uintptr_t)memcpy(dst, fmt, size) + size); -} - -int sprintf(char* dst, char* fmt, ...) { - int ans; - va_list args; - va_start(args, fmt); - - ans = _Printf((void*)&proutSprintf, dst, fmt, args); - if (ans > -1) { - dst[ans] = 0; - } - - va_end(args); - - return ans; -} diff --git a/src/libultra/libc/syncprintf.c b/src/libultra/libc/syncprintf.c deleted file mode 100644 index 0dc0ce9..0000000 --- a/src/libultra/libc/syncprintf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -void osSyncPrintf(const char *fmt, ...) -{ - int ans; - va_list ap; - // these functions intentionally left blank. ifdeffed out in rom release -} -void rmonPrintf(const char *fmt, ...) -{ - int ans; - va_list ap; -} diff --git a/src/libultra/libc/xprintf.c b/src/libultra/libc/xprintf.c deleted file mode 100644 index 893ca31..0000000 --- a/src/libultra/libc/xprintf.c +++ /dev/null @@ -1,244 +0,0 @@ -#include -#include -#include "xstdio.h" - -#define isdigit(x) ((x >= '0' && x <= '9')) -#define LDSIGN(x) (((unsigned short *)&(x))[0] & 0x8000) - -#define ATOI(dst, src) \ - for (dst = 0; isdigit(*src); ++src) \ - { \ - if (dst < 999) \ - dst = dst * 10 + *src - '0'; \ - } - -#define MAX_PAD ((sizeof(spaces) - 1)) -#define PAD(s, n) \ - if (0 < (n)) \ - { \ - int i, j = (n); \ - for (; 0 < j; j -= i) \ - { \ - i = MAX_PAD < (unsigned int)j ? (int)MAX_PAD : j; \ - PUT(s, i); \ - } \ - } -#define PUT(s, n) \ - if (0 < (n)) \ - { \ - if ((arg = (*prout)(arg, s, n)) != NULL) \ - x.size += (n); \ - else \ - return x.size; \ - } -static char spaces[] = " "; -static char zeroes[] = "00000000000000000000000000000000"; - -static void _Putfld(printf_struct *pf, va_list *pap, char code, char *ac); -int _Printf(outfun prout, char *arg, const char *fmt, va_list args) -{ - printf_struct x; - const char *s; - char c; - const char *t; - static const char fchar[6] = " +-#0"; - static const int fbit[6] = {FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAGS_ZERO, 0}; - char ac[32]; - x.size = 0; - for (;;) - { - s = fmt; - for (c = *s; c != 0 && c != '%';) - { - - c = *++s; - } - PUT(fmt, s - fmt); - if (c == 0) - return x.size; - fmt = ++s; - for (x.flags = 0; (t = strchr(fchar, *s)) != NULL; s++) - { - x.flags |= fbit[t - fchar]; - } - if (*s == '*') - { - x.width = va_arg(args, int); - if (x.width < 0) - { - x.width = -x.width; - x.flags |= FLAGS_MINUS; - } - s++; - } - else - { - ATOI(x.width, s); - } - if (*s != '.') - x.precision = -1; - else if (*++s == '*') - { - x.precision = va_arg(args, int); - ++s; - } - else - { - ATOI(x.precision, s); - } - x.length = strchr("hlL", *s) ? *s++ : '\0'; - if (x.length == 'l' && *s == 'l') - { - x.length = 'L'; - ++s; - } - _Putfld(&x, &args, *s, ac); - x.width -= x.n0 + x.num_leading_zeros + x.part2_len + x.num_mid_zeros + x.part3_len + x.num_trailing_zeros; - if (!(x.flags & FLAGS_MINUS)) - PAD(spaces, x.width); - PUT(ac, x.n0); - PAD(zeroes, x.num_leading_zeros); - PUT(x.buff, x.part2_len); - PAD(zeroes, x.num_mid_zeros); - PUT(x.buff + x.part2_len, x.part3_len); - PAD(zeroes, x.num_trailing_zeros); - if (x.flags & FLAGS_MINUS) - PAD(spaces, x.width); - fmt = s + 1; - } - return 0; -} - -static void _Putfld(printf_struct *x, va_list *args, char type, char *buff) -{ - x->n0 = x->num_leading_zeros = x->part2_len = x->num_mid_zeros = x->part3_len = - x->num_trailing_zeros = 0; - - switch (type) - { - case 'c': - buff[x->n0++] = va_arg(*args, int); - break; - - case 'd': - case 'i': - if (x->length == 'l') - x->value.s64 = va_arg(*args, int); - else if (x->length == 'L') - x->value.s64 = va_arg(*args, s64); - else - x->value.s64 = va_arg(*args, int); - - if (x->length == 'h') - { - x->value.s64 = (s16)x->value.s64; - } - - if (x->value.s64 < 0) - { - buff[x->n0++] = '-'; - } - else if (x->flags & FLAGS_PLUS) - { - buff[x->n0++] = '+'; - } - else if (x->flags & FLAGS_SPACE) - { - buff[x->n0++] = ' '; - } - - x->buff = (char *)&buff[x->n0]; - - _Litob(x, type); - break; - - case 'x': - case 'X': - case 'u': - case 'o': - if (x->length == 'l') - { - x->value.s64 = va_arg(*args, int); - } - else if (x->length == 'L') - { - x->value.s64 = va_arg(*args, s64); - } - else - { - x->value.s64 = va_arg(*args, int); - } - - if (x->length == 'h') - { - x->value.s64 = (u16)x->value.s64; - } - else if (x->length == 0) - { - x->value.s64 = (unsigned int)x->value.s64; - } - - if (x->flags & FLAGS_HASH) - { - buff[x->n0++] = '0'; - if (type == 'x' || type == 'X') - { - - buff[x->n0++] = type; - } - } - x->buff = (char *)&buff[x->n0]; - _Litob(x, type); - break; - - case 'e': - case 'f': - case 'g': - case 'E': - case 'G': - //... okay? - x->value.f64 = x->length == 'L' ? va_arg(*args, f64) : va_arg(*args, f64); - - if (LDSIGN(x->value.f64)) - buff[x->n0++] = '-'; - else if (x->flags & FLAGS_PLUS) - buff[x->n0++] = '+'; - else if (x->flags & FLAGS_SPACE) - buff[x->n0++] = ' '; - - x->buff = (char *)&buff[x->n0]; - _Ldtob(x, type); - break; - - case 'n': - if (x->length == 'h') - *(va_arg(*args, u16 *)) = x->size; - else if (x->length == 'l') - *va_arg(*args, unsigned int *) = x->size; - else if (x->length == 'L') - *va_arg(*args, u64 *) = x->size; - else - *va_arg(*args, unsigned int *) = x->size; - break; - - case 'p': - x->value.s64 = (long)va_arg(*args, void *); - x->buff = (char *)&buff[x->n0]; - _Litob(x, 'x'); - break; - - case 's': - x->buff = va_arg(*args, char *); - x->part2_len = strlen(x->buff); - if (x->precision >= 0 && x->part2_len > x->precision) - x->part2_len = x->precision; - break; - case '%': - //this doesn't match in -g because of regalloc issues?? - buff[x->n0++] = '%'; - break; - default: - buff[x->n0++] = type; - break; - } -} diff --git a/src/libultra/os/afterprenmi.c b/src/libultra/os/afterprenmi.c deleted file mode 100644 index 234d4b7..0000000 --- a/src/libultra/os/afterprenmi.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -s32 osAfterPreNMI(void) { - return __osSpSetPc(0); -} diff --git a/src/libultra/os/createmesgqueue.c b/src/libultra/os/createmesgqueue.c deleted file mode 100644 index 2649739..0000000 --- a/src/libultra/os/createmesgqueue.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -extern void *__osThreadTail; - -void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg, s32 msgCount) -{ - mq->mtqueue = (OSThread *)&__osThreadTail; - mq->fullqueue = (OSThread *)&__osThreadTail; - mq->validCount = 0; - mq->first = 0; - mq->msgCount = msgCount; - mq->msg = msg; -} diff --git a/src/libultra/os/createthread.c b/src/libultra/os/createthread.c deleted file mode 100644 index 7059a40..0000000 --- a/src/libultra/os/createthread.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -void __osCleanupThread(void); - -extern OSThread *__osActiveQueue; - -void osCreateThread(OSThread *t, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri p) -{ - register u32 saveMask; - OSIntMask mask; - t->id = id; - t->priority = p; - t->next = NULL; - t->queue = NULL; - t->context.pc = (u32)entry; - t->context.a0 = (u64)arg; - t->context.sp = (u64)sp - 16; - t->context.ra = (u64)__osCleanupThread; - mask = OS_IM_ALL; - t->context.sr = SR_IMASK | SR_EXL | SR_IE; - t->context.rcp = (mask & RCP_IMASK) >> RCP_IMASKSHIFT; - t->context.fpcsr = (u32)(FPCSR_FS | FPCSR_EV); - t->fp = 0; - t->state = OS_STATE_STOPPED; - t->flags = 0; - saveMask = __osDisableInt(); - t->tlnext = __osActiveQueue; - __osActiveQueue = t; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/os/dequeuethread.c b/src/libultra/os/dequeuethread.c deleted file mode 100644 index df3d1f8..0000000 --- a/src/libultra/os/dequeuethread.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -void __osDequeueThread(OSThread** queue, OSThread* thread) { - register OSThread** a2 = queue; - register OSThread* a3 = *a2; - - while (a3 != NULL) { - if (a3 == thread) { - *a2 = thread->next; - return; - } - a2 = &a3->next; - a3 = *a2; - } -} diff --git a/src/libultra/os/destroythread.c b/src/libultra/os/destroythread.c deleted file mode 100644 index 712d6a6..0000000 --- a/src/libultra/os/destroythread.c +++ /dev/null @@ -1,37 +0,0 @@ -#include - -extern OSThread *__osRunningThread; -extern OSThread *__osActiveQueue; - -void osDestroyThread(OSThread* thread) { - register u32 prevInt = __osDisableInt(); - register OSThread* s1; - register OSThread* s2; - - if (thread == NULL) { - thread = __osRunningThread; - - } else if (thread->state != OS_STATE_STOPPED) { - __osDequeueThread(thread->queue, thread); - } - - if (__osActiveQueue == thread) { - __osActiveQueue = __osActiveQueue->tlnext; - } else { - s1 = __osActiveQueue; - while (s1->priority != OS_PRIORITY_THREADTAIL) { - s2 = s1->tlnext; - if (s2 == thread) { - s1->tlnext = thread->tlnext; - break; - } - s1 = s2; - } - } - - if (thread == __osRunningThread) { - __osDispatchThread(); - } - - __osRestoreInt(prevInt); -} diff --git a/src/libultra/os/getmemsize.c b/src/libultra/os/getmemsize.c deleted file mode 100644 index f1f4b48..0000000 --- a/src/libultra/os/getmemsize.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -#define STEP 0x100000 - -u32 osGetMemSize(void) { - u32* ptr; - u32 size = 0x400000; - u32 data0; - u32 data1; - - while (size < 0x800000) { - ptr = (u32*)(0xA0000000 + size); - - data0 = *ptr; - data1 = ptr[STEP / 4 - 1]; - - *ptr ^= ~0; - ptr[STEP / 4 - 1] ^= ~0; - - if ((*ptr != (data0 ^ ~0)) || (ptr[STEP / 4 - 1] != (data1 ^ ~0))) { - return size; - } - - *ptr = data0; - ptr[STEP / 4 - 1] = data1; - - size += STEP; - } - - return size; -} diff --git a/src/libultra/os/getthreadpri.c b/src/libultra/os/getthreadpri.c deleted file mode 100644 index 21a6dda..0000000 --- a/src/libultra/os/getthreadpri.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -extern OSThread *__osRunningThread; -OSPri osGetThreadPri(OSThread *thread) -{ - if (thread == NULL) - thread = __osRunningThread; - return thread->priority; -} diff --git a/src/libultra/os/gettime.c b/src/libultra/os/gettime.c deleted file mode 100644 index de235ed..0000000 --- a/src/libultra/os/gettime.c +++ /dev/null @@ -1,18 +0,0 @@ -#include - -extern u32 __osBaseCounter; -extern OSTime __osCurrentTime; - -OSTime osGetTime(void) { - u32 count; - u32 base; - u64 t; - register u32 prevInt = __osDisableInt(); - - count = osGetCount(); - base = count - __osBaseCounter; - t = __osCurrentTime; - __osRestoreInt(prevInt); - - return base + t; -} diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c deleted file mode 100644 index a1cf36e..0000000 --- a/src/libultra/os/initialize.c +++ /dev/null @@ -1,99 +0,0 @@ -#include - -#define RESETTYPE_COLD 0 -#define RESETTYPE_WARM 1 - -typedef struct { - unsigned int inst1; - unsigned int inst2; - unsigned int inst3; - unsigned int inst4; -} __osExceptionVector; - -extern __osExceptionVector __osExceptionPreamble; -extern s32 osAppNMIBuffer[]; - -extern u32 __osFinalRom; - -OSTime osClockRate = 62500000; - -s32 osViClock = VI_NTSC_CLOCK; - -u32 __osShutdown = 0; -u32 __osGlobalIntMask = OS_IM_ALL; - -u32 var8005cf74 = 0; -u32 var8005cf78 = 0; -u32 var8005cf7c = 0; - -OSPiHandle *__osCartRomInit(void); - -void osInitialize(void) -{ - u32 pifdata; - u32 unused = 0; - - __osFinalRom = TRUE; - __osSetSR(__osGetSR() | SR_CU1); - __osSetFpcCsr(FPCSR_FS | FPCSR_EV); - - while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)); - - while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8)); - - *(__osExceptionVector *)UT_VEC = __osExceptionPreamble; - *(__osExceptionVector *)XUT_VEC = __osExceptionPreamble; - *(__osExceptionVector *)ECC_VEC = __osExceptionPreamble; - *(__osExceptionVector *)E_VEC = __osExceptionPreamble; - - osWritebackDCache((void *)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); - osInvalICache((void *)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); - __osCartRomInit(); - osUnmapTLBAll(); - osMapTLBRdb(); - - osClockRate = osClockRate * 3 / 4; - - if (osResetType == RESETTYPE_COLD) { - bzero(&osAppNMIBuffer, 0x40); - } - - if (osTvType == OS_TV_PAL) { - osViClock = VI_PAL_CLOCK; - } else if (osTvType == OS_TV_MPAL) { - osViClock = VI_MPAL_CLOCK; - } else { - osViClock = VI_NTSC_CLOCK; - } - - if (__osGetCause() & CAUSE_IP5) { - while (1); - } - - *(u32 *)PHYS_TO_K1(AI_CONTROL_REG) = 1; - *(u32 *)PHYS_TO_K1(AI_DACRATE_REG) = 0x3fff; - *(u32 *)PHYS_TO_K1(AI_BITRATE_REG) = 0xf; -} - -extern OSPiHandle CartRomHandle; -extern OSPiHandle LeoDiskHandle; - -/** - * According to Nintendo's SDK this function should return a pointer to an - * OSPiHandle, but the function only matches if the return statement is omitted. - * By chance the value in v0 happens to be &CartRomHandle anyway. - */ -OSPiHandle *__osCartRomInit(void) -{ - CartRomHandle.type = DEVICE_TYPE_INIT; - CartRomHandle.latency = IO_READ(0xa4600014); - CartRomHandle.pulse = IO_READ(0xa4600018); - CartRomHandle.pageSize = IO_READ(0xa460001c); - CartRomHandle.relDuration = IO_READ(0xa4600020); - - LeoDiskHandle.type = DEVICE_TYPE_INIT; - LeoDiskHandle.latency = IO_READ(0xa4600024); - LeoDiskHandle.pulse = IO_READ(0xa4600028); - LeoDiskHandle.pageSize = IO_READ(0xa460002c); - LeoDiskHandle.relDuration = IO_READ(0xa4600030); -} diff --git a/src/libultra/os/jammesg.c b/src/libultra/os/jammesg.c deleted file mode 100644 index 894c15c..0000000 --- a/src/libultra/os/jammesg.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -extern OSThread *__osRunningThread; - -s32 osJamMesg(OSMesgQueue *mq, OSMesg msg, s32 flag) -{ - register u32 saveMask = __osDisableInt(); - while (mq->validCount >= mq->msgCount) - { - if (flag == OS_MESG_BLOCK) - { - __osRunningThread->state = OS_STATE_WAITING; - __osEnqueueAndYield(&mq->fullqueue); - } - else - { - __osRestoreInt(saveMask); - return -1; - } - } - - mq->first = (mq->first + mq->msgCount - 1) % mq->msgCount; - mq->msg[mq->first] = msg; - mq->validCount++; - if (mq->mtqueue->next != NULL) - { - osStartThread(__osPopThread(&mq->mtqueue)); - } - __osRestoreInt(saveMask); - return 0; -} diff --git a/src/libultra/os/recvmesg.c b/src/libultra/os/recvmesg.c deleted file mode 100644 index 7895630..0000000 --- a/src/libultra/os/recvmesg.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "common.h" - -extern OSThread* __osRunningThread; // todo remove eventually - -s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flag) { - register s32 s0 = __osDisableInt(); - - while (mq->validCount == 0) { - if (flag == OS_MESG_NOBLOCK) { - __osRestoreInt(s0); - return -1; - } - __osRunningThread->state = 8; - __osEnqueueAndYield(mq); - } - - if (msg != NULL) { - *msg = mq->msg[mq->first]; - } - - mq->first = (mq->first + 1) % mq->msgCount; - mq->validCount--; - - if (mq->fullqueue->next != NULL) { - osStartThread(__osPopThread(&mq->fullqueue)); - } - - __osRestoreInt(s0); - - return 0; -} diff --git a/src/libultra/os/sendmesg.c b/src/libultra/os/sendmesg.c deleted file mode 100644 index 3047197..0000000 --- a/src/libultra/os/sendmesg.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "common.h" - -extern OSThread* __osRunningThread; // todo remove eventually - -s32 osSendMesg(OSMesgQueue* mq, OSMesg mesg, s32 flag) { - register u32 s0 = __osDisableInt(); - register u32 index; - - while (mq->validCount >= mq->msgCount) { - if (flag == OS_MESG_BLOCK) { - __osRunningThread->state = 8; - __osEnqueueAndYield(&mq->fullqueue); - } else { - __osRestoreInt(s0); - return -1; - } - } - - index = (mq->first + mq->validCount) % mq->msgCount; - mq->msg[index] = mesg; - mq->validCount++; - - if (mq->mtqueue->next != NULL) { - osStartThread(__osPopThread(&mq->mtqueue)); - } - - __osRestoreInt(s0); - - return 0; -} diff --git a/src/libultra/os/seteventmesg.c b/src/libultra/os/seteventmesg.c deleted file mode 100644 index 701eea2..0000000 --- a/src/libultra/os/seteventmesg.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include "ultra64/internal.h" - -extern __OSEventState __osEventStateTab[OS_NUM_EVENTS]; - -extern u32 __osPreNMI; -extern u32 __osShutdown; - -void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg msg) { - register u32 prevInt = __osDisableInt(); - __OSEventState* msgs = &__osEventStateTab[e]; - - msgs->queue = mq; - msgs->msg = msg; - - if (e == OS_EVENT_PRENMI) { - if (__osShutdown && !__osPreNMI) { - osSendMesg(mq, msg, OS_MESG_NOBLOCK); - } - __osPreNMI = true; - } - __osRestoreInt(prevInt); -} diff --git a/src/libultra/os/sethwinterrupt.c b/src/libultra/os/sethwinterrupt.c deleted file mode 100644 index 0fc9d30..0000000 --- a/src/libultra/os/sethwinterrupt.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "PR/os_internal.h" - -struct __osHwInt { - s32 (*handler)(void); - void *stackEnd; -}; - -extern struct __osHwInt __osHwIntTable[]; - -void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void *stackEnd) { - register u32 saveMask= __osDisableInt(); - - __osHwIntTable[interrupt].handler = handler; - __osHwIntTable[interrupt].stackEnd = stackEnd; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/os/settime.c b/src/libultra/os/settime.c deleted file mode 100644 index 5bae2a2..0000000 --- a/src/libultra/os/settime.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -void osSetTime(OSTime time) { - __osCurrentTime = time; -} diff --git a/src/libultra/os/settimer.c b/src/libultra/os/settimer.c deleted file mode 100644 index 7d10f9e..0000000 --- a/src/libultra/os/settimer.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include "osint.h" - -int osSetTimer(OSTimer *t, OSTime value, OSTime interval, OSMesgQueue *mq, OSMesg msg) -{ - OSTime time; - - t->next = NULL; - t->prev = NULL; - t->interval = interval; - - if (value != 0) { - t->value = value; - } else { - t->value = interval; - } - - t->mq = mq; - t->msg = msg; - time = __osInsertTimer(t); - - if (__osTimerList->next == t) { - __osSetTimerIntr(time); - } - - return 0; -} diff --git a/src/libultra/os/startthread.c b/src/libultra/os/startthread.c deleted file mode 100644 index 0358ebb..0000000 --- a/src/libultra/os/startthread.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include "osint.h" - -void osStartThread(OSThread *t) -{ - register u32 saveMask = __osDisableInt(); - - switch (t->state) { - case OS_STATE_WAITING: - t->state = OS_STATE_RUNNABLE; - __osEnqueueThread(&__osRunQueue, t); - break; - case OS_STATE_STOPPED: - if (t->queue == NULL || t->queue == &__osRunQueue) { - t->state = OS_STATE_RUNNABLE; - __osEnqueueThread(&__osRunQueue, t); - } else { - t->state = OS_STATE_WAITING; - __osEnqueueThread(t->queue, t); - __osEnqueueThread(&__osRunQueue, __osPopThread(t->queue)); - } - break; - } - - if (__osRunningThread == NULL) { - __osDispatchThread(); - } else if (__osRunningThread->priority < __osRunQueue->priority) { - __osRunningThread->state = OS_STATE_RUNNABLE; - __osEnqueueAndYield(&__osRunQueue); - } - - __osRestoreInt(saveMask); -} diff --git a/src/libultra/os/stopthread.c b/src/libultra/os/stopthread.c deleted file mode 100644 index 4962f5a..0000000 --- a/src/libultra/os/stopthread.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "common.h" - -extern OSThread* __osRunningThread; // todo remove eventually - -void osStopThread(OSThread* thread) { - register u32 s0 = __osDisableInt(); - register u32 state; - - if (thread == NULL) { - state = 4; - } else { - state = thread->state; - } - - switch (state) { - case 4: - __osRunningThread->state = 1; - __osEnqueueAndYield(NULL); - break; - case 2: - case 8: - thread->state = 1; - __osDequeueThread(thread->queue, thread); - break; - } - - __osRestoreInt(s0); -} diff --git a/src/libultra/os/timerintr.c b/src/libultra/os/timerintr.c deleted file mode 100644 index 18fcde0..0000000 --- a/src/libultra/os/timerintr.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -OSTimer *__osTimerList = &__osBaseTimer; -OSTimer __osBaseTimer; -OSTime __osCurrentTime; -u32 __osBaseCounter; -u32 __osViIntrCount; -u32 __osTimerCounter; - -void __osTimerServicesInit(void) { - __osCurrentTime = 0; - __osBaseCounter = 0; - __osViIntrCount = 0; - __osTimerList->prev = __osTimerList; - __osTimerList->next = __osTimerList->prev; - __osTimerList->value = 0; - __osTimerList->interval = __osTimerList->value; - __osTimerList->mq = NULL; - __osTimerList->msg = 0; -} - -void __osTimerInterrupt(void) { - OSTimer *t; - u32 count; - u32 elapsed_cycles; - - if (__osTimerList->next != __osTimerList) { - while (TRUE) { - t = __osTimerList->next; - if (t == __osTimerList) { - __osSetCompare(0); - __osTimerCounter = 0; - break; - } - - count = osGetCount(); - elapsed_cycles = count - __osTimerCounter; - __osTimerCounter = count; - - if (elapsed_cycles < t->value) - { - t->value -= elapsed_cycles; - __osSetTimerIntr(t->value); - break; - } else { - t->prev->next = t->next; - t->next->prev = t->prev; - t->next = NULL; - t->prev = NULL; - - if (t->mq != NULL) { - osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK); - } - - if (t->interval != 0) { - t->value = t->interval; - __osInsertTimer(t); - } - } - } - } -} - -void __osSetTimerIntr(OSTime tim) { - OSTime NewTime; - u32 savedMask; - - savedMask = __osDisableInt(); - __osTimerCounter = osGetCount(); - NewTime = __osTimerCounter + tim; - __osSetCompare(NewTime); - __osRestoreInt(savedMask); -} - -OSTime __osInsertTimer(OSTimer* timer) { - OSTimer* nextTimer; - u64 timerValue; - u32 prevInt = __osDisableInt(); - - for (nextTimer = __osTimerList->next, timerValue = timer->value; - nextTimer != __osTimerList && timerValue > nextTimer->value; - timerValue -= nextTimer->value, nextTimer = nextTimer->next) { - ; - } - - timer->value = timerValue; - if (nextTimer != __osTimerList) { - nextTimer->value -= timerValue; - } - - timer->next = nextTimer; - timer->prev = nextTimer->prev; - nextTimer->prev->next = timer; - nextTimer->prev = timer; - __osRestoreInt(prevInt); - - return timerValue; -} diff --git a/src/libultra/os/virtualtophysical.c b/src/libultra/os/virtualtophysical.c deleted file mode 100644 index 283a8d5..0000000 --- a/src/libultra/os/virtualtophysical.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -u32 osVirtualToPhysical(void *addr) -{ - if (IS_KSEG0(addr)) { - return K0_TO_PHYS(addr); - } else if (IS_KSEG1(addr)) { - return K1_TO_PHYS(addr); - } else { - return __osProbeTLB(addr); - } -} diff --git a/src/main.c b/src/main.c index 7176d27..7b3348c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ #include -#include "common.h" +#include "global.h" #include "dp_intro.h" #include "crash_screen.h" #include "rsp.h" diff --git a/src/rsp.c b/src/rsp.c index 6bf5780..9460298 100644 --- a/src/rsp.c +++ b/src/rsp.c @@ -1,5 +1,5 @@ #include -#include "common.h" +#include "global.h" #include "rsp.h" // All from n64 programming manual section 27.2 diff --git a/src/stage_loader.c b/src/stage_loader.c index 4b93756..ee59fd2 100644 --- a/src/stage_loader.c +++ b/src/stage_loader.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #include "stage_loader.h" #include "memory.h" #include "string.h" @@ -230,7 +230,7 @@ void func_800069F0(void) { } #else void func_800069F0(void); -#pragma GLOBAL_ASM("asm/nonmatchings/stage_loader/func_800069F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/stage_loader/func_800069F0.s") #endif s32 func_80006C04(s32 arg0) { diff --git a/src/stage_loader.h b/src/stage_loader.h index 9140f1b..7d0ac18 100644 --- a/src/stage_loader.h +++ b/src/stage_loader.h @@ -1,7 +1,7 @@ #ifndef _STAGE_LOADER_H_ #define _STAGE_LOADER_H_ -#include "common.h" +#include "global.h" s32 func_80006C6C(s32); s32 func_80006CB4(s32); diff --git a/src/unk_49190.s b/src/unk_49190.s new file mode 100644 index 0000000..b72cc2a --- /dev/null +++ b/src/unk_49190.s @@ -0,0 +1,426 @@ +.include "macro.inc" + +/* assembler directives */ +.set noat /* allow manual use of $at */ +.set noreorder /* don't insert nops after branches */ +.set gp=64 /* allow use of 64-bit general purpose registers */ + +.section .text, "ax" + +/* Generated by spimdisasm 1.28.0 */ + +/* Handwritten function */ +glabel func_80048590 +/* 049190 80048590 2481FFF9 */ addiu $at, $a0, -0x7 +/* 049194 80048594 1C20000D */ bgtz $at, .L800485CC +/* 049198 80048598 00000000 */ nop +/* 04919C 8004859C 03E00821 */ addu $at, $ra, $zero +/* 0491A0 800485A0 04100036 */ bltzal $zero, .L8004867C +/* 0491A4 800485A4 00000000 */ nop +/* 0491A8 800485A8 27EF00D4 */ addiu $t7, $ra, 0xD4 +/* 0491AC 800485AC 0020F821 */ addu $ra, $at, $zero +/* 0491B0 800485B0 01E47821 */ addu $t7, $t7, $a0 +/* 0491B4 800485B4 81E10000 */ lb $at, 0x0($t7) +/* 0491B8 800485B8 00000000 */ nop +/* 0491BC 800485BC 00014103 */ sra $t0, $at, 4 +/* 0491C0 800485C0 30290007 */ andi $t1, $at, 0x7 +/* 0491C4 800485C4 10000004 */ b .L800485D8 +/* 0491C8 800485C8 00000000 */ nop +.L800485CC: +/* 0491CC 800485CC 2488FFF8 */ addiu $t0, $a0, -0x8 +/* 0491D0 800485D0 000840C3 */ sra $t0, $t0, 3 +/* 0491D4 800485D4 30890007 */ andi $t1, $a0, 0x7 +.L800485D8: +/* 0491D8 800485D8 000962C0 */ sll $t4, $t1, 11 +/* 0491DC 800485DC 258C47FF */ addiu $t4, $t4, 0x47FF +/* 0491E0 800485E0 340A0006 */ ori $t2, $zero, 0x6 +/* 0491E4 800485E4 01485023 */ subu $t2, $t2, $t0 +/* 0491E8 800485E8 340B0001 */ ori $t3, $zero, 0x1 +/* 0491EC 800485EC 2541FFFF */ addiu $at, $t2, -0x1 +/* 0491F0 800485F0 002B5804 */ sllv $t3, $t3, $at +/* 0491F4 800485F4 340E000D */ ori $t6, $zero, 0xD +/* 0491F8 800485F8 00C0C021 */ addu $t8, $a2, $zero +.L800485FC: +/* 0491FC 800485FC 870D0000 */ lh $t5, 0x0($t8) +/* 049200 80048600 00000000 */ nop +/* 049204 80048604 000D6B40 */ sll $t5, $t5, 13 +/* 049208 80048608 25AD9000 */ addiu $t5, $t5, -0x7000 +/* 04920C 8004860C 01AC0018 */ mult $t5, $t4 +/* 049210 80048610 00006812 */ mflo $t5 +/* 049214 80048614 25AD4000 */ addiu $t5, $t5, 0x4000 +/* 049218 80048618 000D6BC3 */ sra $t5, $t5, 15 +/* 04921C 8004861C 01AB6821 */ addu $t5, $t5, $t3 +/* 049220 80048620 014D6807 */ srav $t5, $t5, $t2 +/* 049224 80048624 A70D0000 */ sh $t5, 0x0($t8) +/* 049228 80048628 25CEFFFF */ addiu $t6, $t6, -0x1 +/* 04922C 8004862C 1DC0FFF3 */ bgtz $t6, .L800485FC +/* 049230 80048630 27180002 */ addiu $t8, $t8, 0x2 +/* 049234 80048634 00E0C821 */ addu $t9, $a3, $zero +/* 049238 80048638 340E0028 */ ori $t6, $zero, 0x28 +.L8004863C: +/* 04923C 8004863C A7200000 */ sh $zero, 0x0($t9) +/* 049240 80048640 25CEFFFF */ addiu $t6, $t6, -0x1 +/* 049244 80048644 1DC0FFFD */ bgtz $t6, .L8004863C +/* 049248 80048648 27390002 */ addiu $t9, $t9, 0x2 +/* 04924C 8004864C 00E5C821 */ addu $t9, $a3, $a1 +/* 049250 80048650 0325C821 */ addu $t9, $t9, $a1 +/* 049254 80048654 00C0C021 */ addu $t8, $a2, $zero +/* 049258 80048658 340E000D */ ori $t6, $zero, 0xD +.L8004865C: +/* 04925C 8004865C 87010000 */ lh $at, 0x0($t8) +/* 049260 80048660 27180002 */ addiu $t8, $t8, 0x2 +/* 049264 80048664 A7210000 */ sh $at, 0x0($t9) +/* 049268 80048668 25CEFFFF */ addiu $t6, $t6, -0x1 +/* 04926C 8004866C 1DC0FFFB */ bgtz $t6, .L8004865C +/* 049270 80048670 27390006 */ addiu $t9, $t9, 0x6 +/* 049274 80048674 03E00008 */ jr $ra +/* 049278 80048678 00000000 */ nop +.L8004867C: +/* 04927C 8004867C C7D7E3E7 */ lwc1 $fs1f, -0x1C19($fp) +/* 049280 80048680 F1F3F5F7 */ scd $s3, -0xA09($t7) /* handwritten instruction */ + +glabel func_80048684 +/* 049284 80048684 848B0166 */ lh $t3, 0x166($a0) +/* 049288 80048688 24A1FFD8 */ addiu $at, $a1, -0x28 +/* 04928C 8004868C 04200005 */ bltz $at, .L800486A4 +/* 049290 80048690 00000000 */ nop +/* 049294 80048694 2421FFB0 */ addiu $at, $at, -0x50 +/* 049298 80048698 1C200002 */ bgtz $at, .L800486A4 +/* 04929C 8004869C 00000000 */ nop +/* 0492A0 800486A0 00A05821 */ addu $t3, $a1, $zero +.L800486A4: +/* 0492A4 800486A4 A48B0166 */ sh $t3, 0x166($a0) +/* 0492A8 800486A8 03E00821 */ addu $at, $ra, $zero +/* 0492AC 800486AC 04100022 */ bltzal $zero, .L80048738 +/* 0492B0 800486B0 00000000 */ nop +/* 0492B4 800486B4 27E80084 */ addiu $t0, $ra, 0x84 +/* 0492B8 800486B8 0020F821 */ addu $ra, $at, $zero +/* 0492BC 800486BC 01064021 */ addu $t0, $t0, $a2 +/* 0492C0 800486C0 01064021 */ addu $t0, $t0, $a2 +/* 0492C4 800486C4 95080000 */ lhu $t0, 0x0($t0) +/* 0492C8 800486C8 340A0077 */ ori $t2, $zero, 0x77 +/* 0492CC 800486CC 248D0000 */ addiu $t5, $a0, 0x0 +.L800486D0: +/* 0492D0 800486D0 95AC0050 */ lhu $t4, 0x50($t5) +/* 0492D4 800486D4 254AFFFF */ addiu $t2, $t2, -0x1 +/* 0492D8 800486D8 A5AC0000 */ sh $t4, 0x0($t5) +/* 0492DC 800486DC 0541FFFC */ bgez $t2, .L800486D0 +/* 0492E0 800486E0 25AD0002 */ addiu $t5, $t5, 0x2 +/* 0492E4 800486E4 340A0027 */ ori $t2, $zero, 0x27 +/* 0492E8 800486E8 248E0000 */ addiu $t6, $a0, 0x0 +/* 0492EC 800486EC 248D0000 */ addiu $t5, $a0, 0x0 +/* 0492F0 800486F0 01AB6823 */ subu $t5, $t5, $t3 +/* 0492F4 800486F4 01AB6823 */ subu $t5, $t5, $t3 +/* 0492F8 800486F8 00E07821 */ addu $t7, $a3, $zero +.L800486FC: +/* 0492FC 800486FC 85A900F0 */ lh $t1, 0xF0($t5) +/* 049300 80048700 25AD0002 */ addiu $t5, $t5, 0x2 +/* 049304 80048704 01280018 */ mult $t1, $t0 +/* 049308 80048708 00004812 */ mflo $t1 +/* 04930C 8004870C 25294000 */ addiu $t1, $t1, 0x4000 +/* 049310 80048710 00094BC3 */ sra $t1, $t1, 15 +/* 049314 80048714 85E10000 */ lh $at, 0x0($t7) +/* 049318 80048718 25EF0002 */ addiu $t7, $t7, 0x2 +/* 04931C 8004871C 01214821 */ addu $t1, $t1, $at +/* 049320 80048720 A5C900F0 */ sh $t1, 0xF0($t6) +/* 049324 80048724 25CE0002 */ addiu $t6, $t6, 0x2 +/* 049328 80048728 1D40FFF4 */ bgtz $t2, .L800486FC +/* 04932C 8004872C 254AFFFF */ addiu $t2, $t2, -0x1 +/* 049330 80048730 03E00008 */ jr $ra +/* 049334 80048734 00000000 */ nop +.L80048738: # these feel like deliberately invalid instructions. + # they decode to a branch from a delay slot, which + # cant possibly be valid. +/* 049338 80048738 0CCD2CCD */ .4byte 0x0CCD2CCD +/* 04933C 8004873C 53337FFF */ .4byte 0x53337FFF +.L80048740: +/* 049340 80048740 852A0000 */ lh $t2, 0x0($t1) +/* 049344 80048744 25290002 */ addiu $t1, $t1, 0x2 +/* 049348 80048748 00196C00 */ sll $t5, $t9, 16 +/* 04934C 8004874C 000D6C03 */ sra $t5, $t5, 16 +/* 049350 80048750 02ED0018 */ mult $s7, $t5 +/* 049354 80048754 00000812 */ mflo $at +/* 049358 80048758 24214000 */ addiu $at, $at, 0x4000 +/* 04935C 8004875C 00010BC3 */ sra $at, $at, 15 +/* 049360 80048760 01415023 */ subu $t2, $t2, $at +/* 049364 80048764 00196C03 */ sra $t5, $t9, 16 +/* 049368 80048768 02CD0018 */ mult $s6, $t5 +/* 04936C 8004876C 00000812 */ mflo $at +/* 049370 80048770 24214000 */ addiu $at, $at, 0x4000 +/* 049374 80048774 00010BC3 */ sra $at, $at, 15 +/* 049378 80048778 01415023 */ subu $t2, $t2, $at +/* 04937C 8004877C 01AA0018 */ mult $t5, $t2 +/* 049380 80048780 00000812 */ mflo $at +/* 049384 80048784 24214000 */ addiu $at, $at, 0x4000 +/* 049388 80048788 00010BC3 */ sra $at, $at, 15 +/* 04938C 8004878C 0036B821 */ addu $s7, $at, $s6 +/* 049390 80048790 00186C00 */ sll $t5, $t8, 16 +/* 049394 80048794 000D6C03 */ sra $t5, $t5, 16 +/* 049398 80048798 02AD0018 */ mult $s5, $t5 +/* 04939C 8004879C 00000812 */ mflo $at +/* 0493A0 800487A0 24214000 */ addiu $at, $at, 0x4000 +/* 0493A4 800487A4 00010BC3 */ sra $at, $at, 15 +/* 0493A8 800487A8 01415023 */ subu $t2, $t2, $at +/* 0493AC 800487AC 01AA0018 */ mult $t5, $t2 +/* 0493B0 800487B0 00000812 */ mflo $at +/* 0493B4 800487B4 24214000 */ addiu $at, $at, 0x4000 +/* 0493B8 800487B8 00010BC3 */ sra $at, $at, 15 +/* 0493BC 800487BC 0035B021 */ addu $s6, $at, $s5 +/* 0493C0 800487C0 00186C03 */ sra $t5, $t8, 16 +/* 0493C4 800487C4 028D0018 */ mult $s4, $t5 +/* 0493C8 800487C8 00000812 */ mflo $at +/* 0493CC 800487CC 24214000 */ addiu $at, $at, 0x4000 +/* 0493D0 800487D0 00010BC3 */ sra $at, $at, 15 +/* 0493D4 800487D4 01415023 */ subu $t2, $t2, $at +/* 0493D8 800487D8 01AA0018 */ mult $t5, $t2 +/* 0493DC 800487DC 00000812 */ mflo $at +/* 0493E0 800487E0 24214000 */ addiu $at, $at, 0x4000 +/* 0493E4 800487E4 00010BC3 */ sra $at, $at, 15 +/* 0493E8 800487E8 0034A821 */ addu $s5, $at, $s4 +/* 0493EC 800487EC 000F6C00 */ sll $t5, $t7, 16 +/* 0493F0 800487F0 000D6C03 */ sra $t5, $t5, 16 +/* 0493F4 800487F4 026D0018 */ mult $s3, $t5 +/* 0493F8 800487F8 00000812 */ mflo $at +/* 0493FC 800487FC 24214000 */ addiu $at, $at, 0x4000 +/* 049400 80048800 00010BC3 */ sra $at, $at, 15 +/* 049404 80048804 01415023 */ subu $t2, $t2, $at +/* 049408 80048808 01AA0018 */ mult $t5, $t2 +/* 04940C 8004880C 00000812 */ mflo $at +/* 049410 80048810 24214000 */ addiu $at, $at, 0x4000 +/* 049414 80048814 00010BC3 */ sra $at, $at, 15 +/* 049418 80048818 0033A021 */ addu $s4, $at, $s3 +/* 04941C 8004881C 000F6C03 */ sra $t5, $t7, 16 +/* 049420 80048820 024D0018 */ mult $s2, $t5 +/* 049424 80048824 00000812 */ mflo $at +/* 049428 80048828 24214000 */ addiu $at, $at, 0x4000 +/* 04942C 8004882C 00010BC3 */ sra $at, $at, 15 +/* 049430 80048830 01415023 */ subu $t2, $t2, $at +/* 049434 80048834 01AA0018 */ mult $t5, $t2 +/* 049438 80048838 00000812 */ mflo $at +/* 04943C 8004883C 24214000 */ addiu $at, $at, 0x4000 +/* 049440 80048840 00010BC3 */ sra $at, $at, 15 +/* 049444 80048844 00329821 */ addu $s3, $at, $s2 +/* 049448 80048848 000E6C00 */ sll $t5, $t6, 16 +/* 04944C 8004884C 000D6C03 */ sra $t5, $t5, 16 +/* 049450 80048850 022D0018 */ mult $s1, $t5 +/* 049454 80048854 00000812 */ mflo $at +/* 049458 80048858 24214000 */ addiu $at, $at, 0x4000 +/* 04945C 8004885C 00010BC3 */ sra $at, $at, 15 +/* 049460 80048860 01415023 */ subu $t2, $t2, $at +/* 049464 80048864 01AA0018 */ mult $t5, $t2 +/* 049468 80048868 00000812 */ mflo $at +/* 04946C 8004886C 24214000 */ addiu $at, $at, 0x4000 +/* 049470 80048870 00010BC3 */ sra $at, $at, 15 +/* 049474 80048874 00319021 */ addu $s2, $at, $s1 +/* 049478 80048878 000E6C03 */ sra $t5, $t6, 16 +/* 04947C 8004887C 020D0018 */ mult $s0, $t5 +/* 049480 80048880 00000812 */ mflo $at +/* 049484 80048884 24214000 */ addiu $at, $at, 0x4000 +/* 049488 80048888 00010BC3 */ sra $at, $at, 15 +/* 04948C 8004888C 01415023 */ subu $t2, $t2, $at +/* 049490 80048890 01AA0018 */ mult $t5, $t2 +/* 049494 80048894 00000812 */ mflo $at +/* 049498 80048898 24214000 */ addiu $at, $at, 0x4000 +/* 04949C 8004889C 00010BC3 */ sra $at, $at, 15 +/* 0494A0 800488A0 00308821 */ addu $s1, $at, $s0 +/* 0494A4 800488A4 01408021 */ addu $s0, $t2, $zero +/* 0494A8 800488A8 34016E14 */ ori $at, $zero, 0x6E14 +/* 0494AC 800488AC 00270018 */ mult $at, $a3 +/* 0494B0 800488B0 00000812 */ mflo $at +/* 0494B4 800488B4 24214000 */ addiu $at, $at, 0x4000 +/* 0494B8 800488B8 00010BC3 */ sra $at, $at, 15 +/* 0494BC 800488BC 01415021 */ addu $t2, $t2, $at +/* 0494C0 800488C0 01403821 */ addu $a3, $t2, $zero +/* 0494C4 800488C4 000A5040 */ sll $t2, $t2, 1 +/* 0494C8 800488C8 000A0BC3 */ sra $at, $t2, 15 +/* 0494CC 800488CC 24210001 */ addiu $at, $at, 0x1 +/* 0494D0 800488D0 00010843 */ sra $at, $at, 1 +/* 0494D4 800488D4 10200004 */ beqz $at, .L800488E8 +/* 0494D8 800488D8 00000000 */ nop +/* 0494DC 800488DC 04200002 */ bltz $at, .L800488E8 +/* 0494E0 800488E0 240A8000 */ addiu $t2, $zero, -0x8000 +/* 0494E4 800488E4 240A7FFF */ addiu $t2, $zero, 0x7FFF +.L800488E8: +/* 0494E8 800488E8 314AFFF8 */ andi $t2, $t2, 0xFFF8 +/* 0494EC 800488EC A50A0000 */ sh $t2, 0x0($t0) +/* 0494F0 800488F0 25080002 */ addiu $t0, $t0, 0x2 +/* 0494F4 800488F4 1D60FF92 */ bgtz $t3, .L80048740 +/* 0494F8 800488F8 256BFFFF */ addiu $t3, $t3, -0x1 +/* 0494FC 800488FC 03E00008 */ jr $ra +/* 049500 80048900 00000000 */ nop + +/* Handwritten function */ +glabel func_80048904 +/* 049504 80048904 27BDFFBC */ addiu $sp, $sp, -0x44 +/* 049508 80048908 AFBF0000 */ sw $ra, 0x0($sp) +/* 04950C 8004890C AFA40004 */ sw $a0, 0x4($sp) +/* 049510 80048910 AFA50008 */ sw $a1, 0x8($sp) +/* 049514 80048914 AFA6000C */ sw $a2, 0xC($sp) +/* 049518 80048918 AFA70010 */ sw $a3, 0x10($sp) +/* 04951C 8004891C AFB00014 */ sw $s0, 0x14($sp) +/* 049520 80048920 AFB10018 */ sw $s1, 0x18($sp) +/* 049524 80048924 AFB2001C */ sw $s2, 0x1C($sp) +/* 049528 80048928 AFB30020 */ sw $s3, 0x20($sp) +/* 04952C 8004892C AFB40024 */ sw $s4, 0x24($sp) +/* 049530 80048930 AFB50028 */ sw $s5, 0x28($sp) +/* 049534 80048934 AFB6002C */ sw $s6, 0x2C($sp) +/* 049538 80048938 AFB70030 */ sw $s7, 0x30($sp) +/* 04953C 8004893C 24810140 */ addiu $at, $a0, 0x140 +/* 049540 80048940 8C300000 */ lw $s0, 0x0($at) +/* 049544 80048944 8C310004 */ lw $s1, 0x4($at) +/* 049548 80048948 8C320008 */ lw $s2, 0x8($at) +/* 04954C 8004894C 8C33000C */ lw $s3, 0xC($at) +/* 049550 80048950 8C340010 */ lw $s4, 0x10($at) +/* 049554 80048954 8C350014 */ lw $s5, 0x14($at) +/* 049558 80048958 8C360018 */ lw $s6, 0x18($at) +/* 04955C 8004895C 8C37001C */ lw $s7, 0x1C($at) +/* 049560 80048960 84870164 */ lh $a3, 0x164($a0) +/* 049564 80048964 04100065 */ bltzal $zero, .L80048AFC +/* 049568 80048968 00000000 */ nop +/* 04956C 8004896C 27EB0190 */ addiu $t3, $ra, 0x190 +/* 049570 80048970 04110039 */ bal .L80048A58 /* handwritten instruction */ +/* 049574 80048974 00000000 */ nop +/* 049578 80048978 24A90000 */ addiu $t1, $a1, 0x0 +/* 04957C 8004897C 24C80000 */ addiu $t0, $a2, 0x0 +/* 049580 80048980 0411FF6F */ bal .L80048740 /* handwritten instruction */ +/* 049584 80048984 340B000C */ ori $t3, $zero, 0xC +/* 049588 80048988 04100062 */ bltzal $zero, .L80048B14 +/* 04958C 8004898C 00000000 */ nop +/* 049590 80048990 27EB0184 */ addiu $t3, $ra, 0x184 +/* 049594 80048994 04110030 */ bal .L80048A58 /* handwritten instruction */ +/* 049598 80048998 00000000 */ nop +/* 04959C 8004899C 24A9001A */ addiu $t1, $a1, 0x1A +/* 0495A0 800489A0 24C8001A */ addiu $t0, $a2, 0x1A +/* 0495A4 800489A4 0411FF66 */ bal .L80048740 /* handwritten instruction */ +/* 0495A8 800489A8 340B000D */ ori $t3, $zero, 0xD +/* 0495AC 800489AC 0410005D */ bltzal $zero, .L80048B24 +/* 0495B0 800489B0 00000000 */ nop +/* 0495B4 800489B4 27EB0170 */ addiu $t3, $ra, 0x170 +/* 0495B8 800489B8 04110027 */ bal .L80048A58 /* handwritten instruction */ +/* 0495BC 800489BC 00000000 */ nop +/* 0495C0 800489C0 24A90036 */ addiu $t1, $a1, 0x36 +/* 0495C4 800489C4 24C80036 */ addiu $t0, $a2, 0x36 +/* 0495C8 800489C8 0411FF5D */ bal .L80048740 /* handwritten instruction */ +/* 0495CC 800489CC 340B000C */ ori $t3, $zero, 0xC +/* 0495D0 800489D0 0410005A */ bltzal $zero, .L80048B3C +/* 0495D4 800489D4 00000000 */ nop +/* 0495D8 800489D8 27EB0164 */ addiu $t3, $ra, 0x164 +/* 0495DC 800489DC 0411001E */ bal .L80048A58 /* handwritten instruction */ +/* 0495E0 800489E0 00000000 */ nop +/* 0495E4 800489E4 24A90050 */ addiu $t1, $a1, 0x50 +/* 0495E8 800489E8 24C80050 */ addiu $t0, $a2, 0x50 +/* 0495EC 800489EC 0411FF54 */ bal .L80048740 /* handwritten instruction */ +/* 0495F0 800489F0 340B0077 */ ori $t3, $zero, 0x77 +/* 0495F4 800489F4 24810140 */ addiu $at, $a0, 0x140 +/* 0495F8 800489F8 AC300000 */ sw $s0, 0x0($at) +/* 0495FC 800489FC AC310004 */ sw $s1, 0x4($at) +/* 049600 80048A00 AC320008 */ sw $s2, 0x8($at) +/* 049604 80048A04 AC33000C */ sw $s3, 0xC($at) +/* 049608 80048A08 AC340010 */ sw $s4, 0x10($at) +/* 04960C 80048A0C AC350014 */ sw $s5, 0x14($at) +/* 049610 80048A10 AC360018 */ sw $s6, 0x18($at) +/* 049614 80048A14 AC37001C */ sw $s7, 0x1C($at) +/* 049618 80048A18 A4870164 */ sh $a3, 0x164($a0) +/* 04961C 80048A1C 8FBF0000 */ lw $ra, 0x0($sp) +/* 049620 80048A20 8FA40004 */ lw $a0, 0x4($sp) +/* 049624 80048A24 8FA50008 */ lw $a1, 0x8($sp) +/* 049628 80048A28 8FA6000C */ lw $a2, 0xC($sp) +/* 04962C 80048A2C 8FA70010 */ lw $a3, 0x10($sp) +/* 049630 80048A30 8FB00014 */ lw $s0, 0x14($sp) +/* 049634 80048A34 8FB10018 */ lw $s1, 0x18($sp) +/* 049638 80048A38 8FB2001C */ lw $s2, 0x1C($sp) +/* 04963C 80048A3C 8FB30020 */ lw $s3, 0x20($sp) +/* 049640 80048A40 8FB40024 */ lw $s4, 0x24($sp) +/* 049644 80048A44 8FB50028 */ lw $s5, 0x28($sp) +/* 049648 80048A48 8FB6002C */ lw $s6, 0x2C($sp) +/* 04964C 80048A4C 8FB70030 */ lw $s7, 0x30($sp) +/* 049650 80048A50 03E00008 */ jr $ra +/* 049654 80048A54 27BD0044 */ addiu $sp, $sp, 0x44 +.L80048A58: +/* 049658 80048A58 84810188 */ lh $at, 0x188($a0) +/* 04965C 80048A5C 24880168 */ addiu $t0, $a0, 0x168 +/* 049660 80048A60 10200003 */ beqz $at, .L80048A70 +/* 049664 80048A64 25090010 */ addiu $t1, $t0, 0x10 +/* 049668 80048A68 01204021 */ addu $t0, $t1, $zero +/* 04966C 80048A6C 24890168 */ addiu $t1, $a0, 0x168 +.L80048A70: +/* 049670 80048A70 03E06821 */ addu $t5, $ra, $zero +/* 049674 80048A74 850A0000 */ lh $t2, 0x0($t0) +/* 049678 80048A78 0160F809 */ jalr $t3 +/* 04967C 80048A7C 852C0000 */ lh $t4, 0x0($t1) +/* 049680 80048A80 000A7400 */ sll $t6, $t2, 16 +/* 049684 80048A84 850A0002 */ lh $t2, 0x2($t0) +/* 049688 80048A88 0160F809 */ jalr $t3 +/* 04968C 80048A8C 852C0002 */ lh $t4, 0x2($t1) +/* 049690 80048A90 01CA7025 */ or $t6, $t6, $t2 +/* 049694 80048A94 850A0004 */ lh $t2, 0x4($t0) +/* 049698 80048A98 0160F809 */ jalr $t3 +/* 04969C 80048A9C 852C0004 */ lh $t4, 0x4($t1) +/* 0496A0 80048AA0 000A7C00 */ sll $t7, $t2, 16 +/* 0496A4 80048AA4 850A0006 */ lh $t2, 0x6($t0) +/* 0496A8 80048AA8 0160F809 */ jalr $t3 +/* 0496AC 80048AAC 852C0006 */ lh $t4, 0x6($t1) +/* 0496B0 80048AB0 01EA7825 */ or $t7, $t7, $t2 +/* 0496B4 80048AB4 850A0008 */ lh $t2, 0x8($t0) +/* 0496B8 80048AB8 0160F809 */ jalr $t3 +/* 0496BC 80048ABC 852C0008 */ lh $t4, 0x8($t1) +/* 0496C0 80048AC0 000AC400 */ sll $t8, $t2, 16 +/* 0496C4 80048AC4 850A000A */ lh $t2, 0xA($t0) +/* 0496C8 80048AC8 0160F809 */ jalr $t3 +/* 0496CC 80048ACC 852C000A */ lh $t4, 0xA($t1) +/* 0496D0 80048AD0 030AC025 */ or $t8, $t8, $t2 +/* 0496D4 80048AD4 850A000C */ lh $t2, 0xC($t0) +/* 0496D8 80048AD8 0160F809 */ jalr $t3 +/* 0496DC 80048ADC 852C000C */ lh $t4, 0xC($t1) +/* 0496E0 80048AE0 000ACC00 */ sll $t9, $t2, 16 +/* 0496E4 80048AE4 850A000E */ lh $t2, 0xE($t0) +/* 0496E8 80048AE8 0160F809 */ jalr $t3 +/* 0496EC 80048AEC 852C000E */ lh $t4, 0xE($t1) +/* 0496F0 80048AF0 01A0F821 */ addu $ra, $t5, $zero +/* 0496F4 80048AF4 03E00008 */ jr $ra +/* 0496F8 80048AF8 032AC825 */ or $t9, $t9, $t2 +.L80048AFC: +/* 0496FC 80048AFC 000A5083 */ sra $t2, $t2, 2 +/* 049700 80048B00 000C6043 */ sra $t4, $t4, 1 +/* 049704 80048B04 014C5021 */ addu $t2, $t2, $t4 +/* 049708 80048B08 000C6043 */ sra $t4, $t4, 1 +/* 04970C 80048B0C 1000000B */ b .L80048B3C +/* 049710 80048B10 014C5021 */ addu $t2, $t2, $t4 +.L80048B14: +/* 049714 80048B14 000A5043 */ sra $t2, $t2, 1 +/* 049718 80048B18 000C6043 */ sra $t4, $t4, 1 +/* 04971C 80048B1C 10000007 */ b .L80048B3C +/* 049720 80048B20 014C5021 */ addu $t2, $t2, $t4 +.L80048B24: +/* 049724 80048B24 000A5043 */ sra $t2, $t2, 1 +/* 049728 80048B28 000C6083 */ sra $t4, $t4, 2 +/* 04972C 80048B2C 018A6021 */ addu $t4, $t4, $t2 +/* 049730 80048B30 000A5043 */ sra $t2, $t2, 1 +/* 049734 80048B34 10000001 */ b .L80048B3C +/* 049738 80048B38 014C5021 */ addu $t2, $t2, $t4 +.L80048B3C: +/* 04973C 80048B3C 05410003 */ bgez $t2, .L80048B4C +/* 049740 80048B40 00006021 */ addu $t4, $zero, $zero +/* 049744 80048B44 000A5023 */ negu $t2, $t2 +/* 049748 80048B48 340C0001 */ ori $t4, $zero, 0x1 +.L80048B4C: +/* 04974C 80048B4C 2541D4CD */ addiu $at, $t2, -0x2B33 +/* 049750 80048B50 04200006 */ bltz $at, .L80048B6C +/* 049754 80048B54 000A0840 */ sll $at, $t2, 1 +/* 049758 80048B58 2541B19A */ addiu $at, $t2, -0x4E66 +/* 04975C 80048B5C 04200003 */ bltz $at, .L80048B6C +/* 049760 80048B60 25412B33 */ addiu $at, $t2, 0x2B33 +/* 049764 80048B64 000A0883 */ sra $at, $t2, 2 +/* 049768 80048B68 24216600 */ addiu $at, $at, 0x6600 +.L80048B6C: +/* 04976C 80048B6C 242A8001 */ addiu $t2, $at, -0x7FFF +/* 049770 80048B70 19400002 */ blez $t2, .L80048B7C +/* 049774 80048B74 00205021 */ addu $t2, $at, $zero +/* 049778 80048B78 340A7FFF */ ori $t2, $zero, 0x7FFF +.L80048B7C: +/* 04977C 80048B7C 15800002 */ bnez $t4, .L80048B88 +/* 049780 80048B80 000A5023 */ negu $t2, $t2 +/* 049784 80048B84 000A5023 */ negu $t2, $t2 +.L80048B88: +/* 049788 80048B88 03E00008 */ jr $ra +/* 04978C 80048B8C 314AFFFF */ andi $t2, $t2, 0xFFFF diff --git a/tools/asm-differ/.github/workflows/check-poetry-lock.yml b/tools/asm-differ/.github/workflows/check-poetry-lock.yml new file mode 100644 index 0000000..6104770 --- /dev/null +++ b/tools/asm-differ/.github/workflows/check-poetry-lock.yml @@ -0,0 +1,20 @@ +name: flake check + +on: + pull_request: + push: + +permissions: read-all + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + # Install `nix` which is just a dead-simple way to get a stable `poetry` + # in scope. + - uses: cachix/install-nix-action@v20 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + # Check that poetry.lock is in sync with pyproject.toml + - run: nix run github:NixOS/nixpkgs/22.11#poetry -- lock --check diff --git a/tools/asm-differ/.github/workflows/unit-tests.yml b/tools/asm-differ/.github/workflows/unit-tests.yml new file mode 100644 index 0000000..a77498a --- /dev/null +++ b/tools/asm-differ/.github/workflows/unit-tests.yml @@ -0,0 +1,15 @@ +name: unit tests + +on: + pull_request: + push: + +permissions: read-all + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: python3 -m pip install --user colorama watchdog levenshtein cxxfilt + - run: python3 test.py diff --git a/tools/asm-differ/.gitignore b/tools/asm-differ/.gitignore new file mode 100644 index 0000000..90df93b --- /dev/null +++ b/tools/asm-differ/.gitignore @@ -0,0 +1,3 @@ +.mypy_cache/ +__pycache__/ +.vscode/ diff --git a/tools/asm-differ/.gitrepo b/tools/asm-differ/.gitrepo new file mode 100644 index 0000000..b40f427 --- /dev/null +++ b/tools/asm-differ/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = git@github.com:simonlindholm/asm-differ.git + branch = main + commit = 6d3e4c44d1ad8ad59bcae3abecb35f0d10e135e1 + parent = da9fca47be7d8f957b786c02d7bf4b4a48830f4a + method = merge + cmdver = 0.4.3 diff --git a/tools/asm-differ/.pre-commit-config.yaml b/tools/asm-differ/.pre-commit-config.yaml new file mode 100644 index 0000000..67ba03d --- /dev/null +++ b/tools/asm-differ/.pre-commit-config.yaml @@ -0,0 +1,5 @@ +repos: +- repo: https://github.com/psf/black + rev: 22.3.0 + hooks: + - id: black diff --git a/tools/asm-differ/LICENSE b/tools/asm-differ/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/tools/asm-differ/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/tools/asm-differ/README.md b/tools/asm-differ/README.md new file mode 100644 index 0000000..63b5253 --- /dev/null +++ b/tools/asm-differ/README.md @@ -0,0 +1,56 @@ +# asm-differ + +Nice differ for assembly code. Currently supports MIPS, PPC, AArch64, ARM32, and SH2; should be easy to hack to support other instruction sets. + +![](screenshot.png) + +## Dependencies + +- Python >= 3.6 +- `python3 -m pip install --user colorama watchdog levenshtein cxxfilt` (also `dataclasses` if on 3.6) + +## Usage + +Create a file `diff_settings.py` in some directory (see the one in this repo for an example). Then from that directory, run + +```bash +/path/to/diff.py [flags] (function|rom addr) +``` + +Recommended flags are `-mwo` (automatically run `make` on source file changes, and include symbols in diff). See `--help` for more details. + +### Tab completion + +[argcomplete](https://kislyuk.github.io/argcomplete/) can be optionally installed (with `python3 -m pip install argcomplete`) to enable tab completion in a bash shell, completing options and symbol names using the linker map. It also requires a bit more setup: + +If invoking the script **exactly** as `./diff.py`, the following should be added to the `.bashrc` according to argcomplete's instructions: + +```bash +eval "$(register-python-argcomplete ./diff.py)" +``` + +If that doesn't work, run `register-python-argcomplete ./diff.py` in your terminal and copy the output to `.bashrc`. + +If setup correctly (don't forget to restart the shell), `complete | grep ./diff.py` should output: + +```bash +complete -o bashdefault -o default -o nospace -F _python_argcomplete ./diff.py +``` + +Note for developers or for general troubleshooting: run `export _ARC_DEBUG=` to enable debug output during tab-completion, it may show otherwise silenced errors. Use `unset _ARC_DEBUG` or restart the terminal to disable. + +### Contributing + +Contributions are very welcome! Some notes on workflow: + +`black` is used for code formatting. You can either run `black diff.py` manually, or set up a pre-commit hook: +```bash +pip install pre-commit black +pre-commit install +``` + +Type annotations are used for all Python code. `mypy` should pass without any errors. + +PRs that skip the above are still welcome, however. + +The targeted Python version is 3.6. There are currently no tests. diff --git a/tools/asm-differ/diff-stylesheet.css b/tools/asm-differ/diff-stylesheet.css new file mode 100644 index 0000000..79da120 --- /dev/null +++ b/tools/asm-differ/diff-stylesheet.css @@ -0,0 +1,67 @@ +table.diff { + border: none; + font-family: Monospace; + white-space: pre; +} +tr.data-ref { + background-color: gray; +} +.immediate { + color: lightblue; +} +.stack { + color: yellow; +} +.register { + color: yellow; +} +.delay-slot { + font-weight: bold; + color: gray; +} +.diff-change { + color: lightblue; +} +.diff-add { + color: green; +} +.diff-remove { + color: red; +} +.source-filename { + font-weight: bold; +} +.source-function { + font-weight: bold; + text-decoration: underline; +} +.source-other { + font-style: italic; +} +.rotation-0 { + color: magenta; +} +.rotation-1 { + color: cyan; +} +.rotation-2 { + color: green; +} +.rotation-3 { + color: red; +} +.rotation-4 { + color: yellow; +} +.rotation-5 { + color: pink; +} +.rotation-6 { + color: blue; +} +.rotation-7 { + color: lime; +} +.rotation-8 { + color: gray; +} diff --git a/tools/asm-differ/diff.py b/tools/asm-differ/diff.py new file mode 100755 index 0000000..543e8fe --- /dev/null +++ b/tools/asm-differ/diff.py @@ -0,0 +1,3523 @@ +#!/usr/bin/env python3 +# PYTHON_ARGCOMPLETE_OK +import argparse +import enum +import sys +from typing import ( + Any, + Callable, + Dict, + Iterator, + List, + Match, + NoReturn, + Optional, + Pattern, + Set, + Tuple, + Type, + Union, +) + + +def fail(msg: str) -> NoReturn: + print(msg, file=sys.stderr) + sys.exit(1) + + +def static_assert_unreachable(x: NoReturn) -> NoReturn: + raise Exception("Unreachable! " + repr(x)) + + +class DiffMode(enum.Enum): + SINGLE = "single" + SINGLE_BASE = "single_base" + NORMAL = "normal" + THREEWAY_PREV = "3prev" + THREEWAY_BASE = "3base" + + +# ==== COMMAND-LINE ==== + +if __name__ == "__main__": + # Prefer to use diff_settings.py from the current working directory + sys.path.insert(0, ".") + try: + import diff_settings + except ModuleNotFoundError: + fail("Unable to find diff_settings.py in the same directory.") + sys.path.pop(0) + + try: + import argcomplete + except ModuleNotFoundError: + argcomplete = None + + parser = argparse.ArgumentParser( + description="Diff MIPS, PPC, AArch64, ARM32, or SH2 assembly." + ) + + start_argument = parser.add_argument( + "start", + help="Function name or address to start diffing from.", + ) + + if argcomplete: + + def complete_symbol( + prefix: str, parsed_args: argparse.Namespace, **kwargs: object + ) -> List[str]: + if not prefix or prefix.startswith("-"): + # skip reading the map file, which would + # result in a lot of useless completions + return [] + config: Dict[str, Any] = {} + diff_settings.apply(config, parsed_args) # type: ignore + mapfile = config.get("mapfile") + if not mapfile: + return [] + completes = [] + with open(mapfile) as f: + data = f.read() + # assume symbols are prefixed by a space character + search = f" {prefix}" + pos = data.find(search) + while pos != -1: + # skip the space character in the search string + pos += 1 + # assume symbols are suffixed by either a space + # character or a (unix-style) line return + spacePos = data.find(" ", pos) + lineReturnPos = data.find("\n", pos) + if lineReturnPos == -1: + endPos = spacePos + elif spacePos == -1: + endPos = lineReturnPos + else: + endPos = min(spacePos, lineReturnPos) + if endPos == -1: + match = data[pos:] + pos = -1 + else: + match = data[pos:endPos] + pos = data.find(search, endPos) + completes.append(match) + return completes + + setattr(start_argument, "completer", complete_symbol) + + parser.add_argument( + "end", + nargs="?", + help="Address to end diff at.", + ) + parser.add_argument( + "-o", + dest="diff_obj", + action="store_true", + help="""Diff .o files rather than a whole binary. This makes it possible to + see symbol names. (Recommended)""", + ) + parser.add_argument( + "-f", + "--objfile", + dest="objfile", + type=str, + help="""File path for an object file being diffed. When used + the map file isn't searched for the function given. Useful for dynamically + linked libraries.""", + ) + parser.add_argument( + "-e", + "--elf", + dest="diff_elf_symbol", + metavar="SYMBOL", + help="""Diff a given function in two ELFs, one being stripped and the other + one non-stripped. Requires objdump from binutils 2.33+.""", + ) + parser.add_argument( + "-c", + "--source", + dest="show_source", + action="store_true", + help="Show source code (if possible). Only works with -o or -e.", + ) + parser.add_argument( + "-C", + "--source-old-binutils", + dest="source_old_binutils", + action="store_true", + help="""Tweak --source handling to make it work with binutils < 2.33. + Implies --source.""", + ) + parser.add_argument( + "-j", + "--section", + dest="diff_section", + default=".text", + metavar="SECTION", + help="Diff restricted to a given output section.", + ) + parser.add_argument( + "-L", + "--line-numbers", + dest="show_line_numbers", + action="store_const", + const=True, + help="""Show source line numbers in output, when available. May be enabled by + default depending on diff_settings.py.""", + ) + parser.add_argument( + "--no-line-numbers", + dest="show_line_numbers", + action="store_const", + const=False, + help="Hide source line numbers in output.", + ) + parser.add_argument( + "--inlines", + dest="inlines", + action="store_true", + help="Show inline function calls (if possible). Only works with -o or -e.", + ) + parser.add_argument( + "--base-asm", + dest="base_asm", + metavar="FILE", + help="Read assembly from given file instead of configured base img.", + ) + parser.add_argument( + "--write-asm", + dest="write_asm", + metavar="FILE", + help="Write the current assembly output to file, e.g. for use with --base-asm.", + ) + parser.add_argument( + "-m", + "--make", + dest="make", + action="store_true", + help="Automatically run 'make' on the .o file or binary before diffing.", + ) + parser.add_argument( + "-l", + "--skip-lines", + dest="skip_lines", + metavar="LINES", + type=int, + default=0, + help="Skip the first LINES lines of output.", + ) + parser.add_argument( + "-s", + "--stop-at-ret", + dest="stop_at_ret", + action="store_true", + help="""Stop disassembling at the first return instruction. + Some functions have multiple return points, so use with care!""", + ) + parser.add_argument( + "-i", + "--ignore-large-imms", + dest="ignore_large_imms", + action="store_true", + help="Pretend all large enough immediates are the same.", + ) + parser.add_argument( + "-I", + "--ignore-addr-diffs", + dest="ignore_addr_diffs", + action="store_true", + help="Ignore address differences. Currently only affects AArch64 and ARM32.", + ) + parser.add_argument( + "-B", + "--no-show-branches", + dest="show_branches", + action="store_false", + help="Don't visualize branches/branch targets.", + ) + parser.add_argument( + "-R", + "--no-show-rodata-refs", + dest="show_rodata_refs", + action="store_false", + help="Don't show .rodata -> .text references (typically from jump tables).", + ) + parser.add_argument( + "-S", + "--base-shift", + dest="base_shift", + metavar="N", + type=str, + default="0", + help="""Diff position N in our img against position N + shift in the base img. + Arithmetic is allowed, so e.g. |-S "0x1234 - 0x4321"| is a reasonable + flag to pass if it is known that position 0x1234 in the base img syncs + up with position 0x4321 in our img. Not supported together with -o.""", + ) + parser.add_argument( + "-w", + "--watch", + dest="watch", + action="store_true", + help="""Automatically update when source/object files change. + Recommended in combination with -m.""", + ) + parser.add_argument( + "-0", + "--diff_mode=single_base", + dest="diff_mode", + action="store_const", + const=DiffMode.SINGLE_BASE, + help="""View the base asm only (not a diff).""", + ) + parser.add_argument( + "-1", + "--diff_mode=single", + dest="diff_mode", + action="store_const", + const=DiffMode.SINGLE, + help="""View the current asm only (not a diff).""", + ) + parser.add_argument( + "-3", + "--threeway=prev", + dest="diff_mode", + action="store_const", + const=DiffMode.THREEWAY_PREV, + help="""Show a three-way diff between target asm, current asm, and asm + prior to -w rebuild. Requires -w.""", + ) + parser.add_argument( + "-b", + "--threeway=base", + dest="diff_mode", + action="store_const", + const=DiffMode.THREEWAY_BASE, + help="""Show a three-way diff between target asm, current asm, and asm + when diff.py was started. Requires -w.""", + ) + parser.add_argument( + "--width", + dest="column_width", + metavar="COLS", + type=int, + default=50, + help="Sets the width of the left and right view column.", + ) + parser.add_argument( + "--algorithm", + dest="algorithm", + default="levenshtein", + choices=["levenshtein", "difflib"], + help="""Diff algorithm to use. Levenshtein gives the minimum diff, while difflib + aims for long sections of equal opcodes. Defaults to %(default)s.""", + ) + parser.add_argument( + "--max-size", + "--max-lines", + metavar="LINES", + dest="max_lines", + type=int, + default=1024, + help="The maximum length of the diff, in lines.", + ) + parser.add_argument( + "--no-pager", + dest="no_pager", + action="store_true", + help="""Disable the pager; write output directly to stdout, then exit. + Incompatible with --watch.""", + ) + parser.add_argument( + "--format", + choices=("color", "plain", "html", "json"), + default="color", + help="Output format, default is color. --format=html or json implies --no-pager.", + ) + parser.add_argument( + "-U", + "--compress-matching", + metavar="N", + dest="compress_matching", + type=int, + help="""Compress streaks of matching lines, leaving N lines of context + around non-matching parts.""", + ) + parser.add_argument( + "-V", + "--compress-sameinstr", + metavar="N", + dest="compress_sameinstr", + type=int, + help="""Compress streaks of lines with same instructions (but possibly + different regalloc), leaving N lines of context around other parts.""", + ) + + # Project-specific flags, e.g. different versions/make arguments. + add_custom_arguments_fn = getattr(diff_settings, "add_custom_arguments", None) + if add_custom_arguments_fn: + add_custom_arguments_fn(parser) + + if argcomplete: + argcomplete.autocomplete(parser) + +# ==== IMPORTS ==== + +# (We do imports late to optimize auto-complete performance.) + +import abc +from collections import Counter, defaultdict +from dataclasses import asdict, dataclass, field, replace +import difflib +import html +import itertools +import json +import os +import queue +import re +import string +import struct +import subprocess +import threading +import time +import traceback + + +MISSING_PREREQUISITES = ( + "Missing prerequisite python module {}. " + "Run `python3 -m pip install --user colorama watchdog levenshtein cxxfilt` to install prerequisites (cxxfilt only needed with --source)." +) + +try: + from colorama import Back, Fore, Style + import watchdog +except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + +# ==== CONFIG ==== + + +@dataclass +class ProjectSettings: + arch_str: str + objdump_executable: str + objdump_flags: List[str] + build_command: List[str] + map_format: str + build_dir: str + map_address_offset: int + baseimg: Optional[str] + myimg: Optional[str] + mapfile: Optional[str] + source_directories: Optional[List[str]] + source_extensions: List[str] + show_line_numbers_default: bool + disassemble_all: bool + reg_categories: Dict[str, int] + expected_dir: str + + +@dataclass +class Compress: + context: int + same_instr: bool + + +@dataclass +class Config: + arch: "ArchSettings" + + # Build/objdump options + diff_obj: bool + objfile: Optional[str] + make: bool + source_old_binutils: bool + diff_section: str + inlines: bool + max_function_size_lines: int + max_function_size_bytes: int + + # Display options + formatter: "Formatter" + diff_mode: DiffMode + base_shift: int + skip_lines: int + compress: Optional[Compress] + show_rodata_refs: bool + show_branches: bool + show_line_numbers: bool + show_source: bool + stop_at_ret: bool + ignore_large_imms: bool + ignore_addr_diffs: bool + algorithm: str + reg_categories: Dict[str, int] + + # Score options + score_stack_differences = True + penalty_stackdiff = 1 + penalty_regalloc = 5 + penalty_reordering = 60 + penalty_insertion = 100 + penalty_deletion = 100 + + +def create_project_settings(settings: Dict[str, Any]) -> ProjectSettings: + return ProjectSettings( + arch_str=settings.get("arch", "mips"), + baseimg=settings.get("baseimg"), + myimg=settings.get("myimg"), + mapfile=settings.get("mapfile"), + build_command=settings.get( + "make_command", ["make", *settings.get("makeflags", [])] + ), + source_directories=settings.get("source_directories"), + source_extensions=settings.get( + "source_extensions", [".c", ".h", ".cpp", ".hpp", ".s"] + ), + objdump_executable=get_objdump_executable(settings.get("objdump_executable")), + objdump_flags=settings.get("objdump_flags", []), + expected_dir=settings.get("expected_dir", "expected/"), + map_format=settings.get("map_format", "gnu"), + map_address_offset=settings.get( + "map_address_offset", settings.get("ms_map_address_offset", 0) + ), + build_dir=settings.get("build_dir", settings.get("mw_build_dir", "build/")), + show_line_numbers_default=settings.get("show_line_numbers_default", True), + disassemble_all=settings.get("disassemble_all", False), + reg_categories=settings.get("reg_categories", {}), + ) + + +def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config: + arch = get_arch(project.arch_str) + + formatter: Formatter + if args.format == "plain": + formatter = PlainFormatter(column_width=args.column_width) + elif args.format == "color": + formatter = AnsiFormatter(column_width=args.column_width) + elif args.format == "html": + formatter = HtmlFormatter() + elif args.format == "json": + formatter = JsonFormatter(arch_str=arch.name) + else: + raise ValueError(f"Unsupported --format: {args.format}") + + compress = None + if args.compress_matching is not None: + compress = Compress(args.compress_matching, False) + if args.compress_sameinstr is not None: + if compress is not None: + raise ValueError( + "Cannot pass both --compress-matching and --compress-sameinstr" + ) + compress = Compress(args.compress_sameinstr, True) + + show_line_numbers = args.show_line_numbers + if show_line_numbers is None: + show_line_numbers = project.show_line_numbers_default + + return Config( + arch=arch, + # Build/objdump options + diff_obj=args.diff_obj, + objfile=args.objfile, + make=args.make, + source_old_binutils=args.source_old_binutils, + diff_section=args.diff_section, + inlines=args.inlines, + max_function_size_lines=args.max_lines, + max_function_size_bytes=args.max_lines * 4, + # Display options + formatter=formatter, + diff_mode=args.diff_mode or DiffMode.NORMAL, + base_shift=eval_int( + args.base_shift, "Failed to parse --base-shift (-S) argument as an integer." + ), + skip_lines=args.skip_lines, + compress=compress, + show_rodata_refs=args.show_rodata_refs, + show_branches=args.show_branches, + show_line_numbers=show_line_numbers, + show_source=args.show_source or args.source_old_binutils, + stop_at_ret=args.stop_at_ret, + ignore_large_imms=args.ignore_large_imms, + ignore_addr_diffs=args.ignore_addr_diffs, + algorithm=args.algorithm, + reg_categories=project.reg_categories, + ) + + +def get_objdump_executable(objdump_executable: Optional[str]) -> str: + if objdump_executable is not None: + return objdump_executable + + objdump_candidates = [ + "mips-linux-gnu-objdump", + "mips64-elf-objdump", + "mips-elf-objdump", + "sh-elf-objdump", + ] + for objdump_cand in objdump_candidates: + try: + subprocess.check_call( + [objdump_cand, "--version"], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + return objdump_cand + except subprocess.CalledProcessError: + pass + except FileNotFoundError: + pass + + return fail( + f"Missing binutils; please ensure {' or '.join(objdump_candidates)} exists, or configure objdump_executable." + ) + + +def get_arch(arch_str: str) -> "ArchSettings": + for settings in ARCH_SETTINGS: + if arch_str == settings.name: + return settings + raise ValueError(f"Unknown architecture: {arch_str}") + + +BUFFER_CMD: List[str] = ["tail", "-c", str(10**9)] + +# -S truncates long lines instead of wrapping them +# -R interprets color escape sequences +# -i ignores case when searching +# -c something about how the screen gets redrawn; I don't remember the purpose +# -#6 makes left/right arrow keys scroll by 6 characters +LESS_CMD: List[str] = ["less", "-SRic", "-+F", "-+X", "-#6"] + +DEBOUNCE_DELAY: float = 0.1 + +# ==== FORMATTING ==== + + +@enum.unique +class BasicFormat(enum.Enum): + NONE = enum.auto() + IMMEDIATE = enum.auto() + STACK = enum.auto() + REGISTER = enum.auto() + REGISTER_CATEGORY = enum.auto() + DELAY_SLOT = enum.auto() + DIFF_CHANGE = enum.auto() + DIFF_ADD = enum.auto() + DIFF_REMOVE = enum.auto() + SOURCE_FILENAME = enum.auto() + SOURCE_FUNCTION = enum.auto() + SOURCE_LINE_NUM = enum.auto() + SOURCE_OTHER = enum.auto() + + +@dataclass(frozen=True) +class RotationFormat: + group: str + index: int + key: str + + +Format = Union[BasicFormat, RotationFormat] +FormatFunction = Callable[[str], Format] + + +class Text: + segments: List[Tuple[str, Format]] + + def __init__(self, line: str = "", f: Format = BasicFormat.NONE) -> None: + self.segments = [(line, f)] if line else [] + + def reformat(self, f: Format) -> "Text": + return Text(self.plain(), f) + + def plain(self) -> str: + return "".join(s for s, f in self.segments) + + def __repr__(self) -> str: + return f"" + + def __bool__(self) -> bool: + return any(s for s, f in self.segments) + + def __str__(self) -> str: + # Use Formatter.apply(...) instead + return NotImplemented + + def __eq__(self, other: object) -> bool: + return NotImplemented + + def __add__(self, other: Union["Text", str]) -> "Text": + if isinstance(other, str): + other = Text(other) + result = Text() + # If two adjacent segments have the same format, merge their lines + if ( + self.segments + and other.segments + and self.segments[-1][1] == other.segments[0][1] + ): + result.segments = ( + self.segments[:-1] + + [(self.segments[-1][0] + other.segments[0][0], self.segments[-1][1])] + + other.segments[1:] + ) + else: + result.segments = self.segments + other.segments + return result + + def __radd__(self, other: Union["Text", str]) -> "Text": + if isinstance(other, str): + other = Text(other) + return other + self + + def finditer(self, pat: Pattern[str]) -> Iterator[Match[str]]: + """Replacement for `pat.finditer(text)` that operates on the inner text, + and returns the exact same matches as `Text.sub(pat, ...)`.""" + for chunk, f in self.segments: + for match in pat.finditer(chunk): + yield match + + def sub(self, pat: Pattern[str], sub_fn: Callable[[Match[str]], "Text"]) -> "Text": + result = Text() + for chunk, f in self.segments: + i = 0 + for match in pat.finditer(chunk): + start, end = match.start(), match.end() + assert i <= start <= end <= len(chunk) + sub = sub_fn(match) + if i != start: + result.segments.append((chunk[i:start], f)) + result.segments.extend(sub.segments) + i = end + if chunk[i:]: + result.segments.append((chunk[i:], f)) + return result + + def ljust(self, column_width: int) -> "Text": + length = sum(len(x) for x, _ in self.segments) + return self + " " * max(column_width - length, 0) + + +@dataclass +class TableLine: + key: Optional[str] + is_data_ref: bool + cells: Tuple[Tuple[Text, Optional["Line"]], ...] + + +@dataclass +class TableData: + headers: Tuple[Text, ...] + current_score: int + max_score: int + previous_score: Optional[int] + lines: List[TableLine] + + +class Formatter(abc.ABC): + @abc.abstractmethod + def apply_format(self, chunk: str, f: Format) -> str: + """Apply the formatting `f` to `chunk` and escape the contents.""" + ... + + @abc.abstractmethod + def table(self, data: TableData) -> str: + """Format a multi-column table with metadata""" + ... + + def apply(self, text: Text) -> str: + return "".join(self.apply_format(chunk, f) for chunk, f in text.segments) + + @staticmethod + def outputline_texts(line: TableLine) -> Tuple[Text, ...]: + return tuple(cell[0] for cell in line.cells) + + +@dataclass +class PlainFormatter(Formatter): + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + return chunk + + def table(self, data: TableData) -> str: + rows = [data.headers] + [self.outputline_texts(line) for line in data.lines] + return "\n".join( + "".join(self.apply(x.ljust(self.column_width)) for x in row) for row in rows + ) + + +@dataclass +class AnsiFormatter(Formatter): + # Additional ansi escape codes not in colorama. See: + # https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters + STYLE_UNDERLINE = "\x1b[4m" + STYLE_NO_UNDERLINE = "\x1b[24m" + STYLE_INVERT = "\x1b[7m" + STYLE_RESET = "\x1b[0m" + + BASIC_ANSI_CODES = { + BasicFormat.NONE: "", + BasicFormat.IMMEDIATE: Fore.LIGHTBLUE_EX, + BasicFormat.STACK: Fore.YELLOW, + BasicFormat.REGISTER: Fore.YELLOW, + BasicFormat.REGISTER_CATEGORY: Fore.LIGHTYELLOW_EX, + BasicFormat.DIFF_CHANGE: Fore.LIGHTBLUE_EX, + BasicFormat.DIFF_ADD: Fore.GREEN, + BasicFormat.DIFF_REMOVE: Fore.RED, + BasicFormat.SOURCE_FILENAME: Style.DIM + Style.BRIGHT, + BasicFormat.SOURCE_FUNCTION: Style.DIM + Style.BRIGHT + STYLE_UNDERLINE, + BasicFormat.SOURCE_LINE_NUM: Fore.LIGHTBLACK_EX, + BasicFormat.SOURCE_OTHER: Style.DIM, + } + + BASIC_ANSI_CODES_UNDO = { + BasicFormat.NONE: "", + BasicFormat.SOURCE_FILENAME: Style.NORMAL, + BasicFormat.SOURCE_FUNCTION: Style.NORMAL + STYLE_NO_UNDERLINE, + BasicFormat.SOURCE_OTHER: Style.NORMAL, + } + + ROTATION_ANSI_COLORS = [ + Fore.MAGENTA, + Fore.CYAN, + Fore.GREEN, + Fore.RED, + Fore.LIGHTYELLOW_EX, + Fore.LIGHTMAGENTA_EX, + Fore.LIGHTCYAN_EX, + Fore.LIGHTGREEN_EX, + Fore.LIGHTBLACK_EX, + ] + + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + if f == BasicFormat.NONE: + return chunk + undo_ansi_code = Fore.RESET + if isinstance(f, BasicFormat): + ansi_code = self.BASIC_ANSI_CODES[f] + undo_ansi_code = self.BASIC_ANSI_CODES_UNDO.get(f, undo_ansi_code) + elif isinstance(f, RotationFormat): + ansi_code = self.ROTATION_ANSI_COLORS[ + f.index % len(self.ROTATION_ANSI_COLORS) + ] + else: + static_assert_unreachable(f) + return f"{ansi_code}{chunk}{undo_ansi_code}" + + def table(self, data: TableData) -> str: + rows = [(data.headers, False)] + [ + ( + self.outputline_texts(line), + line.is_data_ref, + ) + for line in data.lines + ] + return "\n".join( + "".join( + (self.STYLE_INVERT if is_data_ref else "") + + self.apply(x.ljust(self.column_width)) + + (self.STYLE_RESET if is_data_ref else "") + for x in row + ) + for (row, is_data_ref) in rows + ) + + +@dataclass +class HtmlFormatter(Formatter): + rotation_formats: int = 9 + + def apply_format(self, chunk: str, f: Format) -> str: + chunk = html.escape(chunk) + if f == BasicFormat.NONE: + return chunk + if isinstance(f, BasicFormat): + class_name = f.name.lower().replace("_", "-") + data_attr = "" + elif isinstance(f, RotationFormat): + class_name = f"rotation-{f.index % self.rotation_formats}" + rotation_key = html.escape(f"{f.group};{f.key}", quote=True) + data_attr = f'data-rotation="{rotation_key}"' + else: + static_assert_unreachable(f) + return f"{chunk}" + + def table(self, data: TableData) -> str: + def table_row(line: Tuple[Text, ...], is_data_ref: bool, cell_el: str) -> str: + tr_attrs = " class='data-ref'" if is_data_ref else "" + output_row = f" " + for cell in line: + cell_html = self.apply(cell) + output_row += f"<{cell_el}>{cell_html}" + output_row += "\n" + return output_row + + output = "\n" + output += " \n" + output += table_row(data.headers, False, "th") + output += " \n" + output += " \n" + output += "".join( + table_row(self.outputline_texts(line), line.is_data_ref, "td") + for line in data.lines + ) + output += " \n" + output += "
\n" + return output + + +@dataclass +class JsonFormatter(Formatter): + arch_str: str + + def apply_format(self, chunk: str, f: Format) -> str: + # This method is unused by this formatter + return NotImplemented + + def table(self, data: TableData) -> str: + def serialize_format(s: str, f: Format) -> Dict[str, Any]: + if f == BasicFormat.NONE: + return {"text": s} + elif isinstance(f, BasicFormat): + return {"text": s, "format": f.name.lower()} + elif isinstance(f, RotationFormat): + attrs = asdict(f) + attrs.update({"text": s, "format": "rotation"}) + return attrs + else: + static_assert_unreachable(f) + + def serialize(text: Optional[Text]) -> List[Dict[str, Any]]: + if text is None: + return [] + return [serialize_format(s, f) for s, f in text.segments] + + output: Dict[str, Any] = {} + output["arch_str"] = self.arch_str + output["header"] = { + name: serialize(h) + for h, name in zip(data.headers, ("base", "current", "previous")) + } + output["current_score"] = data.current_score + output["max_score"] = data.max_score + if data.previous_score is not None: + output["previous_score"] = data.previous_score + output_rows: List[Dict[str, Any]] = [] + for row in data.lines: + output_row: Dict[str, Any] = {} + output_row["key"] = row.key + output_row["is_data_ref"] = row.is_data_ref + iters: List[Tuple[str, Text, Optional[Line]]] = [ + (label, *cell) + for label, cell in zip(("base", "current", "previous"), row.cells) + ] + if all(line is None for _, _, line in iters): + # Skip rows that were only for displaying source code + continue + for column_name, text, line in iters: + column: Dict[str, Any] = {} + column["text"] = serialize(text) + if line: + if line.line_num is not None: + column["line"] = line.line_num + if line.branch_target is not None: + column["branch"] = line.branch_target + if line.source_lines: + column["src"] = line.source_lines + if line.comment is not None: + column["src_comment"] = line.comment + if line.source_line_num is not None: + column["src_line"] = line.source_line_num + if line or column["text"]: + output_row[column_name] = column + output_rows.append(output_row) + output["rows"] = output_rows + return json.dumps(output) + + +def format_fields( + pat: Pattern[str], + out1: Text, + out2: Text, + color1: FormatFunction, + color2: Optional[FormatFunction] = None, +) -> Tuple[Text, Text]: + diffs = [ + of.group() != nf.group() + for (of, nf) in zip(out1.finditer(pat), out2.finditer(pat)) + ] + + it = iter(diffs) + + def maybe_color(color: FormatFunction, s: str) -> Text: + return Text(s, color(s)) if next(it, False) else Text(s) + + out1 = out1.sub(pat, lambda m: maybe_color(color1, m.group())) + it = iter(diffs) + out2 = out2.sub(pat, lambda m: maybe_color(color2 or color1, m.group())) + + return out1, out2 + + +def symbol_formatter(group: str, base_index: int) -> FormatFunction: + symbol_formats: Dict[str, Format] = {} + + def symbol_format(s: str) -> Format: + # TODO: it would be nice to use a unique Format for each symbol, so we could + # add extra UI elements in the HTML version + f = symbol_formats.get(s) + if f is None: + index = len(symbol_formats) + base_index + f = RotationFormat(key=s, index=index, group=group) + symbol_formats[s] = f + return f + + return symbol_format + + +# ==== LOGIC ==== + +ObjdumpCommand = Tuple[List[str], str, Optional[str]] + +# eval_expr adapted from https://stackoverflow.com/a/9558001 + +import ast +import operator as op + +# supported operators +operators: Dict[Type[Union[ast.operator, ast.unaryop]], Any] = { + ast.Add: op.add, + ast.Sub: op.sub, + ast.Mult: op.mul, + ast.Div: op.truediv, + ast.Pow: op.pow, + ast.BitXor: op.xor, + ast.USub: op.neg, +} + + +def eval_expr(expr: str) -> Any: + return eval_(ast.parse(expr, mode="eval").body) + + +def eval_(node: ast.AST) -> Any: + if isinstance(node, ast.Num): # + return node.n + elif isinstance(node, ast.BinOp): # + return operators[type(node.op)](eval_(node.left), eval_(node.right)) + elif isinstance(node, ast.UnaryOp): # e.g., -1 + return operators[type(node.op)](eval_(node.operand)) + else: + raise TypeError(node) + + +def maybe_eval_int(expr: str) -> Optional[int]: + try: + ret = eval_expr(expr) + if not isinstance(ret, int): + raise Exception("not an integer") + return ret + except Exception: + return None + + +def eval_int(expr: str, emsg: str) -> int: + ret = maybe_eval_int(expr) + if ret is None: + fail(emsg) + return ret + + +def eval_line_num(expr: str) -> Optional[int]: + expr = expr.strip().replace(":", "") + if expr == "": + return None + return int(expr, 16) + + +def run_make(target: str, project: ProjectSettings) -> None: + subprocess.check_call(project.build_command + [target]) + + +def run_make_capture_output( + target: str, project: ProjectSettings +) -> "subprocess.CompletedProcess[bytes]": + return subprocess.run( + project.build_command + [target], + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + ) + + +def restrict_to_function(dump: str, fn_name: str) -> str: + try: + ind = dump.index("\n", dump.index(f"<{fn_name}>:")) + return dump[ind + 1 :] + except ValueError: + return "" + + +def serialize_rodata_references(references: List[Tuple[int, int, str]]) -> str: + return "".join( + f"DATAREF {text_offset} {from_offset} {from_section}\n" + for (text_offset, from_offset, from_section) in references + ) + + +def maybe_get_objdump_source_flags(config: Config) -> List[str]: + flags = [] + + if config.show_line_numbers or config.show_source: + flags.append("--line-numbers") + + if config.show_source: + flags.append("--source") + + if not config.source_old_binutils: + flags.append("--source-comment=│ ") + + if config.inlines: + flags.append("--inlines") + + return flags + + +def run_objdump(cmd: ObjdumpCommand, config: Config, project: ProjectSettings) -> str: + flags, target, restrict = cmd + try: + out = subprocess.run( + [project.objdump_executable] + + config.arch.arch_flags + + project.objdump_flags + + flags + + [target], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + ).stdout + except subprocess.CalledProcessError as e: + print(e.stdout) + print(e.stderr) + if "unrecognized option '--source-comment" in e.stderr: + fail("** Try using --source-old-binutils instead of --source **") + raise e + + obj_data: Optional[bytes] = None + if config.diff_obj: + with open(target, "rb") as f: + obj_data = f.read() + + return preprocess_objdump_out(restrict, obj_data, out, config) + + +def preprocess_objdump_out( + restrict: Optional[str], obj_data: Optional[bytes], objdump_out: str, config: Config +) -> str: + """ + Preprocess the output of objdump into a format that `process()` expects. + This format is suitable for saving to disk with `--write-asm`. + + - Optionally filter the output to a single function (`restrict`) + - Otherwise, strip objdump header (7 lines) + - Prepend .data references ("DATAREF" lines) when working with object files + """ + out = objdump_out + + if restrict is not None: + out = restrict_to_function(out, restrict) + else: + for i in range(7): + out = out[out.find("\n") + 1 :] + out = out.rstrip("\n") + + if obj_data and config.show_rodata_refs: + out = ( + serialize_rodata_references(parse_elf_rodata_references(obj_data, config)) + + out + ) + + return out + + +def search_build_objects(objname: str, project: ProjectSettings) -> Optional[str]: + objfiles = [ + os.path.join(dirpath, f) + for dirpath, _, filenames in os.walk(project.build_dir) + for f in filenames + if f == objname + ] + if len(objfiles) > 1: + all_objects = "\n".join(objfiles) + fail( + f"Found multiple objects of the same name {objname} in {project.build_dir}, " + f"cannot determine which to diff against: \n{all_objects}" + ) + if len(objfiles) == 1: + return objfiles[0] + + return None + + +def search_map_file( + fn_name: str, project: ProjectSettings, config: Config, *, for_binary: bool +) -> Tuple[Optional[str], Optional[int]]: + if not project.mapfile: + fail(f"No map file configured; cannot find function {fn_name}.") + + try: + with open(project.mapfile) as f: + contents = f.read() + except Exception: + fail(f"Failed to open map file {project.mapfile} for reading.") + + if project.map_format == "gnu": + if for_binary and "load address" not in contents: + fail( + 'Failed to find "load address" in map file. Maybe you need to add\n' + '"export LANG := C" to your Makefile to avoid localized output?' + ) + + lines = contents.split("\n") + + try: + cur_objfile = None + ram_to_rom = None + cands = [] + last_line = "" + for line in lines: + if line.startswith(" " + config.diff_section): + cur_objfile = line.split()[3] + if "load address" in line: + tokens = last_line.split() + line.split() + ram = int(tokens[1], 0) + rom = int(tokens[5], 0) + ram_to_rom = rom - ram + if line.endswith(" " + fn_name) or f" {fn_name} = 0x" in line: + ram = int(line.split()[0], 0) + if (for_binary and ram_to_rom is not None) or ( + not for_binary and cur_objfile is not None + ): + cands.append((cur_objfile, ram + (ram_to_rom or 0))) + last_line = line + except Exception as e: + traceback.print_exc() + fail(f"Internal error while parsing map file") + + if len(cands) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(cands) == 1: + return cands[0] + elif project.map_format == "mw": + find = re.findall( + # ram elf rom alignment + r" \S+ \S+ (\S+) (\S+) +\S+ " + + re.escape(fn_name) + + r"(?: \(entry of " + + re.escape(config.diff_section) + + r"\))? \t" + # object name + + "(\S+)", + contents, + ) + if len(find) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(find) == 1: + rom = int(find[0][1], 16) + objname = find[0][2] + objfile = search_build_objects(objname, project) + + # TODO Currently the ram-rom conversion only works for diffing ELF + # executables, but it would likely be more convenient to diff DOLs. + # At this time it is recommended to always use -o when running the diff + # script as this mode does not make use of the ram-rom conversion. + if objfile is not None: + return objfile, rom + elif project.map_format == "ms": + load_address_find = re.search( + r"Preferred load address is ([0-9a-f]+)", + contents, + ) + if not load_address_find: + fail(f"Couldn't find module load address in map file.") + load_address = int(load_address_find.group(1), 16) + + diff_segment_find = re.search( + r"([0-9a-f]+):[0-9a-f]+ [0-9a-f]+H " + re.escape(config.diff_section), + contents, + ) + if not diff_segment_find: + fail(f"Couldn't find segment for section in map file.") + diff_segment = diff_segment_find.group(1) + + find = re.findall( + r" (?:" + + re.escape(diff_segment) + + r")\S+\s+(?:" + + re.escape(fn_name) + + r")\s+\S+ ... \S+", + contents, + ) + if len(find) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(find) == 1: + names_find = re.search(r"(\S+) ... (\S+)", find[0]) + assert names_find is not None + fileofs = int(names_find.group(1), 16) - load_address + if for_binary: + return None, fileofs + + objname = names_find.group(2) + objfile = search_build_objects(objname, project) + if objfile is not None: + return objfile, fileofs + else: + fail(f"Linker map format {project.map_format} unrecognised.") + return None, None + + +def parse_elf_rodata_references( + data: bytes, config: Config +) -> List[Tuple[int, int, str]]: + e_ident = data[:16] + if e_ident[:4] != b"\x7FELF": + return [] + + SHT_SYMTAB = 2 + SHT_REL = 9 + SHT_RELA = 4 + R_MIPS_32 = 2 + R_MIPS_GPREL32 = 12 + + is_32bit = e_ident[4] == 1 + is_little_endian = e_ident[5] == 1 + str_end = "<" if is_little_endian else ">" + str_off = "I" if is_32bit else "Q" + + def read(spec: str, offset: int) -> Tuple[int, ...]: + spec = spec.replace("P", str_off) + size = struct.calcsize(spec) + return struct.unpack(str_end + spec, data[offset : offset + size]) + + ( + e_type, + e_machine, + e_version, + e_entry, + e_phoff, + e_shoff, + e_flags, + e_ehsize, + e_phentsize, + e_phnum, + e_shentsize, + e_shnum, + e_shstrndx, + ) = read("HHIPPPIHHHHHH", 16) + if e_type != 1: # relocatable + return [] + assert e_shoff != 0 + assert e_shnum != 0 # don't support > 0xFF00 sections + assert e_shstrndx != 0 + + @dataclass + class Section: + sh_name: int + sh_type: int + sh_flags: int + sh_addr: int + sh_offset: int + sh_size: int + sh_link: int + sh_info: int + sh_addralign: int + sh_entsize: int + + sections = [ + Section(*read("IIPPPPIIPP", e_shoff + i * e_shentsize)) for i in range(e_shnum) + ] + shstr = sections[e_shstrndx] + sec_name_offs = [shstr.sh_offset + s.sh_name for s in sections] + sec_names = [data[offset : data.index(b"\0", offset)] for offset in sec_name_offs] + + symtab_sections = [i for i in range(e_shnum) if sections[i].sh_type == SHT_SYMTAB] + assert len(symtab_sections) == 1 + symtab = sections[symtab_sections[0]] + + section_name = config.diff_section.encode("utf-8") + text_sections = [ + i + for i in range(e_shnum) + if sec_names[i] == section_name and sections[i].sh_size != 0 + ] + if len(text_sections) != 1: + return [] + text_section = text_sections[0] + + ret: List[Tuple[int, int, str]] = [] + for s in sections: + if s.sh_type == SHT_REL or s.sh_type == SHT_RELA: + if s.sh_info == text_section: + # Skip section_name -> section_name references + continue + sec_name = sec_names[s.sh_info].decode("latin1") + if sec_name not in (".rodata", ".late_rodata"): + continue + sec_base = sections[s.sh_info].sh_offset + for i in range(0, s.sh_size, s.sh_entsize): + if s.sh_type == SHT_REL: + r_offset, r_info = read("PP", s.sh_offset + i) + else: + r_offset, r_info, r_addend = read("PPP", s.sh_offset + i) + + if is_32bit: + r_sym = r_info >> 8 + r_type = r_info & 0xFF + sym_offset = symtab.sh_offset + symtab.sh_entsize * r_sym + st_name, st_value, st_size, st_info, st_other, st_shndx = read( + "IIIBBH", sym_offset + ) + else: + r_sym = r_info >> 32 + r_type = r_info & 0xFFFFFFFF + sym_offset = symtab.sh_offset + symtab.sh_entsize * r_sym + st_name, st_info, st_other, st_shndx, st_value, st_size = read( + "IBBHQQ", sym_offset + ) + if st_shndx == text_section: + if s.sh_type == SHT_REL: + if e_machine == 8 and r_type in (R_MIPS_32, R_MIPS_GPREL32): + (r_addend,) = read("I", sec_base + r_offset) + else: + continue + text_offset = (st_value + r_addend) & 0xFFFFFFFF + ret.append((text_offset, r_offset, sec_name)) + return ret + + +def dump_elf( + start: str, + end: Optional[str], + diff_elf_symbol: str, + config: Config, + project: ProjectSettings, +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if not project.baseimg or not project.myimg: + fail("Missing myimg/baseimg in config.") + if config.base_shift: + fail("--base-shift not compatible with -e") + + start_addr = eval_int(start, "Start address must be an integer expression.") + + if end is not None: + end_addr = eval_int(end, "End address must be an integer expression.") + else: + end_addr = start_addr + config.max_function_size_bytes + + flags1 = [ + f"--start-address={start_addr}", + f"--stop-address={end_addr}", + ] + + if project.disassemble_all: + disassemble_flag = "-D" + else: + disassemble_flag = "-d" + + flags2 = [ + f"--disassemble={diff_elf_symbol}", + ] + + objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] + return ( + project.myimg, + (objdump_flags + flags1, project.baseimg, None), + ( + objdump_flags + flags2 + maybe_get_objdump_source_flags(config), + project.myimg, + None, + ), + ) + + +def dump_objfile( + start: str, end: Optional[str], config: Config, project: ProjectSettings +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if config.base_shift: + fail("--base-shift not compatible with -o") + if end is not None: + fail("end address not supported together with -o") + if start.startswith("0"): + fail("numerical start address not supported with -o; pass a function name") + + objfile = config.objfile + if not objfile: + objfile, _ = search_map_file(start, project, config, for_binary=False) + + if not objfile: + fail("Not able to find .o file for function.") + + if config.make: + run_make(objfile, project) + + if not os.path.isfile(objfile): + fail(f"Not able to find .o file for function: {objfile} is not a file.") + + refobjfile = os.path.join(project.expected_dir, objfile) + if config.diff_mode != DiffMode.SINGLE and not os.path.isfile(refobjfile): + fail(f'Please ensure an OK .o file exists at "{refobjfile}".') + + if project.disassemble_all: + disassemble_flag = "-D" + else: + disassemble_flag = "-d" + + objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] + return ( + objfile, + (objdump_flags, refobjfile, start), + (objdump_flags + maybe_get_objdump_source_flags(config), objfile, start), + ) + + +def dump_binary( + start: str, end: Optional[str], config: Config, project: ProjectSettings +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if not project.baseimg or not project.myimg: + fail("Missing myimg/baseimg in config.") + if config.make: + run_make(project.myimg, project) + start_addr = maybe_eval_int(start) + if start_addr is None: + _, start_addr = search_map_file(start, project, config, for_binary=True) + if start_addr is None: + fail("Not able to find function in map file.") + start_addr += project.map_address_offset + if end is not None: + end_addr = eval_int(end, "End address must be an integer expression.") + else: + end_addr = start_addr + config.max_function_size_bytes + objdump_flags = ["-Dz", "-bbinary"] + ["-EB" if config.arch.big_endian else "-EL"] + flags1 = [ + f"--start-address={start_addr + config.base_shift}", + f"--stop-address={end_addr + config.base_shift}", + ] + flags2 = [f"--start-address={start_addr}", f"--stop-address={end_addr}"] + return ( + project.myimg, + (objdump_flags + flags1, project.baseimg, None), + (objdump_flags + flags2, project.myimg, None), + ) + + +# Example: "ldr r4, [pc, #56] ; (4c )" +ARM32_LOAD_POOL_PATTERN = r"(ldr\s+r([0-9]|1[0-3]),\s+\[pc,.*;\s*)(\([a-fA-F0-9]+.*\))" + + +# The base class is a no-op. +class AsmProcessor: + def __init__(self, config: Config) -> None: + self.config = config + + def pre_process( + self, mnemonic: str, args: str, next_row: Optional[str] + ) -> Tuple[str, str]: + return mnemonic, args + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + return prev, None + + def normalize(self, mnemonic: str, row: str) -> str: + """This should be called exactly once for each line.""" + arch = self.config.arch + row = self._normalize_arch_specific(mnemonic, row) + if self.config.ignore_large_imms and mnemonic not in arch.branch_instructions: + row = re.sub(self.config.arch.re_large_imm, "", row) + return row + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + return row + + def post_process(self, lines: List["Line"]) -> None: + return + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + return False + + +class AsmProcessorMIPS(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + self.seen_jr_ra = False + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + arch = self.config.arch + if "R_MIPS_NONE" in row or "R_MIPS_JALR" in row: + # GNU as emits no-op relocations immediately after real ones when + # assembling with -mabi=64. Return without trying to parse 'imm' as an + # integer. + return prev, None + before, imm, after = parse_relocated_line(prev) + addend = reloc_addend_from_imm(imm, before, self.config.arch) + repl = row.split()[-1] + addend + if "R_MIPS_LO16" in row: + repl = f"%lo({repl})" + elif "R_MIPS_HI16" in row: + # Ideally we'd pair up R_MIPS_LO16 and R_MIPS_HI16 to generate a + # correct addend for each, but objdump doesn't give us the order of + # the relocations, so we can't find the right LO16. :( + repl = f"%hi({repl})" + elif "R_MIPS_26" in row: + # Function calls + pass + elif "R_MIPS_PC16" in row: + # Branch to glabel. This gives confusing output, but there's not much + # we can do here. + pass + elif "R_MIPS_GPREL16" in row: + repl = f"%gp_rel({repl})" + elif "R_MIPS_GOT16" in row: + repl = f"%got({repl})" + elif "R_MIPS_CALL16" in row: + repl = f"%call16({repl})" + elif "R_MIPS_LITERAL" in row: + repl = repl[:-len(addend)] + else: + assert False, f"unknown relocation type '{row}' for line '{prev}'" + return before + repl + after, repl + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + if self.seen_jr_ra: + return True + if mnemonic == "jr" and args == "ra": + self.seen_jr_ra = True + return False + + +class AsmProcessorPPC(AsmProcessor): + def pre_process( + self, mnemonic: str, args: str, next_row: Optional[str] + ) -> Tuple[str, str]: + + if next_row and "R_PPC_EMB_SDA21" in next_row: + # With sda21 relocs, the linker transforms `r0` into `r2`/`r13`, and + # we may encounter this in either pre-transformed or post-transformed + # versions depending on if the .o file comes from compiler output or + # from disassembly. Normalize, to make sure both forms are treated as + # equivalent. + + args = args.replace("(r2)", "(0)") + args = args.replace("(r13)", "(0)") + args = args.replace(",r2,", ",0,") + args = args.replace(",r13,", ",0,") + + # We want to convert li and lis with an sda21 reloc, + # because the r0 to r2/r13 transformation results in + # turning an li/lis into an addi/addis with r2/r13 arg + # our preprocessing normalizes all versions to addi with a 0 arg + if mnemonic in {"li", "lis"}: + mnemonic = mnemonic.replace("li", "addi") + args_parts = args.split(",") + args = args_parts[0] + ",0," + args_parts[1] + + return mnemonic, args + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + arch = self.config.arch + assert any( + r in row + for r in ["R_PPC_REL24", "R_PPC_ADDR16", "R_PPC_EMB_SDA21", "R_PPC_REL14"] + ), f"unknown relocation type '{row}' for line '{prev}'" + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + if "R_PPC_REL24" in row: + # function calls + pass + if "R_PPC_REL14" in row: + pass + elif "R_PPC_ADDR16_HI" in row: + # absolute hi of addr + repl = f"{repl}@h" + elif "R_PPC_ADDR16_HA" in row: + # adjusted hi of addr + repl = f"{repl}@ha" + elif "R_PPC_ADDR16_LO" in row: + # lo of addr + repl = f"{repl}@l" + elif "R_PPC_ADDR16" in row: + # 16-bit absolute addr + if "+0x7" in repl: + # remove the very large addends as they are an artifact of (label-_SDA(2)_BASE_) + # computations and are unimportant in a diff setting. + if int(repl.split("+")[1], 16) > 0x70000000: + repl = repl.split("+")[0] + elif "R_PPC_EMB_SDA21" in row: + # sda21 relocations; r2/r13 --> 0 swaps are performed in pre_process + repl = f"{repl}@sda21" + + return before + repl + after, repl + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + return mnemonic == "blr" + + +class AsmProcessorARM32(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + arch = self.config.arch + if "R_ARM_V4BX" in row: + # R_ARM_V4BX converts "bx " to "mov pc," for some targets. + # Ignore for now. + return prev, None + if "R_ARM_ABS32" in row and not prev.startswith(".word"): + # Don't crash on R_ARM_ABS32 relocations incorrectly applied to code. + # (We may want to do something more fancy here that actually shows the + # related symbol, but this serves as a stop-gap.) + return prev, None + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + reloc_addend_from_imm(imm, before, self.config.arch) + return before + repl + after, repl + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + if self.config.ignore_addr_diffs: + row = self._normalize_bl(mnemonic, row) + row = self._normalize_data_pool(row) + return row + + def _normalize_bl(self, mnemonic: str, row: str) -> str: + if mnemonic != "bl": + return row + + row, _ = split_off_address(row) + return row + "" + + def _normalize_data_pool(self, row: str) -> str: + pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) + return pool_match.group(1) if pool_match else row + + def post_process(self, lines: List["Line"]) -> None: + lines_by_line_number = {} + for line in lines: + lines_by_line_number[line.line_num] = line + for line in lines: + if line.data_pool_addr is None: + continue + + # Add data symbol and its address to the line. + line_original = lines_by_line_number[line.data_pool_addr].original + value = line_original.split()[1] + addr = "{:x}".format(line.data_pool_addr) + line.original = line.normalized_original + f"={value} ({addr})" + + +class AsmProcessorAArch64(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + self._adrp_pair_registers: Set[str] = set() + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + if self.config.ignore_addr_diffs: + row = self._normalize_adrp_differences(mnemonic, row) + row = self._normalize_bl(mnemonic, row) + return row + + def _normalize_bl(self, mnemonic: str, row: str) -> str: + if mnemonic != "bl": + return row + + row, _ = split_off_address(row) + return row + "" + + def _normalize_adrp_differences(self, mnemonic: str, row: str) -> str: + """Identifies ADRP + LDR/ADD pairs that are used to access the GOT and + suppresses any immediate differences. + + Whenever an ADRP is seen, the destination register is added to the set of registers + that are part of an ADRP + LDR/ADD pair. Registers are removed from the set as soon + as they are used for an LDR or ADD instruction which completes the pair. + + This method is somewhat crude but should manage to detect most such pairs. + """ + row_parts = row.split("\t", 1) + if mnemonic == "adrp": + self._adrp_pair_registers.add(row_parts[1].strip().split(",")[0]) + row, _ = split_off_address(row) + return row + "" + elif mnemonic == "ldr": + for reg in self._adrp_pair_registers: + # ldr xxx, [reg] + # ldr xxx, [reg, ] + if f", [{reg}" in row_parts[1]: + self._adrp_pair_registers.remove(reg) + return normalize_imms(row, AARCH64_SETTINGS) + elif mnemonic == "add": + for reg in self._adrp_pair_registers: + # add reg, reg, + if row_parts[1].startswith(f"{reg}, {reg}, "): + self._adrp_pair_registers.remove(reg) + return normalize_imms(row, AARCH64_SETTINGS) + + return row + + +class AsmProcessorI686(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + repl = row.split()[-1] + mnemonic, args = prev.split(maxsplit=1) + + addr_imm = re.search(r"(? bool: + return mnemonic == "ret" + + +class AsmProcessorSH2(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + return prev, None + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + return mnemonic == "rts" + + +@dataclass +class ArchSettings: + name: str + re_int: Pattern[str] + re_comment: Pattern[str] + re_reg: Pattern[str] + re_sprel: Pattern[str] + re_large_imm: Pattern[str] + re_imm: Pattern[str] + re_reloc: Pattern[str] + branch_instructions: Set[str] + instructions_with_address_immediates: Set[str] + forbidden: Set[str] = field(default_factory=lambda: set(string.ascii_letters + "_")) + arch_flags: List[str] = field(default_factory=list) + branch_likely_instructions: Set[str] = field(default_factory=set) + proc: Type[AsmProcessor] = AsmProcessor + big_endian: Optional[bool] = True + delay_slot_instructions: Set[str] = field(default_factory=set) + + +MIPS_BRANCH_LIKELY_INSTRUCTIONS = { + "beql", + "bnel", + "beqzl", + "bnezl", + "bgezl", + "bgtzl", + "blezl", + "bltzl", + "bc1tl", + "bc1fl", +} +MIPS_BRANCH_INSTRUCTIONS = MIPS_BRANCH_LIKELY_INSTRUCTIONS.union( + { + "b", + "beq", + "bne", + "beqz", + "bnez", + "bgez", + "bgtz", + "blez", + "bltz", + "bc1t", + "bc1f", + } +) + +ARM32_PREFIXES = {"b", "bl"} +ARM32_CONDS = { + "", + "eq", + "ne", + "cs", + "cc", + "mi", + "pl", + "vs", + "vc", + "hi", + "ls", + "ge", + "lt", + "gt", + "le", + "al", +} +ARM32_SUFFIXES = {"", ".n", ".w"} +ARM32_BRANCH_INSTRUCTIONS = { + f"{prefix}{cond}{suffix}" + for prefix in ARM32_PREFIXES + for cond in ARM32_CONDS + for suffix in ARM32_SUFFIXES +} + +AARCH64_BRANCH_INSTRUCTIONS = { + "b", + "b.eq", + "b.ne", + "b.cs", + "b.hs", + "b.cc", + "b.lo", + "b.mi", + "b.pl", + "b.vs", + "b.vc", + "b.hi", + "b.ls", + "b.ge", + "b.lt", + "b.gt", + "b.le", + "cbz", + "cbnz", + "tbz", + "tbnz", +} + +PPC_BRANCH_INSTRUCTIONS = { + "b", + "beq", + "beq+", + "beq-", + "bne", + "bne+", + "bne-", + "blt", + "blt+", + "blt-", + "ble", + "ble+", + "ble-", + "bdnz", + "bdnz+", + "bdnz-", + "bge", + "bge+", + "bge-", + "bgt", + "bgt+", + "bgt-", +} + +I686_BRANCH_INSTRUCTIONS = { + "call", + "jmp", + "ljmp", + "ja", + "jae", + "jb", + "jbe", + "jc", + "jcxz", + "jecxz", + "jrcxz", + "je", + "jg", + "jge", + "jl", + "jle", + "jna", + "jnae", + "jnb", + "jnbe", + "jnc", + "jne", + "jng", + "jnge", + "jnl", + "jnle", + "jno", + "jnp", + "jns", + "jnz", + "jo", + "jp", + "jpe", + "jpo", + "js", + "jz", + "ja", + "jae", + "jb", + "jbe", + "jc", + "je", + "jz", + "jg", + "jge", + "jl", + "jle", + "jna", + "jnae", + "jnb", + "jnbe", + "jnc", + "jne", + "jng", + "jnge", + "jnl", + "jnle", + "jno", + "jnp", + "jns", + "jnz", + "jo", + "jp", + "jpe", + "jpo", + "js", + "jz", +} + +SH2_BRANCH_INSTRUCTIONS = { + "bf", + "bf.s", + "bt", + "bt.s", + "bra", + "bsr", +} + +MIPS_SETTINGS = ArchSettings( + name="mips", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"<.*>"), + # Includes: + # - General purpose registers v0..1, a0..7, t0..9, s0..8, zero, at, fp, k0..1/kt0..1 + # - Float registers f0..31, or fv0..1, fa0..7, ft0..15, fs0..8 plus odd complements + # (actually used number depends on ABI) + # sp, gp should not be in this list + re_reg=re.compile(r"\$?\b([astv][0-9]|at|f[astv]?[0-9]+f?|kt?[01]|fp|ra|zero)\b"), + re_sprel=re.compile(r"(?<=,)([0-9]+|0x[0-9a-f]+)\(sp\)"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile( + r"(\b|-)([0-9]+|0x[0-9a-fA-F]+)\b(?!\(sp)|%(lo|hi|got|gp_rel|call16)\([^)]*\)" + ), + re_reloc=re.compile(r"R_MIPS_"), + arch_flags=["-m", "mips:4300"], + branch_likely_instructions=MIPS_BRANCH_LIKELY_INSTRUCTIONS, + branch_instructions=MIPS_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=MIPS_BRANCH_INSTRUCTIONS.union({"j", "jal"}), + delay_slot_instructions=MIPS_BRANCH_INSTRUCTIONS.union({"j", "jal", "jr", "jalr"}), + proc=AsmProcessorMIPS, +) + +MIPSEL_SETTINGS = replace(MIPS_SETTINGS, name="mipsel", big_endian=False) + +MIPSEE_SETTINGS = replace( + MIPSEL_SETTINGS, name="mipsee", arch_flags=["-m", "mips:5900"] +) + +MIPS_ARCH_NAMES = {"mips", "mipsel", "mipsee"} + +ARM32_SETTINGS = ArchSettings( + name="arm32", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"(<.*>|//.*$)"), + # Includes: + # - General purpose registers: r0..13 + # - Frame pointer registers: lr (r14), pc (r15) + # - VFP/NEON registers: s0..31, d0..31, q0..15, fpscr, fpexc, fpsid + # SP should not be in this list. + re_reg=re.compile( + r"\$?\b([rq][0-9]|[rq]1[0-5]|pc|lr|[ds][12]?[0-9]|[ds]3[01]|fp(scr|exc|sid))\b" + ), + re_sprel=re.compile(r"sp, #-?(0x[0-9a-fA-F]+|[0-9]+)\b"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(?|//.*$)"), + # GPRs and FP registers: X0-X30, W0-W30, [BHSDVQ]0..31 + # (FP registers may be followed by data width and number of elements, e.g. V0.4S) + # The zero registers and SP should not be in this list. + re_reg=re.compile( + r"\$?\b([bhsdvq]([12]?[0-9]|3[01])(\.\d\d?[bhsdvq])?|[xw][12]?[0-9]|[xw]30)\b" + ), + re_sprel=re.compile(r"sp, #-?(0x[0-9a-fA-F]+|[0-9]+)\b"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(?|//.*$)"), + # r1 not included + re_reg=re.compile(r"\$?\b([rf](?:[02-9]|[1-9][0-9]+)|f1)\b"), + re_sprel=re.compile(r"(?<=,)(-?[0-9]+|-?0x[0-9a-f]+)\(r1\)"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile( + r"(\b|-)([0-9]+|0x[0-9a-fA-F]+)\b(?!\(r1)|[^ \t,]+@(l|ha|h|sda21)" + ), + re_reloc=re.compile(r"R_PPC_"), + arch_flags=["-m", "powerpc", "-M", "broadway"], + branch_instructions=PPC_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=PPC_BRANCH_INSTRUCTIONS.union({"bl"}), + proc=AsmProcessorPPC, +) + +I686_SETTINGS = ArchSettings( + name="i686", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"<.*>"), + # Includes: + # - (e)a-d(x,l,h) + # - (e)s,d,b(i,p)(l) + # - cr0-7 + # - x87 st + # - MMX, SSE vector registers + # - cursed registers: eal ebl ebh edl edh... + re_reg=re.compile( + r"\%?\b(e?(([sd]i|[sb]p)l?|[abcd][xhl])|[cdesfg]s|cr[0-7]|x?mm[0-7]|st)\b" + ), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_sprel=re.compile(r"-?(0x[0-9a-f]+|[0-9]+)(?=\((%ebp|%esi)\))"), + re_imm=re.compile(r"-?(0x[0-9a-f]+|[0-9]+)"), + re_reloc=re.compile(r"R_386_"), + # The x86 architecture has a variable instruction length. The raw bytes of + # an instruction as displayed by objdump can line wrap if it's long enough. + # This destroys the objdump output processor logic, so we avoid this. + arch_flags=["-m", "i386", "--no-show-raw-insn"], + branch_instructions=I686_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=I686_BRANCH_INSTRUCTIONS.union({"mov"}), + proc=AsmProcessorI686, +) + +SH2_SETTINGS = ArchSettings( + name="sh2", + # match -128-127 preceded by a '#' with a ',' after (8 bit immediates) + re_int=re.compile(r"(?<=#)(-?(?:1[01][0-9]|12[0-8]|[1-9][0-9]?|0))(?=,)"), + # match , match ! and after + re_comment=re.compile(r"<.*?>|!.*"), + # - r0-r15 general purpose registers, r15 is stack pointer during exceptions + # - sr, gbr, vbr - control registers + # - mach, macl, pr, pc - system registers + re_reg=re.compile(r"r1[0-5]|r[0-9]"), + # sh2 has pc-relative and gbr-relative but not stack-pointer-relative + re_sprel=re.compile(r"(?<=,)([0-9]+|0x[0-9a-f]+)\(sp\)"), + # max immediate size is 8-bit + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"\b0[xX][0-9a-fA-F]+\b"), + # https://github.com/bminor/binutils-gdb/blob/master/bfd/elf32-sh-relocs.h#L21 + re_reloc=re.compile(r"R_SH_"), + arch_flags=["-m", "sh2"], + branch_instructions=SH2_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=SH2_BRANCH_INSTRUCTIONS.union( + {"bf", "bf.s", "bt", "bt.s", "bra", "bsr"} + ), + delay_slot_instructions=SH2_BRANCH_INSTRUCTIONS.union( + {"bf.s", "bt.s", "bra", "braf", "bsr", "bsrf", "jmp", "jsr", "rts"} + ), + proc=AsmProcessorSH2, +) + +ARCH_SETTINGS = [ + MIPS_SETTINGS, + MIPSEL_SETTINGS, + MIPSEE_SETTINGS, + ARM32_SETTINGS, + ARMEL_SETTINGS, + AARCH64_SETTINGS, + PPC_SETTINGS, + I686_SETTINGS, + SH2_SETTINGS, +] + + +def hexify_int(row: str, pat: Match[str], arch: ArchSettings) -> str: + full = pat.group(0) + + # sh2 only has 8-bit immediates, just convert them uniformly without + # any -hex stuff + if arch.name == "sh2": + return hex(int(full) & 0xFF) + + if len(full) <= 1: + # leave one-digit ints alone + return full + start, end = pat.span() + if start and row[start - 1] in arch.forbidden: + return full + if end < len(row) and row[end] in arch.forbidden: + return full + return hex(int(full)) + + +def parse_relocated_line(line: str) -> Tuple[str, str, str]: + # Pick out the last argument + for c in ",\t ": + if c in line: + ind2 = line.rindex(c) + break + else: + raise Exception(f"failed to parse relocated line: {line}") + before = line[: ind2 + 1] + after = line[ind2 + 1 :] + # Move an optional ($reg) part of it to 'after' + ind2 = after.find("(") + if ind2 == -1: + imm, after = after, "" + else: + imm, after = after[:ind2], after[ind2:] + return before, imm, after + + +def reloc_addend_from_imm(imm: str, before: str, arch: ArchSettings) -> str: + """For architectures like MIPS where relocations have addends embedded in + the code as immediates, convert such an immediate into an addition/ + subtraction that can occur just after the symbol.""" + # TODO this is incorrect for MIPS %lo/%hi which need to be paired up + # and combined. In practice, this means we only get symbol offsets within + # %lo, while %hi just shows the symbol. Unfortunately, objdump's output + # loses relocation order, so we cannot do this without parsing ELF relocs + # ourselves... + mnemonic = before.split()[0] + if mnemonic in arch.instructions_with_address_immediates: + addend = int(imm, 16) + else: + addend = int(imm, 0) + if addend == 0: + return "" + elif addend < 0: + return hex(addend) + else: + return "+" + hex(addend) + + +def pad_mnemonic(line: str) -> str: + if "\t" not in line: + return line + mn, args = line.split("\t", 1) + return f"{mn:<7s} {args}" + + +@dataclass +class Line: + mnemonic: str + diff_row: str + original: str + normalized_original: str + scorable_line: str + symbol: Optional[str] = None + line_num: Optional[int] = None + branch_target: Optional[int] = None + data_pool_addr: Optional[int] = None + source_filename: Optional[str] = None + source_line_num: Optional[int] = None + source_lines: List[str] = field(default_factory=list) + comment: Optional[str] = None + + +def process(dump: str, config: Config) -> List[Line]: + arch = config.arch + processor = arch.proc(config) + source_lines = [] + source_filename = None + source_line_num = None + + i = 0 + num_instr = 0 + data_refs: Dict[int, Dict[str, List[int]]] = defaultdict(lambda: defaultdict(list)) + output: List[Line] = [] + lines = dump.split("\n") + while i < len(lines): + row = lines[i] + i += 1 + + if not row: + continue + + if re.match(r"^[0-9a-f]+ <.*>:$", row): + continue + + if row.startswith("DATAREF"): + parts = row.split(" ", 3) + text_offset = int(parts[1]) + from_offset = int(parts[2]) + from_section = parts[3] + data_refs[text_offset][from_section].append(from_offset) + continue + + if config.diff_obj and num_instr >= config.max_function_size_lines: + output.append( + Line( + mnemonic="...", + diff_row="...", + original="...", + normalized_original="...", + scorable_line="...", + ) + ) + break + + if not re.match(r"^\s+[0-9a-f]+:\s+", row): + # This regex is conservative, and assumes the file path does not contain "weird" + # characters like tabs or angle brackets. + if re.match(r"^[^ \t<>][^\t<>]*:[0-9]+( \(discriminator [0-9]+\))?$", row): + source_filename, _, tail = row.rpartition(":") + source_line_num = int(tail.partition(" ")[0]) + source_lines.append(row) + continue + + # If the instructions loads a data pool symbol, extract the address of + # the symbol. + data_pool_addr = None + pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) + if pool_match: + offset = pool_match.group(3).split(" ")[0][1:] + data_pool_addr = int(offset, 16) + + m_comment = re.search(arch.re_comment, row) + comment = m_comment[0] if m_comment else None + row = re.sub(arch.re_comment, "", row) + line_num_str = row.split(":")[0] + row = row.rstrip() + tabs = row.split("\t") + line_num = eval_line_num(line_num_str.strip()) + + # TODO: use --no-show-raw-insn for all arches + if arch.name == "i686": + row = "\t".join(tabs[1:]) + else: + row = "\t".join(tabs[2:]) + + if line_num in data_refs: + refs = data_refs[line_num] + ref_str = "; ".join( + section_name + "+" + ",".join(hex(off) for off in offs) + for section_name, offs in refs.items() + ) + output.append( + Line( + mnemonic="", + diff_row="", + original=ref_str, + normalized_original=ref_str, + scorable_line="", + ) + ) + + if "\t" in row: + row_parts = row.split("\t", 1) + else: + # powerpc-eabi-objdump doesn't use tabs + row_parts = [part.lstrip() for part in row.split(" ", 1)] + + mnemonic = row_parts[0].strip() + args = row_parts[1].strip() if len(row_parts) >= 2 else "" + + next_line = lines[i] if i < len(lines) else None + mnemonic, args = processor.pre_process(mnemonic, args, next_line) + row = mnemonic + "\t" + args.replace("\t", " ") + + addr = "" + if mnemonic in arch.instructions_with_address_immediates: + row, addr = split_off_address(row) + # objdump prefixes addresses with 0x/-0x if they don't resolve to some + # symbol + offset. Strip that. + addr = addr.replace("0x", "") + + row = re.sub(arch.re_int, lambda m: hexify_int(row, m, arch), row) + row += addr + + # Let 'original' be 'row' with relocations applied, while we continue + # transforming 'row' into a coarser version that ignores registers and + # immediates. + original = row + + symbol = None + while i < len(lines): + reloc_row = lines[i] + if re.search(arch.re_reloc, reloc_row): + original, reloc_symbol = processor.process_reloc(reloc_row, original) + if reloc_symbol is not None: + symbol = reloc_symbol + else: + break + i += 1 + + is_text_relative_j = False + if ( + arch.name in MIPS_ARCH_NAMES + and mnemonic == "j" + and symbol is not None + and symbol.startswith(".text") + ): + symbol = None + original = row + is_text_relative_j = True + + normalized_original = processor.normalize(mnemonic, original) + + scorable_line = normalized_original + if not config.score_stack_differences: + scorable_line = re.sub(arch.re_sprel, "addr(sp)", scorable_line) + + row = re.sub(arch.re_reg, "", row) + row = re.sub(arch.re_sprel, "addr(sp)", row) + if mnemonic in arch.instructions_with_address_immediates: + row = row.strip() + row, _ = split_off_address(row) + row += "" + else: + row = normalize_imms(row, arch) + + branch_target = None + if ( + mnemonic in arch.branch_instructions or is_text_relative_j + ) and symbol is None: + x86_longjmp = re.search(r"\*(.*)\(", args) + if x86_longjmp: + capture = x86_longjmp.group(1) + if capture != "": + branch_target = int(capture, 16) + else: + branch_target = int(args.split(",")[-1], 16) + + output.append( + Line( + mnemonic=mnemonic, + diff_row=row, + original=original, + normalized_original=normalized_original, + scorable_line=scorable_line, + symbol=symbol, + line_num=line_num, + branch_target=branch_target, + data_pool_addr=data_pool_addr, + source_filename=source_filename, + source_line_num=source_line_num, + source_lines=source_lines, + comment=comment, + ) + ) + num_instr += 1 + source_lines = [] + + if config.stop_at_ret and processor.is_end_of_function(mnemonic, args): + break + + processor.post_process(output) + return output + + +def normalize_imms(row: str, arch: ArchSettings) -> str: + return re.sub(arch.re_imm, "", row) + + +def normalize_stack(row: str, arch: ArchSettings) -> str: + return re.sub(arch.re_sprel, "addr(sp)", row) + + +def check_for_symbol_mismatch( + old_line: Line, new_line: Line, symbol_map: Dict[str, str] +) -> bool: + + assert old_line.symbol is not None + assert new_line.symbol is not None + + if new_line.symbol.startswith("%hi"): + return False + + if old_line.symbol not in symbol_map: + symbol_map[old_line.symbol] = new_line.symbol + return False + elif symbol_map[old_line.symbol] == new_line.symbol: + return False + + return True + + +def field_matches_any_symbol(field: str, arch: ArchSettings) -> bool: + if arch.name == "ppc": + if "..." in field: + return True + + parts = field.rsplit("@", 1) + if len(parts) == 2 and parts[1] in {"l", "h", "ha", "sda21"}: + field = parts[0] + + return re.fullmatch((r"^@\d+$"), field) is not None + + if arch.name in MIPS_ARCH_NAMES: + return "." in field + + # Example: ".text+0x34" + if arch.name == "arm32": + return "." in field + + return False + + +def split_off_address(line: str) -> Tuple[str, str]: + """Split e.g. 'beqz $r0,1f0' into 'beqz $r0,' and '1f0'.""" + parts = line.split(",") + if len(parts) < 2: + parts = line.split(None, 1) + if len(parts) < 2: + parts.append("") + off = len(line) - len(parts[-1].strip()) + return line[:off], line[off:] + + +def diff_sequences_difflib( + seq1: List[str], seq2: List[str] +) -> List[Tuple[str, int, int, int, int]]: + differ = difflib.SequenceMatcher(a=seq1, b=seq2, autojunk=False) + return differ.get_opcodes() + + +def diff_sequences( + seq1: List[str], seq2: List[str], algorithm: str +) -> List[Tuple[str, int, int, int, int]]: + if algorithm != "levenshtein": + return diff_sequences_difflib(seq1, seq2) + + # The Levenshtein library assumes that we compare strings, not lists. Convert. + remapping: Dict[str, str] = {} + + def remap(seq: List[str]) -> str: + seq = seq[:] + for i in range(len(seq)): + val = remapping.get(seq[i]) + if val is None: + val = chr(len(remapping)) + remapping[seq[i]] = val + seq[i] = val + return "".join(seq) + + try: + rem1 = remap(seq1) + rem2 = remap(seq2) + except ValueError: + if len(seq1) + len(seq2) < 0x110000: + raise + # If there are too many unique elements, chr() doesn't work. + # Assume this is the case and fall back to difflib. + return diff_sequences_difflib(seq1, seq2) + + import Levenshtein + + ret: List[Tuple[str, int, int, int, int]] = Levenshtein.opcodes(rem1, rem2) + return ret + + +def diff_lines( + lines1: List[Line], + lines2: List[Line], + algorithm: str, +) -> List[Tuple[Optional[Line], Optional[Line]]]: + ret = [] + for (tag, i1, i2, j1, j2) in diff_sequences( + [line.mnemonic for line in lines1], + [line.mnemonic for line in lines2], + algorithm, + ): + for line1, line2 in itertools.zip_longest(lines1[i1:i2], lines2[j1:j2]): + if tag == "replace": + if line1 is None: + tag = "insert" + elif line2 is None: + tag = "delete" + elif tag == "insert": + assert line1 is None + elif tag == "delete": + assert line2 is None + ret.append((line1, line2)) + + return ret + + +def diff_sameline( + old_line: Line, new_line: Line, config: Config, symbol_map: Dict[str, str] +) -> Tuple[int, int, bool]: + + old = old_line.scorable_line + new = new_line.scorable_line + if old == new: + return (0, 0, False) + + num_stack_penalties = 0 + num_regalloc_penalties = 0 + has_symbol_mismatch = False + + ignore_last_field = False + if config.score_stack_differences: + oldsp = re.search(config.arch.re_sprel, old) + newsp = re.search(config.arch.re_sprel, new) + if oldsp and newsp: + oldrel = int(oldsp.group(1) or "0", 0) + newrel = int(newsp.group(1) or "0", 0) + num_stack_penalties += abs(oldrel - newrel) + ignore_last_field = True + + # Probably regalloc difference, or signed vs unsigned + + # Compare each field in order + new_parts, old_parts = new.split(None, 1), old.split(None, 1) + newfields, oldfields = new_parts[1].split(","), old_parts[1].split(",") + if ignore_last_field: + newfields = newfields[:-1] + oldfields = oldfields[:-1] + else: + # If the last field has a parenthesis suffix, e.g. "0x38(r7)" + # we split that part out to make it a separate field + # however, we don't split if it has a proceeding % macro, e.g. "%lo(.data)" + re_paren = re.compile(r"(? int: + # This logic is copied from `scorer.py` from the decomp permuter project + # https://github.com/simonlindholm/decomp-permuter/blob/main/src/scorer.py + num_stack_penalties = 0 + num_regalloc_penalties = 0 + num_reordering_penalties = 0 + num_insertion_penalties = 0 + num_deletion_penalties = 0 + deletions = [] + insertions = [] + + def diff_insert(line: str) -> None: + # Reordering or totally different codegen. + # Defer this until later when we can tell. + insertions.append(line) + + def diff_delete(line: str) -> None: + deletions.append(line) + + # Find the end of the last long streak of matching mnemonics, if it looks + # like the objdump output was truncated. This is used to skip scoring + # misaligned lines at the end of the diff. + last_mismatch = -1 + max_index = None + lines_were_truncated = False + for index, (line1, line2) in enumerate(lines): + if (line1 and line1.original == "...") or (line2 and line2.original == "..."): + lines_were_truncated = True + if line1 and line2 and line1.mnemonic == line2.mnemonic: + if index - last_mismatch >= 50: + max_index = index + else: + last_mismatch = index + if not lines_were_truncated: + max_index = None + + for index, (line1, line2) in enumerate(lines): + if max_index is not None and index > max_index: + break + if line1 and line2 and line1.mnemonic == line2.mnemonic: + sp, rp, _ = diff_sameline(line1, line2, config, symbol_map) + num_stack_penalties += sp + num_regalloc_penalties += rp + else: + if line1: + diff_delete(line1.scorable_line) + if line2: + diff_insert(line2.scorable_line) + + insertions_co = Counter(insertions) + deletions_co = Counter(deletions) + for item in insertions_co + deletions_co: + ins = insertions_co[item] + dels = deletions_co[item] + common = min(ins, dels) + num_insertion_penalties += ins - common + num_deletion_penalties += dels - common + num_reordering_penalties += common + + return ( + num_stack_penalties * config.penalty_stackdiff + + num_regalloc_penalties * config.penalty_regalloc + + num_reordering_penalties * config.penalty_reordering + + num_insertion_penalties * config.penalty_insertion + + num_deletion_penalties * config.penalty_deletion + ) + + +@dataclass(frozen=True) +class OutputLine: + base: Optional[Text] = field(compare=False) + fmt2: Text = field(compare=False) + key2: Optional[str] + boring: bool = field(compare=False) + is_data_ref: bool = field(compare=False) + line1: Optional[Line] = field(compare=False) + line2: Optional[Line] = field(compare=False) + + +@dataclass(frozen=True) +class Diff: + lines: List[OutputLine] + score: int + max_score: int + + +def trim_nops(lines: List[Line], arch: ArchSettings) -> List[Line]: + lines = lines[:] + while ( + lines + and lines[-1].mnemonic == "nop" + and (len(lines) == 1 or lines[-2].mnemonic not in arch.delay_slot_instructions) + ): + lines.pop() + return lines + + +def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff: + if config.show_source: + import cxxfilt + arch = config.arch + fmt = config.formatter + output: List[OutputLine] = [] + symbol_map: Dict[str, str] = {} + + sc1 = symbol_formatter("base-reg", 0) + sc2 = symbol_formatter("my-reg", 0) + sc3 = symbol_formatter("base-stack", 4) + sc4 = symbol_formatter("my-stack", 4) + sc5 = symbol_formatter("base-branch", 0) + sc6 = symbol_formatter("my-branch", 0) + bts1: Set[int] = set() + bts2: Set[int] = set() + + if config.show_branches: + for (lines, btset, sc) in [ + (lines1, bts1, sc5), + (lines2, bts2, sc6), + ]: + for line in lines: + bt = line.branch_target + if bt is not None: + btset.add(bt) + sc(str(bt)) + + lines1 = trim_nops(lines1, arch) + lines2 = trim_nops(lines2, arch) + + diffed_lines = diff_lines(lines1, lines2, config.algorithm) + + line_num_base = -1 + line_num_offset = 0 + line_num_2to1 = {} + for (line1, line2) in diffed_lines: + if line1 is not None and line1.line_num is not None: + line_num_base = line1.line_num + line_num_offset = 0 + else: + line_num_offset += 1 + if line2 is not None and line2.line_num is not None: + line_num_2to1[line2.line_num] = (line_num_base, line_num_offset) + + for (line1, line2) in diffed_lines: + line_color1 = line_color2 = sym_color = BasicFormat.NONE + line_prefix = " " + is_data_ref = False + out1 = Text() if not line1 else Text(pad_mnemonic(line1.original)) + out2 = Text() if not line2 else Text(pad_mnemonic(line2.original)) + if line1 and line2 and line1.diff_row == line2.diff_row: + if line1.diff_row == "": + if line1.normalized_original != line2.normalized_original: + line_prefix = "i" + sym_color = BasicFormat.DIFF_CHANGE + out1 = out1.reformat(sym_color) + out2 = out2.reformat(sym_color) + is_data_ref = True + elif ( + line1.normalized_original == line2.normalized_original + and line2.branch_target is None + ): + # Fast path: no coloring needed. We don't include branch instructions + # in this case because we need to check that their targets line up in + # the diff, and don't just happen to have the are the same address + # by accident. + pass + else: + mnemonic = line1.original.split()[0] + branchless1, address1 = out1.plain(), "" + branchless2, address2 = out2.plain(), "" + if mnemonic in arch.instructions_with_address_immediates: + branchless1, address1 = split_off_address(branchless1) + branchless2, address2 = split_off_address(branchless2) + + out1 = Text(branchless1) + out2 = Text(branchless2) + out1, out2 = format_fields( + arch.re_imm, out1, out2, lambda _: BasicFormat.IMMEDIATE + ) + + if line2.branch_target is not None: + target = line2.branch_target + line2_target = line_num_2to1.get(line2.branch_target) + if line2_target is None: + # If the target is outside the disassembly, extrapolate. + # This only matters near the bottom. + assert line2.line_num is not None + line2_line = line_num_2to1[line2.line_num] + line2_target = (line2_line[0] + (target - line2.line_num), 0) + + # Adjust the branch target for scoring and three-way diffing. + norm2, norm_branch2 = split_off_address(line2.normalized_original) + if norm_branch2 != "": + retargetted = hex(line2_target[0]).replace("0x", "") + if line2_target[1] != 0: + retargetted += f"+{line2_target[1]}" + line2.normalized_original = norm2 + retargetted + sc_base, _ = split_off_address(line2.scorable_line) + line2.scorable_line = sc_base + retargetted + same_target = line2_target == (line1.branch_target, 0) + else: + # Do a naive comparison for non-branches (e.g. function calls). + same_target = address1 == address2 + + if normalize_imms(branchless1, arch) == normalize_imms( + branchless2, arch + ): + ( + stack_penalties, + regalloc_penalties, + has_symbol_mismatch, + ) = diff_sameline(line1, line2, config, symbol_map) + + if ( + regalloc_penalties == 0 + and stack_penalties == 0 + and not has_symbol_mismatch + ): + # ignore differences due to %lo(.rodata + ...) vs symbol + out1 = out1.reformat(BasicFormat.NONE) + out2 = out2.reformat(BasicFormat.NONE) + elif line2.branch_target is not None and same_target: + # same-target branch, don't color + pass + else: + # must have an imm difference (or else we would have hit the + # fast path) + sym_color = BasicFormat.IMMEDIATE + line_prefix = "i" + else: + out1, out2 = format_fields(arch.re_sprel, out1, out2, sc3, sc4) + if normalize_stack(branchless1, arch) == normalize_stack( + branchless2, arch + ): + # only stack differences (luckily stack and imm + # differences can't be combined in MIPS, so we + # don't have to think about that case) + sym_color = BasicFormat.STACK + line_prefix = "s" + else: + # reg differences and maybe imm as well + out1, out2 = format_fields(arch.re_reg, out1, out2, sc1, sc2) + cats = config.reg_categories + if cats and any( + cats.get(of.group()) != cats.get(nf.group()) + for (of, nf) in zip( + out1.finditer(arch.re_reg), out2.finditer(arch.re_reg) + ) + ): + sym_color = BasicFormat.REGISTER_CATEGORY + line_prefix = "R" + else: + sym_color = BasicFormat.REGISTER + line_prefix = "r" + line_color1 = line_color2 = sym_color + + if same_target: + address_imm_fmt = BasicFormat.NONE + else: + address_imm_fmt = BasicFormat.IMMEDIATE + out1 += Text(address1, address_imm_fmt) + out2 += Text(address2, address_imm_fmt) + elif line1 and line2: + line_prefix = "|" + line_color1 = line_color2 = sym_color = BasicFormat.DIFF_CHANGE + out1 = out1.reformat(line_color1) + out2 = out2.reformat(line_color2) + elif line1: + line_prefix = "<" + line_color1 = sym_color = BasicFormat.DIFF_REMOVE + out1 = out1.reformat(line_color1) + out2 = Text() + elif line2: + line_prefix = ">" + line_color2 = sym_color = BasicFormat.DIFF_ADD + out1 = Text() + out2 = out2.reformat(line_color2) + + if config.show_source and line2 and line2.comment: + out2 += f" {line2.comment}" + + def format_part( + out: Text, + line: Optional[Line], + line_color: Format, + btset: Set[int], + sc: FormatFunction, + ) -> Optional[Text]: + if line is None: + return None + if line.line_num is None: + return out + in_arrow = Text(" ") + out_arrow = Text() + if config.show_branches: + if line.line_num in btset: + in_arrow = Text("~>", sc(str(line.line_num))) + if line.branch_target is not None: + out_arrow = " " + Text("~>", sc(str(line.branch_target))) + formatted_line_num = Text(hex(line.line_num)[2:] + ":", line_color) + return formatted_line_num + " " + in_arrow + " " + out + out_arrow + + part1 = format_part(out1, line1, line_color1, bts1, sc5) + part2 = format_part(out2, line2, line_color2, bts2, sc6) + + if config.show_source and line2: + for source_line in line2.source_lines: + line_format = BasicFormat.SOURCE_OTHER + if config.source_old_binutils: + if source_line and re.fullmatch(".*\.c(?:pp)?:\d+", source_line): + line_format = BasicFormat.SOURCE_FILENAME + elif source_line and source_line.endswith("():"): + line_format = BasicFormat.SOURCE_FUNCTION + try: + source_line = cxxfilt.demangle( + source_line[:-3], external_only=False + ) + except: + pass + else: + # File names and function names + if source_line and source_line[0] != "│": + line_format = BasicFormat.SOURCE_FILENAME + # Function names + if source_line.endswith("():"): + line_format = BasicFormat.SOURCE_FUNCTION + try: + source_line = cxxfilt.demangle( + source_line[:-3], external_only=False + ) + except: + pass + padding = " " * 7 if config.show_line_numbers else " " * 2 + output.append( + OutputLine( + base=None, + fmt2=padding + Text(source_line, line_format), + key2=source_line, + boring=True, + is_data_ref=False, + line1=None, + line2=None, + ) + ) + + key2 = line2.normalized_original if line2 else None + boring = False + if line_prefix == " ": + boring = True + elif config.compress and config.compress.same_instr and line_prefix in "irs": + boring = True + + if config.show_line_numbers: + if line2 and line2.source_line_num is not None: + num_color = ( + BasicFormat.SOURCE_LINE_NUM + if sym_color == BasicFormat.NONE + else sym_color + ) + num2 = Text(f"{line2.source_line_num:5}", num_color) + else: + num2 = Text(" " * 5) + else: + num2 = Text() + + fmt2 = Text(line_prefix, sym_color) + num2 + " " + (part2 or Text()) + + output.append( + OutputLine( + base=part1, + fmt2=fmt2, + key2=key2, + boring=boring, + is_data_ref=is_data_ref, + line1=line1, + line2=line2, + ) + ) + + output = output[config.skip_lines :] + + score = score_diff_lines(diffed_lines, config, symbol_map) + max_score = len(lines1) * config.penalty_deletion + return Diff(lines=output, score=score, max_score=max_score) + + +def chunk_diff_lines( + diff: List[OutputLine], +) -> List[Union[List[OutputLine], OutputLine]]: + """Chunk a diff into an alternating list like A B A B ... A, where: + * A is a List[OutputLine] of insertions, + * B is a single non-insertion OutputLine, with .base != None.""" + cur_right: List[OutputLine] = [] + chunks: List[Union[List[OutputLine], OutputLine]] = [] + for output_line in diff: + if output_line.base is not None: + chunks.append(cur_right) + chunks.append(output_line) + cur_right = [] + else: + cur_right.append(output_line) + chunks.append(cur_right) + return chunks + + +def compress_matching( + li: List[Tuple[OutputLine, ...]], context: int +) -> List[Tuple[OutputLine, ...]]: + ret: List[Tuple[OutputLine, ...]] = [] + matching_streak: List[Tuple[OutputLine, ...]] = [] + context = max(context, 0) + + def flush_matching() -> None: + if len(matching_streak) <= 2 * context + 1: + ret.extend(matching_streak) + else: + ret.extend(matching_streak[:context]) + skipped = len(matching_streak) - 2 * context + filler = OutputLine( + base=Text(f"<{skipped} lines>", BasicFormat.SOURCE_OTHER), + fmt2=Text(), + key2=None, + boring=False, + is_data_ref=False, + line1=None, + line2=None, + ) + columns = len(matching_streak[0]) + ret.append(tuple([filler] * columns)) + if context > 0: + ret.extend(matching_streak[-context:]) + matching_streak.clear() + + for line in li: + if line[0].boring: + matching_streak.append(line) + else: + flush_matching() + ret.append(line) + + flush_matching() + return ret + + +def align_diffs(old_diff: Diff, new_diff: Diff, config: Config) -> TableData: + headers: Tuple[Text, ...] + diff_lines: List[Tuple[OutputLine, ...]] + padding = " " * 7 if config.show_line_numbers else " " * 2 + + if config.diff_mode in (DiffMode.THREEWAY_PREV, DiffMode.THREEWAY_BASE): + old_chunks = chunk_diff_lines(old_diff.lines) + new_chunks = chunk_diff_lines(new_diff.lines) + diff_lines = [] + empty = OutputLine(Text(), Text(), None, True, False, None, None) + assert len(old_chunks) == len(new_chunks), "same target" + for old_chunk, new_chunk in zip(old_chunks, new_chunks): + if isinstance(old_chunk, list): + assert isinstance(new_chunk, list) + if not old_chunk and not new_chunk: + # Most of the time lines sync up without insertions/deletions, + # and there's no interdiffing to be done. + continue + differ = difflib.SequenceMatcher( + a=old_chunk, b=new_chunk, autojunk=False + ) + for (tag, i1, i2, j1, j2) in differ.get_opcodes(): + if tag in ["equal", "replace"]: + for i, j in zip(range(i1, i2), range(j1, j2)): + diff_lines.append((empty, new_chunk[j], old_chunk[i])) + if tag in ["insert", "replace"]: + for j in range(j1 + i2 - i1, j2): + diff_lines.append((empty, new_chunk[j], empty)) + if tag in ["delete", "replace"]: + for i in range(i1 + j2 - j1, i2): + diff_lines.append((empty, empty, old_chunk[i])) + else: + assert isinstance(new_chunk, OutputLine) + # old_chunk.base and new_chunk.base have the same text since + # both diffs are based on the same target, but they might + # differ in color. Use the new version. + diff_lines.append((new_chunk, new_chunk, old_chunk)) + diff_lines = [ + (base, new, old if old != new else empty) for base, new, old in diff_lines + ] + headers = ( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + Text(f"{padding}PREVIOUS ({old_diff.score})"), + ) + current_score = new_diff.score + max_score = new_diff.max_score + previous_score = old_diff.score + elif config.diff_mode in (DiffMode.SINGLE, DiffMode.SINGLE_BASE): + header = Text("BASE" if config.diff_mode == DiffMode.SINGLE_BASE else "CURRENT") + diff_lines = [(line,) for line in new_diff.lines] + headers = (header,) + # Scoring is disabled for view mode + current_score = 0 + max_score = 0 + previous_score = None + else: + diff_lines = [(line, line) for line in new_diff.lines] + headers = ( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + ) + current_score = new_diff.score + max_score = new_diff.max_score + previous_score = None + if config.compress: + diff_lines = compress_matching(diff_lines, config.compress.context) + + def diff_line_to_table_line(line: Tuple[OutputLine, ...]) -> TableLine: + cells = [ + (line[0].base or Text(), line[0].line1), + ] + for ol in line[1:]: + cells.append((ol.fmt2, ol.line2)) + + return TableLine( + key=line[0].key2, + is_data_ref=line[0].is_data_ref, + cells=tuple(cells), + ) + + return TableData( + headers=headers, + current_score=current_score, + max_score=max_score, + previous_score=previous_score, + lines=[diff_line_to_table_line(line) for line in diff_lines], + ) + + +def debounced_fs_watch( + targets: List[str], + outq: "queue.Queue[Optional[float]]", + config: Config, + project: ProjectSettings, +) -> None: + import watchdog.events + import watchdog.observers + + class WatchEventHandler(watchdog.events.FileSystemEventHandler): + def __init__( + self, queue: "queue.Queue[float]", file_targets: List[str] + ) -> None: + self.queue = queue + self.file_targets = file_targets + + def on_modified(self, ev: object) -> None: + if isinstance(ev, watchdog.events.FileModifiedEvent): + self.changed(ev.src_path) + + def on_moved(self, ev: object) -> None: + if isinstance(ev, watchdog.events.FileMovedEvent): + self.changed(ev.dest_path) + + def should_notify(self, path: str) -> bool: + for target in self.file_targets: + if os.path.normpath(path) == target: + return True + if config.make and any( + path.endswith(suffix) for suffix in project.source_extensions + ): + return True + return False + + def changed(self, path: str) -> None: + if self.should_notify(path): + self.queue.put(time.time()) + + def debounce_thread() -> NoReturn: + listenq: "queue.Queue[float]" = queue.Queue() + file_targets: List[str] = [] + event_handler = WatchEventHandler(listenq, file_targets) + observer = watchdog.observers.Observer() + observed = set() + for target in targets: + if os.path.isdir(target): + observer.schedule(event_handler, target, recursive=True) + else: + file_targets.append(os.path.normpath(target)) + target = os.path.dirname(target) or "." + if target not in observed: + observed.add(target) + observer.schedule(event_handler, target) + observer.start() + while True: + t = listenq.get() + more = True + while more: + delay = t + DEBOUNCE_DELAY - time.time() + if delay > 0: + time.sleep(delay) + # consume entire queue + more = False + try: + while True: + t = listenq.get(block=False) + more = True + except queue.Empty: + pass + outq.put(t) + + th = threading.Thread(target=debounce_thread, daemon=True) + th.start() + + +class Display: + basedump: str + mydump: str + last_refresh_key: object + config: Config + emsg: Optional[str] + last_diff_output: Optional[Diff] + pending_update: Optional[str] + ready_queue: "queue.Queue[None]" + watch_queue: "queue.Queue[Optional[float]]" + less_proc: "Optional[subprocess.Popen[bytes]]" + + def __init__(self, basedump: str, mydump: str, config: Config) -> None: + self.config = config + self.base_lines = process(basedump, config) + self.mydump = mydump + self.emsg = None + self.last_refresh_key = None + self.last_diff_output = None + + def run_diff(self) -> Tuple[str, object]: + if self.emsg is not None: + return (self.emsg, self.emsg) + + my_lines = process(self.mydump, self.config) + + if self.config.diff_mode == DiffMode.SINGLE_BASE: + diff_output = do_diff(self.base_lines, self.base_lines, self.config) + elif self.config.diff_mode == DiffMode.SINGLE: + diff_output = do_diff(my_lines, my_lines, self.config) + else: + diff_output = do_diff(self.base_lines, my_lines, self.config) + + last_diff_output = self.last_diff_output or diff_output + if self.config.diff_mode != DiffMode.THREEWAY_BASE or not self.last_diff_output: + self.last_diff_output = diff_output + + data = align_diffs(last_diff_output, diff_output, self.config) + output = self.config.formatter.table(data) + + refresh_key = ( + [line.key2 for line in diff_output.lines], + diff_output.score, + ) + + return (output, refresh_key) + + def run_less( + self, output: str + ) -> "Tuple[subprocess.Popen[bytes], subprocess.Popen[bytes]]": + # Pipe the output through 'tail' and only then to less, to ensure the + # write call doesn't block. ('tail' has to buffer all its input before + # it starts writing.) This also means we don't have to deal with pipe + # closure errors. + buffer_proc = subprocess.Popen( + BUFFER_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + less_proc = subprocess.Popen(LESS_CMD, stdin=buffer_proc.stdout) + assert buffer_proc.stdin + assert buffer_proc.stdout + buffer_proc.stdin.write(output.encode()) + buffer_proc.stdin.close() + buffer_proc.stdout.close() + return (buffer_proc, less_proc) + + def run_sync(self) -> None: + output, _ = self.run_diff() + proca, procb = self.run_less(output) + procb.wait() + proca.wait() + + def run_async(self, watch_queue: "queue.Queue[Optional[float]]") -> None: + self.watch_queue = watch_queue + self.ready_queue = queue.Queue() + self.pending_update = None + output, refresh_key = self.run_diff() + self.last_refresh_key = refresh_key + dthread = threading.Thread(target=self.display_thread, args=(output,)) + dthread.start() + self.ready_queue.get() + + def display_thread(self, initial_output: str) -> None: + proca, procb = self.run_less(initial_output) + self.less_proc = procb + self.ready_queue.put(None) + while True: + ret = procb.wait() + proca.wait() + self.less_proc = None + if ret != 0: + # fix the terminal + os.system("tput reset") + if ret != 0 and self.pending_update is not None: + # killed by program with the intent to refresh + output = self.pending_update + self.pending_update = None + proca, procb = self.run_less(output) + self.less_proc = procb + self.ready_queue.put(None) + else: + # terminated by user, or killed + self.watch_queue.put(None) + self.ready_queue.put(None) + break + + def progress(self, msg: str) -> None: + # Write message to top-left corner + sys.stdout.write("\x1b7\x1b[1;1f{}\x1b8".format(msg + " ")) + sys.stdout.flush() + + def update(self, text: str, error: bool) -> None: + if not error and not self.emsg and text == self.mydump: + self.progress("Unchanged. ") + return + if not error: + self.mydump = text + self.emsg = None + else: + self.emsg = text + output, refresh_key = self.run_diff() + if refresh_key == self.last_refresh_key: + self.progress("Unchanged. ") + return + self.last_refresh_key = refresh_key + self.pending_update = output + if not self.less_proc: + return + self.less_proc.kill() + self.ready_queue.get() + + def terminate(self) -> None: + if not self.less_proc: + return + self.less_proc.kill() + self.ready_queue.get() + + +def main() -> None: + args = parser.parse_args() + + # Apply project-specific configuration. + settings: Dict[str, Any] = {} + diff_settings.apply(settings, args) # type: ignore + project = create_project_settings(settings) + + try: + config = create_config(args, project) + except ValueError as e: + fail(str(e)) + + if config.algorithm == "levenshtein": + try: + import Levenshtein + except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + + if config.show_source: + try: + import cxxfilt + except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + + if ( + config.diff_mode in (DiffMode.THREEWAY_BASE, DiffMode.THREEWAY_PREV) + and not args.watch + ): + fail("Threeway diffing requires -w.") + + if args.diff_elf_symbol: + make_target, basecmd, mycmd = dump_elf( + args.start, args.end, args.diff_elf_symbol, config, project + ) + elif config.diff_obj: + make_target, basecmd, mycmd = dump_objfile( + args.start, args.end, config, project + ) + else: + make_target, basecmd, mycmd = dump_binary(args.start, args.end, config, project) + + map_build_target_fn = getattr(diff_settings, "map_build_target", None) + if map_build_target_fn: + make_target = map_build_target_fn(make_target=make_target) + + if args.write_asm is not None: + mydump = run_objdump(mycmd, config, project) + with open(args.write_asm, "w") as f: + f.write(mydump) + print(f"Wrote assembly to {args.write_asm}.") + sys.exit(0) + + if args.base_asm is not None: + with open(args.base_asm) as f: + basedump = f.read() + elif config.diff_mode != DiffMode.SINGLE: + basedump = run_objdump(basecmd, config, project) + else: + basedump = "" + + mydump = run_objdump(mycmd, config, project) + + display = Display(basedump, mydump, config) + + if args.no_pager or args.format in ("html", "json"): + print(display.run_diff()[0]) + elif not args.watch: + display.run_sync() + else: + if not args.make: + yn = input( + "Warning: watch-mode (-w) enabled without auto-make (-m). " + "You will have to run make manually. Ok? (Y/n) " + ) + if yn.lower() == "n": + return + if args.make: + watch_sources = None + watch_sources_for_target_fn = getattr( + diff_settings, "watch_sources_for_target", None + ) + if watch_sources_for_target_fn: + watch_sources = watch_sources_for_target_fn(make_target) + watch_sources = watch_sources or project.source_directories + if not watch_sources: + fail("Missing source_directories config, don't know what to watch.") + else: + watch_sources = [make_target] + q: "queue.Queue[Optional[float]]" = queue.Queue() + debounced_fs_watch(watch_sources, q, config, project) + display.run_async(q) + last_build = 0.0 + try: + while True: + t = q.get() + if t is None: + break + if t < last_build: + continue + last_build = time.time() + if args.make: + display.progress("Building...") + ret = run_make_capture_output(make_target, project) + if ret.returncode != 0: + display.update( + ret.stderr.decode("utf-8-sig", "replace") + or ret.stdout.decode("utf-8-sig", "replace"), + error=True, + ) + continue + mydump = run_objdump(mycmd, config, project) + display.update(mydump, error=False) + except KeyboardInterrupt: + display.terminate() + + +if __name__ == "__main__": + main() diff --git a/tools/asm-differ/diff_settings.py b/tools/asm-differ/diff_settings.py new file mode 100644 index 0000000..19d67d5 --- /dev/null +++ b/tools/asm-differ/diff_settings.py @@ -0,0 +1,12 @@ +def apply(config, args): + config["baseimg"] = "target.bin" + config["myimg"] = "source.bin" + config["mapfile"] = "build.map" + config["source_directories"] = ["."] + # config["show_line_numbers_default"] = True + # config["arch"] = "mips" + # config["map_format"] = "gnu" # gnu, mw, ms + # config["build_dir"] = "build/" # only needed for mw and ms map format + # config["expected_dir"] = "expected/" # needed for -o + # config["makeflags"] = [] + # config["objdump_executable"] = "" diff --git a/tools/asm-differ/mypy.ini b/tools/asm-differ/mypy.ini new file mode 100644 index 0000000..138b939 --- /dev/null +++ b/tools/asm-differ/mypy.ini @@ -0,0 +1,17 @@ +[mypy] +check_untyped_defs = True +disallow_any_generics = True +disallow_incomplete_defs = True +disallow_untyped_calls = True +disallow_untyped_decorators = True +disallow_untyped_defs = True +no_implicit_optional = True +warn_redundant_casts = True +warn_return_any = True +warn_unused_ignores = True +ignore_missing_imports = True +python_version = 3.6 +files = diff.py + +[mypy-diff_settings] +ignore_errors = True diff --git a/tools/asm-differ/poetry.lock b/tools/asm-differ/poetry.lock new file mode 100644 index 0000000..2826d78 --- /dev/null +++ b/tools/asm-differ/poetry.lock @@ -0,0 +1,321 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "ansiwrap" +version = "0.8.4" +description = "textwrap, but savvy to ANSI colors and styles" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ansiwrap-0.8.4-py2.py3-none-any.whl", hash = "sha256:7b053567c88e1ad9eed030d3ac41b722125e4c1271c8a99ade797faff1f49fb1"}, + {file = "ansiwrap-0.8.4.zip", hash = "sha256:ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7"}, +] + +[package.dependencies] +textwrap3 = ">=0.9.2" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cxxfilt" +version = "0.3.0" +description = "Python interface to c++filt / abi::__cxa_demangle" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cxxfilt-0.3.0-py2.py3-none-any.whl", hash = "sha256:774e85a8d0157775ed43276d89397d924b104135762d86b3a95f81f203094e07"}, + {file = "cxxfilt-0.3.0.tar.gz", hash = "sha256:7df6464ba5e8efbf0d8974c0b2c78b32546676f06059a83515dbdfa559b34214"}, +] + +[package.extras] +test = ["pytest (>=3.0.0)"] + +[[package]] +name = "levenshtein" +version = "0.20.9" +description = "Python extension for computing string edit distances and similarities." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Levenshtein-0.20.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:105c239ec786750cd5136991c58196b440cc39b6acf3ec8227f6562c9a94e4b9"}, + {file = "Levenshtein-0.20.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f7728bea7fe6dc55ceecde0dcda4287e74fe3b6733ad42530f46aaa8d2f81d0"}, + {file = "Levenshtein-0.20.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc7eca755c13c92814c8cce8175524cf764ce38f39228b602f59eac58cfdc51a"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8a552e79d053dc1324fb90d342447fd4e15736f4cbc5363b6fbd5577f53dce9"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5474b2681ee0b7944fb1e7fe281cd44e2dfe75b03ba4558dca49c96fa0861b62"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56e132c203b0dd8fc72a33e791c39ad0d5a25bcf24b130a1e202abbf489a3e75"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3badc94708ac05b405e795fde58a53272b90a9ee6099ecd54a345658b7b812e1"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48b9b3ae095b14dad7bc4bd219c7cd9113a7aa123a033337c85b00fe2ed565d3"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0d3a1f7328c91caeb1f857ddd2787e3f19d60cc2c688339d249ca8841da61454"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ef67c50428c99caf67d31bd209da21d9378da5f0cc3ad4f7bafb6caa78aee6f2"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:47f6d1592c0891f7355e38a302becd233336ca2f55f9a8be3a8635f946a6784f"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2891019740e874f05e0349e9f27b6af8ad837b1612f42e9c90c296d54d1404fd"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c554704eec4f4ba742febdcc79a85491f8f9a1d493cb103bb2af18536d6cf122"}, + {file = "Levenshtein-0.20.9-cp310-cp310-win32.whl", hash = "sha256:7628e356b3f9c78ad7272c3b9137f0641a1368849e749ff6f2c8fe372795806b"}, + {file = "Levenshtein-0.20.9-cp310-cp310-win_amd64.whl", hash = "sha256:ba2bafe3511194a37044cae4e7d328cca70657933052691c37eba2ca428a379d"}, + {file = "Levenshtein-0.20.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7605a94145198d19fdaaa7e29c0f8a56ad719b12386f3ae8cd8ed4cb9fa6c2e4"}, + {file = "Levenshtein-0.20.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29db4dabfad2ddf33c7986eb6fd525c7587cca4c4d9e187365cff0a5281f5a35"}, + {file = "Levenshtein-0.20.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:965336c1772a4fc5fb2686a2a0bfaf3455dced96f19f50f278da8bc139076d31"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67235753035ac898d6475c0b29540521018db2e0027a3c1deb9aa0af0a84fd74"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:120dca58136aee3d8c7b190e30db7b6a6eb9579ea5712df84ad076a389801743"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6496ea66a6f755e48c0d82f1eee396d16edcd5592d4b3677d26fa789a636a728"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0af20327acc2c904d11611cb3a0d8d17f80c279a12e0b84189eafc35297186d"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d2f891ef53afbab6cf2eeb92ff13151884d17dc80a2d6d3c7ae74d7738b772"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2ab9c72380582bf4745d1c5b055b1df0c85f7a980a04bd7603a855dd91478c0f"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6de13be3eb5ac48053fb1635a7b4daa936b9114ad4b264942e9eb709fcaa41dd"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a9fc296860588251d8d72b4f4637cca4eef7351e042a7a23d44e6385aef1e160"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:35777b20fe35858248c22da37984469e6dd1278f55d17c53378312853d5d683d"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6b9e0642ddb4c431f77c38cec9edbd0317e26c3f37d072ccf281ab58926dce69"}, + {file = "Levenshtein-0.20.9-cp311-cp311-win32.whl", hash = "sha256:f88ec322d86d3cc9d3936dbf6b421ad813950c2658599d48ac4ede59f2a6047e"}, + {file = "Levenshtein-0.20.9-cp311-cp311-win_amd64.whl", hash = "sha256:2907a6888455f9915d5b656f5d058f63eaf6063b2c7f0f1ff6bc05706ae5bc39"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6bcebc79760be08488cb921732af34ade6abc7476a94866881c68b45ec4b6c82"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d8d4f3825d1d8f3b19382537a8536e689cf57aaa224d2cb4f44cf844811885"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d40e18a5817ee7f0675401613a26c492fd4ea68d2103c1480fb5a6ab1b8763d"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d258f3d44f6bac17f33002fea34570049507d3476c3716b5267170c666b20b4"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c621e0c389546147ed43c33ca4168de0f91c920508ab8a94a400835fa084f486"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a31527dc7994353091626e62b7d82d53290cb00df48d3e5d29cb291fb4c03c"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:129c8f192e656b7c2c543bf0d704d677720771b8bc2f30c50db02fbc2001bac2"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5a01fca58255be6bf724a40af2575d7cf644c099c28a00d1f5f6a81675e60e7d"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:4c13749ea39a228f05d5bd9d473e76f726fc2dcd493cafc322f740921a6eeffb"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:69daa0f8eefa5b947255a81346741ed86fe7030e0909741dbd978e38b30da3fd"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fcc78a73ed423bbb09ac902dd2e1ff1094d159d1c6766e5e52da5f376a4cba18"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-win32.whl", hash = "sha256:d82ae57982a9f33c55778f1f0f63d5e51e291aee236abed3b90497578b944202"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-win_amd64.whl", hash = "sha256:4082379b406752fc1173ed1f8c3a122c5d5491e10e564ed721602e4e049e3d4c"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb499783b7126e6fc45c39ab34c8114148425c5d975b1ce35e6c47c0eda58a94"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce747b296aad3bd8a563cccf2119cf37bf72f668076bfdad6ec55f0a0596dd9"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1347c3ebbe8f42f7a487e8d23a95bde6529379b4939ad51d32246d001565c499"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a2f1c1e8360603a6da29416da61d1907a27656843e269413091c8c3a3e6286e"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73c1caaedbee3617fd29139aac8dab7743776b59c3c1fed2790308ecb43c7b25"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1f24133df69f8b618fc508d6023695130ad3c3c8968ef43aaeca21835eb337a"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cf7260722f8170c09af5cfa714bb45626a4dfc85d71d1c1c9c52c2a6901cc501"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:01668178fd9244df290db0340293982fe7641162a12a35ad9ffb3fe145ce6377"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1e46f9d3483dc4991ac60ff3711b0d40f93e352cc8edc16b68df57ccc472bd6c"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:680cd250dc1875eb80cf2a0cca742bd13f6f9ab11c48317244fcc483eba1dd67"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2346e2f7dfbbc2936bd81e19f7734984e72486ffc086760c897b39b9f674b2fa"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-win32.whl", hash = "sha256:7f31bcf257fec9719d0d97185c419d315f6f20a194f0b442919e352d19418b2e"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-win_amd64.whl", hash = "sha256:48262bc9830ad60de96411fcb2e96a522c7206e7069169e04d89dd79364a7722"}, + {file = "Levenshtein-0.20.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eba5696e1f8e8da225498fd1d743886d639400cafd0e5be3c553978cbb54c345"}, + {file = "Levenshtein-0.20.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:679333188f9791c85109d2981e97e8721a99b2b975b5c52d16aca50ac9c70757"}, + {file = "Levenshtein-0.20.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06c9cfc61cf66833692d1ed258ec5a0871221b0779f1281c32a10348c492e2c5"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5d80d949168df406f2ac9ade1a5d0419cef0a8df611c8c2efe88f0248c9d0c0"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9275c6e601ff7f659116e2235e8585950c9c39d72504006077be85bf27950b35"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6414eea342d9632045e12b66bef043dbc6557189a283dc4dcc5966f63fa48998"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56571c58700600a382ecdf3f9efcb132ed16a0476cbb4e23a9478ab0ae788fd9"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7ccb76ffd9b851384f9cf1595b90b17cae46f0ab895e234de11ea48f9d9f73a"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109172943cff7fb10f28a9eb819eb3eaf9c88fe38661fb1d0f230a8ae68a615c"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:534c8bbdfd033fa20575d57332d9ac0447b5afbeca7db975ba169762ece2051f"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:381a725963c392585135654caa3c7fc32cb1755ed977fb9db72e8838fee261be"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7e4a44b1223980a9880e6f2bbf19121a125928580df9e4e81207199190343e11"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc0ced58ee6d07351cde140a7ec88e5f2ceb053c805af1f90514d21914d21cad"}, + {file = "Levenshtein-0.20.9-cp38-cp38-win32.whl", hash = "sha256:5eec0868ffcd825564dd5e3399305eaa159220554d1aedbff13af0de1fe01f6c"}, + {file = "Levenshtein-0.20.9-cp38-cp38-win_amd64.whl", hash = "sha256:e9db476e40a3aa184631d102b716a019f70837eb0fcdd5b5d1504f099f91359c"}, + {file = "Levenshtein-0.20.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d5a20ecc20a09a32c72128c43d7df23877a2469b3c17780ae83f9a9d55873c08"}, + {file = "Levenshtein-0.20.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b7b772f2f62a19a15ccb1b09c6c7754ca7430bb7e19d4ca4ff232958786873b"}, + {file = "Levenshtein-0.20.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af92326b90ea6fe4521cf6a5dfe450e21150393c573ef3ad9ee446f1009fbfbd"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b48554dad328e198a636f937e2f4c057aac8e4bfcb8467b10e0f5daa94307b17"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82304821e128d5453d1755d1c2f3d9cdf75e9def3517cf913b09df174e20283b"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2052357c5da195ede7dbc81a4e3408ebd6374a1ff1b86a0a9d8b8ce9562b32c3"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d60c6b47ccd6841c990418f7f4f58c28f7da9b07b81eaafc99b836cf351df1"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dc2194c917e4466cb604580b16e42286f04e3fe0424489459e68f0834f5c527"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb1e20965d759d89318cac7ff7eb045eb1fafcb5c3fa3047a23f6ae20c810ad7"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74e959035da10a54e7a2eee28408eff672297ce96cdadd6f4a2f269a06e395c4"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4a441b23d9704f57eb34af6a300ae5c335b9e77e6a065ada36ca69d6fc582af9"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f59470c49114a5da064712a427317f2b1fa5bb89aa2dfd0e300f8289e26aec28"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:06191f5d0527e3224107aea260b5cffc8a78722e0efb4e793f0e45c449b813a2"}, + {file = "Levenshtein-0.20.9-cp39-cp39-win32.whl", hash = "sha256:3235c461904fe94b4f62fee78a1658c1316344411c81b02400c27d692a893f8f"}, + {file = "Levenshtein-0.20.9-cp39-cp39-win_amd64.whl", hash = "sha256:8b852def43d165c2f2b468239d66b847d9e6f52a775fc657773ced04d26062bd"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f674cc75f127692525563155e500a3fa16aaf24dafd33a9bcda46e2979f793a1"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a34e3fd21acb31fcd29a0c8353dca74dfbb59957210a6f142505907a9dff3d59"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0ddddf2beafd1a2e17a87f80be562a7f7478e6098ccfc15de4c879972dfa2f9"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9649af1a896a4a7fc7f6f1fd093e8a92f463297f56c7bd0f8d7d16dfabeb236d"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d7bd7f25336849027fbe5ed32b6ffd404436727d78a014e348dcd17347c73fd8"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0371d996ae81089296f42b6e886c7bf138d1cb0f002b0c724a9e5d689b29b5a0"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7e00e2fda9f225b5f4537647f6195cf220d468532739d3390eaf082b1d76c87"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1600f5ebe2f2aebf13e88cf488ec2e5ce25f7a42b5846335018693baf4ea63bd"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bcd59fcf06aaedda98da185ec289dc2c2c9922ce789f6a9c101709d4a22cac9"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1549e307028fa5c3a8cf28ae8bcb1f6072df2abf7f36b9d7adf7fd60690fe372"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:795f2e95d09a33c66c73cd49be3ee632fb4b8c41be72c0cb8df29a329ce7d111"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:726bfb361d3b6786bea31392752f0ffcca568db7dc3f1e274f1b529489b8ad05"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0fd315132786375de532355fa06b2f11c4b4af5784b7e064dc54b6ee0c3281"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0674bc0549d5ea9edb934b3b03a160a116cc410feb5739a51f9c4f618ee674e3"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1ef8f3ecdfca5d6f0538226338d58617270439a1cc9b6cacb30a388984bb1608"}, + {file = "Levenshtein-0.20.9.tar.gz", hash = "sha256:70a8ad5e28bb76d87da1eb3f31de940836596547d6d01317c2289f5b7cd0b0ea"}, +] + +[package.dependencies] +rapidfuzz = ">=2.3.0,<3.0.0" + +[[package]] +name = "rapidfuzz" +version = "2.15.1" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc0bc259ebe3b93e7ce9df50b3d00e7345335d35acbd735163b7c4b1957074d3"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d59fb3a410d253f50099d7063855c2b95df1ef20ad93ea3a6b84115590899f25"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c525a3da17b6d79d61613096c8683da86e3573e807dfaecf422eea09e82b5ba6"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4deae6a918ecc260d0c4612257be8ba321d8e913ccb43155403842758c46fbe"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2577463d10811386e704a3ab58b903eb4e2a31b24dfd9886d789b0084d614b01"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f67d5f56aa48c0da9de4ab81bffb310683cf7815f05ea38e5aa64f3ba4368339"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7927722ff43690e52b3145b5bd3089151d841d350c6f8378c3cfac91f67573a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6534afc787e32c4104f65cdeb55f6abe4d803a2d0553221d00ef9ce12788dcde"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d0ae6ec79a1931929bb9dd57bc173eb5ba4c7197461bf69e3a34b6dd314feed2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be7ccc45c4d1a7dfb595f260e8022a90c6cb380c2a346ee5aae93f85c96d362b"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:8ba013500a2b68c64b2aecc5fb56a2dad6c2872cf545a0308fd044827b6e5f6a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4d9f7d10065f657f960b48699e7dddfce14ab91af4bab37a215f0722daf0d716"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7e24a1b802cea04160b3fccd75d2d0905065783ebc9de157d83c14fb9e1c6ce2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win32.whl", hash = "sha256:dffdf03499e0a5b3442951bb82b556333b069e0661e80568752786c79c5b32de"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d150d90a7c6caae7962f29f857a4e61d42038cfd82c9df38508daf30c648ae7"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_arm64.whl", hash = "sha256:87c30e9184998ff6eb0fa9221f94282ce7c908fd0da96a1ef66ecadfaaa4cdb7"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6986413cb37035eb796e32f049cbc8c13d8630a4ac1e0484e3e268bb3662bd1b"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a72f26e010d4774b676f36e43c0fc8a2c26659efef4b3be3fd7714d3491e9957"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5cd54c98a387cca111b3b784fc97a4f141244bbc28a92d4bde53f164464112e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7fac7c3da39f93e6b2ebe386ed0ffe1cefec91509b91857f6e1204509e931f"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f976e76ac72f650790b3a5402431612175b2ac0363179446285cb3c901136ca9"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abde47e1595902a490ed14d4338d21c3509156abb2042a99e6da51f928e0c117"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca8f1747007a3ce919739a60fa95c5325f7667cccf6f1c1ef18ae799af119f5e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35da09ab9797b020d0d4f07a66871dfc70ea6566363811090353ea971748b5a"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3a769ca7580686a66046b77df33851b3c2d796dc1eb60c269b68f690f3e1b65"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d50622efefdb03a640a51a6123748cd151d305c1f0431af762e833d6ffef71f0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b7461b0a7651d68bc23f0896bffceea40f62887e5ab8397bf7caa883592ef5cb"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:074ee9e17912e025c72a5780ee4c7c413ea35cd26449719cc399b852d4e42533"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7025fb105a11f503943f17718cdb8241ea3bb4d812c710c609e69bead40e2ff0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win32.whl", hash = "sha256:2084d36b95139413cef25e9487257a1cc892b93bd1481acd2a9656f7a1d9930c"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:5a738fcd24e34bce4b19126b92fdae15482d6d3a90bd687fd3d24ce9d28ce82d"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:dc3cafa68cfa54638632bdcadf9aab89a3d182b4a3f04d2cad7585ed58ea8731"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c53d57ba7a88f7bf304d4ea5a14a0ca112db0e0178fff745d9005acf2879f7d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6ee758eec4cf2215dc8d8eafafcea0d1f48ad4b0135767db1b0f7c5c40a17dd"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d93ba3ae59275e7a3a116dac4ffdb05e9598bf3ee0861fecc5b60fb042d539e"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c3ff75e647908ddbe9aa917fbe39a112d5631171f3fcea5809e2363e525a59d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d89c421702474c6361245b6b199e6e9783febacdbfb6b002669e6cb3ef17a09"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f69e6199fec0f58f9a89afbbaea78d637c7ce77f656a03a1d6ea6abdc1d44f8"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:41dfea282844d0628279b4db2929da0dacb8ac317ddc5dcccc30093cf16357c1"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2dd03477feefeccda07b7659dd614f6738cfc4f9b6779dd61b262a73b0a9a178"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5efe035aa76ff37d1b5fa661de3c4b4944de9ff227a6c0b2e390a95c101814c0"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ed2cf7c69102c7a0a06926d747ed855bc836f52e8d59a5d1e3adfd980d1bd165"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a0e441d4c2025110ec3eba5d54f11f78183269a10152b3a757a739ffd1bb12bf"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win32.whl", hash = "sha256:a4a54efe17cc9f53589c748b53f28776dfdfb9bc83619685740cb7c37985ac2f"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:bb8318116ecac4dfb84841d8b9b461f9bb0c3be5b616418387d104f72d2a16d1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e9296c530e544f68858c3416ad1d982a1854f71e9d2d3dcedb5b216e6d54f067"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:49c4bcdb9238f11f8c4eba1b898937f09b92280d6f900023a8216008f299b41a"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb40a279e134bb3fef099a8b58ed5beefb201033d29bdac005bddcdb004ef71"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7381c11cb590bbd4e6f2d8779a0b34fdd2234dfa13d0211f6aee8ca166d9d05"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfdcdedfd12a0077193f2cf3626ff6722c5a184adf0d2d51f1ec984bf21c23c3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85bece1ec59bda8b982bd719507d468d4df746dfb1988df11d916b5e9fe19e8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b393f4a1eaa6867ffac6aef58cfb04bab2b3d7d8e40b9fe2cf40dd1d384601"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53de456ef020a77bf9d7c6c54860a48e2e902584d55d3001766140ac45c54bc7"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2492330bc38b76ed967eab7bdaea63a89b6ceb254489e2c65c3824efcbf72993"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:099e4c6befaa8957a816bdb67ce664871f10aaec9bebf2f61368cf7e0869a7a1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:46599b2ad4045dd3f794a24a6db1e753d23304699d4984462cf1ead02a51ddf3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:591f19d16758a3c55c9d7a0b786b40d95599a5b244d6eaef79c7a74fcf5104d8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed17359061840eb249f8d833cb213942e8299ffc4f67251a6ed61833a9f2ea20"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win32.whl", hash = "sha256:aa1e5aad325168e29bf8e17006479b97024aa9d2fdbe12062bd2f8f09080acf8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:c2bb68832b140c551dbed691290bef4ee6719d4e8ce1b7226a3736f61a9d1a83"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3fac40972cf7b6c14dded88ae2331eb50dfbc278aa9195473ef6fc6bfe49f686"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0e456cbdc0abf39352800309dab82fd3251179fa0ff6573fa117f51f4e84be8"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:22b9d22022b9d09fd4ece15102270ab9b6a5cfea8b6f6d1965c1df7e3783f5ff"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46754fe404a9a6f5cbf7abe02d74af390038d94c9b8c923b3f362467606bfa28"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91abb8bf7610efe326394adc1d45e1baca8f360e74187f3fa0ef3df80cdd3ba6"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e40a2f60024f9d3c15401e668f732800114a023f3f8d8c40f1521a62081ff054"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a48ee83916401ac73938526d7bd804e01d2a8fe61809df7f1577b0b3b31049a3"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71580052f9dbac443c02f60484e5a2e5f72ad4351b84b2009fbe345b1f38422"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82b86d5b8c1b9bcbc65236d75f81023c78d06a721c3e0229889ff4ed5c858169"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fc4528b7736e5c30bc954022c2cf410889abc19504a023abadbc59cdf9f37cae"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e1e0e569108a5760d8f01d0f2148dd08cc9a39ead79fbefefca9e7c7723c7e88"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94e1c97f0ad45b05003806f8a13efc1fc78983e52fa2ddb00629003acf4676ef"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47e81767a962e41477a85ad7ac937e34d19a7d2a80be65614f008a5ead671c56"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win32.whl", hash = "sha256:79fc574aaf2d7c27ec1022e29c9c18f83cdaf790c71c05779528901e0caad89b"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:f3dd4bcef2d600e0aa121e19e6e62f6f06f22a89f82ef62755e205ce14727874"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_arm64.whl", hash = "sha256:cac095cbdf44bc286339a77214bbca6d4d228c9ebae3da5ff6a80aaeb7c35634"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b89d1126be65c85763d56e3b47d75f1a9b7c5529857b4d572079b9a636eaa8a7"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7460e91168229768be882ea365ba0ac7da43e57f9416e2cfadc396a7df3c2"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c33c03e7092642c38f8a15ca2d8fc38da366f2526ec3b46adf19d5c7aa48ba"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040faca2e26d9dab5541b45ce72b3f6c0e36786234703fc2ac8c6f53bb576743"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6e2a3b23e1e9aa13474b3c710bba770d0dcc34d517d3dd6f97435a32873e3f28"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e597b9dfd6dd180982684840975c458c50d447e46928efe3e0120e4ec6f6686"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d14752c9dd2036c5f36ebe8db5f027275fa7d6b3ec6484158f83efb674bab84e"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558224b6fc6124d13fa32d57876f626a7d6188ba2a97cbaea33a6ee38a867e31"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c89cfa88dc16fd8c9bcc0c7f0b0073f7ef1e27cceb246c9f5a3f7004fa97c4d"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:509c5b631cd64df69f0f011893983eb15b8be087a55bad72f3d616b6ae6a0f96"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f73a04135a03a6e40393ecd5d46a7a1049d353fc5c24b82849830d09817991f"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99d53138a2dfe8ada67cb2855719f934af2733d726fbf73247844ce4dd6dd5"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f01fa757f0fb332a1f045168d29b0d005de6c39ee5ce5d6c51f2563bb53c601b"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60368e1add6e550faae65614844c43f8a96e37bf99404643b648bf2dba92c0fb"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785744f1270828cc632c5a3660409dee9bcaac6931a081bae57542c93e4d46c4"}, + {file = "rapidfuzz-2.15.1.tar.gz", hash = "sha256:d62137c2ca37aea90a11003ad7dc109c8f1739bfbe5a9a217f3cdb07d7ac00f6"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "textwrap3" +version = "0.9.2" +description = "textwrap from Python 3.6 backport (plus a few tweaks)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "textwrap3-0.9.2-py2.py3-none-any.whl", hash = "sha256:bf5f4c40faf2a9ff00a9e0791fed5da7415481054cef45bb4a3cfb1f69044ae0"}, + {file = "textwrap3-0.9.2.zip", hash = "sha256:5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414"}, +] + +[[package]] +name = "watchdog" +version = "2.3.1" +description = "Filesystem events monitoring" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, + {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, + {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, + {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, + {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, + {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, + {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, + {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, + {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, + {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.7" +content-hash = "f48df5c526c5e9e9b6c8dd83bb06b628c347f616a66670800e3032a83ba50c08" diff --git a/tools/asm-differ/pyproject.toml b/tools/asm-differ/pyproject.toml new file mode 100644 index 0000000..7a112ae --- /dev/null +++ b/tools/asm-differ/pyproject.toml @@ -0,0 +1,21 @@ +[tool.poetry] +name = "asm-differ" +version = "0.1.0" +description = "" +authors = ["Simon Lindholm "] +license = "UNLICENSE" +readme = "README.md" +packages = [{ include = "diff.py" }] + +[tool.poetry.dependencies] +python = "^3.7" +colorama = "^0.4.6" +ansiwrap = "^0.8.4" +watchdog = "^2.2.0" +levenshtein = "^0.20.9" +cxxfilt = "^0.3.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/tools/asm-differ/screenshot.png b/tools/asm-differ/screenshot.png new file mode 100644 index 0000000..3230555 Binary files /dev/null and b/tools/asm-differ/screenshot.png differ diff --git a/tools/asm-differ/test.py b/tools/asm-differ/test.py new file mode 100644 index 0000000..c0c2a9c --- /dev/null +++ b/tools/asm-differ/test.py @@ -0,0 +1,185 @@ +import unittest +import diff +import json + +class TestSh2(unittest.TestCase): + def get_config(self): + arch = diff.get_arch('sh2') + formatter = diff.JsonFormatter(arch_str='sh2') + config = diff.Config( + arch=arch, + diff_obj=True, + objfile='', + make=False, + source_old_binutils=True, + diff_section='.text', + inlines=False, + max_function_size_lines=25000, + max_function_size_bytes=100000, + formatter=formatter, + diff_mode=diff.DiffMode.NORMAL, + base_shift=0, + skip_lines=0, + compress=None, + show_rodata_refs=True, + show_branches=True, + show_line_numbers=False, + show_source=False, + stop_at_ret=False, + ignore_large_imms=False, + ignore_addr_diffs=True, + algorithm='levenshtein', + reg_categories={}) + return config + + # check that comment <> regex has ? to avoid ",r1 ! 60e87d0" + # all being a comment for: + # mov.l 44 ,r1 ! 60e87d0 + def test_sh2_comment(self): + # parser specifically looks for tabs so make sure they are represented + + # 16: d1 0b mov.l 44 ,r1 ! 60e87d0 + sh2_theirs = " 16:\td1 0b \tmov.l\t44 ,r1\t! 60e87d0\n" + + # 16: d1 0b mov.l 44 <_func_060E8780+0x44>,r1 ! 0 <_func_060E8780> + sh2_ours = " 16:\td1 0b \tmov.l\t44 <_func_060E8780+0x44>,r1\t! 0 <_func_060E8780>\n" + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + curr = loaded['rows'][0]['current']['src_comment'] + + assert(curr != "<_func_060E8780+0x44>,r1 ! 0 <_func_060E8780>") + assert(curr == "<_func_060E8780+0x44>") + + def test_sh2_immediates(self): + # test parsing these immediates + # func_0606B760(): + # 0: ec 01 mov #1,r12 + # 2: 71 01 add #1,r1 + # 4: ec ff mov #-1,r12 + # 6: 71 ff add #-1,r1 + # 8: ec 7f mov #127,r12 + # a: 71 7f add #127,r1 + # c: ec 80 mov #-128,r12 + # e: 71 80 add #-128,r1 + sh2_theirs = 'func_0606B760():\n 0:\tec 01 \tmov\t#1,r12\n 2:\t71 01 \tadd\t#1,r1\n 4:\tec ff \tmov\t#-1,r12\n 6:\t71 ff \tadd\t#-1,r1\n 8:\tec 7f \tmov\t#127,r12\n a:\t71 7f \tadd\t#127,r1\n c:\tec 80 \tmov\t#-128,r12\n e:\t71 80 \tadd\t#-128,r1' + + # just diff with self + sh2_ours = sh2_theirs + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + expected = [ + "0: mov #0x1,r12", + "2: add #0x1,r1", + "4: mov #0xff,r12", + "6: add #0xff,r1", + "8: mov #0x7f,r12", + "a: add #0x7f,r1", + "c: mov #0x80,r12", + "e: add #0x80,r1" + ] + + i = 0 + for text in loaded['rows']: + assert(text['base']['text'][0]['text'] == expected[i]) + i += 1 + + def test_more_sh2_immediates(self): + # test that the re_int regex is able to catch all these "boundary" numbers + # since we have to match 0-9 one digit at a time + # 0: 71 00 add #0,r1 + # 2: 71 01 add #1,r1 + # 4: 71 09 add #9,r1 + # 6: 71 0a add #10,r1 + # 8: 71 0b add #11,r1 + # a: 71 13 add #19,r1 + # c: 71 64 add #100,r1 + # e: 71 65 add #101,r1 + # 10: 71 6d add #109,r1 + # 12: 71 6f add #111,r1 + # 14: 71 77 add #119,r1 + # 16: 71 f7 add #-9,r1 + # 18: 71 f6 add #-10,r1 + # 1a: 71 f5 add #-11,r1 + # 1c: 71 ed add #-19,r1 + # 1e: 71 9c add #-100,r1 + # 20: 71 9b add #-101,r1 + # 22: 71 93 add #-109,r1 + # 24: 71 91 add #-111,r1 + # 26: 71 89 add #-119,r1 + sh2_theirs = 'func_0606B760():\n 0:\t71 00 \tadd\t#0,r1\n 2:\t71 01 \tadd\t#1,r1\n 4:\t71 09 \tadd\t#9,r1\n 6:\t71 0a \tadd\t#10,r1\n 8:\t71 0b \tadd\t#11,r1\n a:\t71 13 \tadd\t#19,r1\n c:\t71 64 \tadd\t#100,r1\n e:\t71 65 \tadd\t#101,r1\n 10:\t71 6d \tadd\t#109,r1\n 12:\t71 6f \tadd\t#111,r1\n 14:\t71 77 \tadd\t#119,r1\n 16:\t71 f7 \tadd\t#-9,r1\n 18:\t71 f6 \tadd\t#-10,r1\n 1a:\t71 f5 \tadd\t#-11,r1\n 1c:\t71 ed \tadd\t#-19,r1\n 1e:\t71 9c \tadd\t#-100,r1\n 20:\t71 9b \tadd\t#-101,r1\n 22:\t71 93 \tadd\t#-109,r1\n 24:\t71 91 \tadd\t#-111,r1\n 26:\t71 89 \tadd\t#-119,r1' + + # just diff with self + sh2_ours = sh2_theirs + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + expected = [ + "0: add #0x0,r1", + "2: add #0x1,r1", + "4: add #0x9,r1", + "6: add #0xa,r1", + "8: add #0xb,r1", + "a: add #0x13,r1", + "c: add #0x64,r1", + "e: add #0x65,r1", + "10: add #0x6d,r1", + "12: add #0x6f,r1", + "14: add #0x77,r1", + "16: add #0xf7,r1", + "18: add #0xf6,r1", + "1a: add #0xf5,r1", + "1c: add #0xed,r1", + "1e: add #0x9c,r1", + "20: add #0x9b,r1", + "22: add #0x93,r1", + "24: add #0x91,r1", + "26: add #0x89,r1" + ] + + i = 0 + for text in loaded['rows']: + assert(text['base']['text'][0]['text'] == expected[i]) + i += 1 + + def test_branch(self): + # test that bt.s and bra get ~> + # func(): + # 0: 8d 02 bt.s 8 + # 2: 6e f3 mov r15,r14 + # 4: a0 01 bra a + # 6: 00 09 nop + + # 00000008 : + # lab_0606B780(): + # 8: db 32 mov.l d4 ,r11 + + # 0000000a : + # lab_0606B8E0(): + # a: 00 0b rts + # c: 00 09 nop + sh2_theirs = 'func():\n 0:\t8d 02 \tbt.s\t8 \n 2:\t6e f3 \tmov\tr15,r14\n 4:\ta0 01 \tbra\ta \n 6:\t00 09 \tnop\t\n\n00000008 :\nlab_0606B780():\n 8:\tdb 32 \tmov.l\td4 ,r11\n\n0000000a :\nlab_0606B8E0():\n a:\t00 0b \trts\t\n c:\t00 09 \tnop\t' + sh2_ours = sh2_theirs + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + # bt.s 8 + print(loaded['rows'][0]['base']['text'][1]['text'] == '~>') + print(loaded['rows'][0]['base']['text'][1]['key'] == '8') + + # bra a + print(loaded['rows'][2]['base']['text'][1]['text'] == '~>') + print(loaded['rows'][2]['base']['text'][1]['key'] == '10') + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/asm-processor/.gitignore b/tools/asm-processor/.gitignore new file mode 100644 index 0000000..cc5bba4 --- /dev/null +++ b/tools/asm-processor/.gitignore @@ -0,0 +1,2 @@ +*.o +*.py[cod] diff --git a/tools/asm-processor/.gitrepo b/tools/asm-processor/.gitrepo new file mode 100644 index 0000000..fd4c97a --- /dev/null +++ b/tools/asm-processor/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = git@github.com:simonlindholm/asm-processor.git + branch = main + commit = 6dd4d3adcbfb3ee607b9a1e2bba3502d27217d44 + parent = 39a2e453bb882b2498c7c4aa9073a9f85d048f0c + method = merge + cmdver = 0.4.3 diff --git a/tools/asm-processor/LICENSE b/tools/asm-processor/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/tools/asm-processor/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/tools/asm-processor/README.md b/tools/asm-processor/README.md new file mode 100644 index 0000000..009147c --- /dev/null +++ b/tools/asm-processor/README.md @@ -0,0 +1,112 @@ +# asm-processor + +Pre-process .c files and post-process .o files to enable embedding MIPS assembly into IDO-compiled C. + +## Usage + +Let's say you have a file compiled with `-g` on the IDO compiler, that looks like this: +```c +float func4(void) { + "func4"; + return 0.2f; +} +``` + +This script enables replacing it by: +```asm +GLOBAL_ASM( +.rdata +.word 0x66756e63 # func +.word 0x34000000 # 4\0\0\0 + +.late_rodata +glabel rv +.word 0x3e4ccccd # 0.2f + +.text +glabel func4 +lui $at, %hi(rv) +jr $ra +lwc1 $f0, %lo(rv)($at) +jr $ra +nop +jr $ra +nop +) +``` + +To compile the file, run `python3 build.py $CC -- $AS $ASFLAGS -- $CFLAGS -o out.o in.c`, where $CC points to an IDO binary (5.3/7.1 and recomp/qemu all supported), $AS is e.g. `mips-linux-gnu-as`, $ASFLAGS e.g. `-march=vr4300 -mabi=32` and $CFLAGS e.g. `-Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -g`. build.py may be customized as needed. + +In addition to an .o file, build.py also generates a .d file with Makefile dependencies for .s files referenced by the input .c file. +This functionality may be removed if not needed. + +Reading assembly from file is also supported, by either `GLOBAL_ASM("file.s")` or `#pragma GLOBAL_ASM("file.s")`. + +### What is supported? + +`.text`, `.data`, `.bss` and `.rodata` sections, `.word`/`.incbin`, `.ascii`/`.asciz`, and `-g`, `-g3`, `-O1`, `-O2`, `-framepointer` and `-mips1`/`-mips2` flags to the IDO compiler. + +### What is not supported? + +* complicated assembly (.ifdef, macro declarations/calls other than `glabel`, pseudo-instructions that expand to several real instructions) +* non-IDO compilers +* `-O3` (due to function reordering) + +C `#ifdef`s only work outside of `GLOBAL_ASM` calls, but is otherwise able to replace `.ifdef`. + +### What's up with "late rodata"? + +The IDO compiler emits rodata in two passes: first array/string contents, then large literals/switch jump tables. + +Data declared within `.rdata`/`.section .rodata` will end up in the first half, and `.late_rodata`/`.section .late_rodata` in the second half. + +### How does it work? + +It's a bit of a hack! +The basic idea is replace `GLOBAL_ASM` blocks with dummy C functions/global vars of the same sections sizes as the assembly. +Then the C file gets compiled, and the dummy contents overwritten with the injected assembly. + +To accomplish this, asm-processor has logic for guessing the size of assembly contents +(which assumes the assembly isn't too complicated, e.g. no macros), +and for emitting C code of exact sizes for a bunch of different IDO compiler flags. + +The assembler code is padded with nops to line it up with its correct position in the C; +this allows C and asm ELF files to be merged easily without having to fix up e.g. symbol addresses. + +The most difficult part is `late_rodata`, which is hard to create programmatically. +asm-processor does that by emitting code that uses dummy float literals/double literals/jump tables, +assembles the late_rodata at another location of the .rodata section, then overwrites the dummy rodata. +This does require some movement of symbols and relocations, and quite a bit of care in what code to +emit and how to preserve .double alignment. + +It's worth noting some alternative ways in which asm-processor would have been implemented: +- One idea to get rid of the C/asm size estimations is to emit arbitrary code, and then move code, +symbols and relocations to the correct place after the sizes are known. +Given the machinery for `late_rodata` this wouldn't have been too difficult, and it would have the upside of improved portability. +There is a big downside, however: using dummy code of incorrect size throws off alignment and can introduce unintended padding. +Fixing this would require running multiple passes of asm-processor, with one compile per `ASM_GLOBAL`. +- Another idea is to run the compiler with -S to emit assembly, modify the emitted assembly, then run the assembler +(which in IDO's case may perform additional instruction reordering etc.). +This option has not been investigated in much detail, and would perhaps be superior to the current implementation. +It does have a few unknowns to it, e.g. instruction encoding differences between GNU `as` and IDO's assembler, +how to avoid reordering the injected assembly, and how .rodata/.late_rodata are implemented. + +### Testing + +There are a few tests to ensure you don't break anything when hacking on asm-processor: `./run-tests.sh` should exit without output if they pass, or else output a diff from previous to new version. + +Tests need the environment variable `MIPS_CC` set to point to the IDO 7.1 compiler, with Pascal support enabled. + +For example if asm-processor is cloned in the same directory as [ido static recomp](https://github.com/decompals/ido-static-recomp) and the working directory is asm-processor, tests can be run using: + +```sh +MIPS_CC=../ido-static-recomp/build/7.1/out/cc ./run-tests.sh +``` + +Or using [qemu-irix](https://github.com/zeldaret/oot/releases/tag/0.1q) (don't forget `chmod u+x qemu-irix`) to emulate IDO: + +```sh +MIPS_CC='./qemu-irix -silent -L ../ido-static-recomp/ido/7.1/ ../ido-static-recomp/ido/7.1/usr/bin/cc' ./run-tests.sh +``` + +To skip running Pascal tests, remove the `tests/*.p` glob from `run-tests.sh`. diff --git a/tools/asm-processor/add-test.sh b/tools/asm-processor/add-test.sh new file mode 100755 index 0000000..708548e --- /dev/null +++ b/tools/asm-processor/add-test.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +for A in "$@"; do + OBJDUMPFLAGS="-srt" + ./compile-test.sh "$A" && mips-linux-gnu-objdump $OBJDUMPFLAGS "${A%.*}.o" > "${A%.*}.objdump" +done diff --git a/tools/asm-processor/asm_processor.py b/tools/asm-processor/asm_processor.py new file mode 100644 index 0000000..23f6102 --- /dev/null +++ b/tools/asm-processor/asm_processor.py @@ -0,0 +1,1477 @@ +#!/usr/bin/env python3 +import argparse +import tempfile +import struct +import copy +import sys +import re +import os +from collections import namedtuple +from io import StringIO + +MAX_FN_SIZE = 100 +SLOW_CHECKS = False + +EI_NIDENT = 16 +EI_CLASS = 4 +EI_DATA = 5 +EI_VERSION = 6 +EI_OSABI = 7 +EI_ABIVERSION = 8 +STN_UNDEF = 0 + +SHN_UNDEF = 0 +SHN_ABS = 0xfff1 +SHN_COMMON = 0xfff2 +SHN_XINDEX = 0xffff +SHN_LORESERVE = 0xff00 + +STT_NOTYPE = 0 +STT_OBJECT = 1 +STT_FUNC = 2 +STT_SECTION = 3 +STT_FILE = 4 +STT_COMMON = 5 +STT_TLS = 6 + +STB_LOCAL = 0 +STB_GLOBAL = 1 +STB_WEAK = 2 + +STV_DEFAULT = 0 +STV_INTERNAL = 1 +STV_HIDDEN = 2 +STV_PROTECTED = 3 + +SHT_NULL = 0 +SHT_PROGBITS = 1 +SHT_SYMTAB = 2 +SHT_STRTAB = 3 +SHT_RELA = 4 +SHT_HASH = 5 +SHT_DYNAMIC = 6 +SHT_NOTE = 7 +SHT_NOBITS = 8 +SHT_REL = 9 +SHT_SHLIB = 10 +SHT_DYNSYM = 11 +SHT_INIT_ARRAY = 14 +SHT_FINI_ARRAY = 15 +SHT_PREINIT_ARRAY = 16 +SHT_GROUP = 17 +SHT_SYMTAB_SHNDX = 18 +SHT_MIPS_GPTAB = 0x70000003 +SHT_MIPS_DEBUG = 0x70000005 +SHT_MIPS_REGINFO = 0x70000006 +SHT_MIPS_OPTIONS = 0x7000000d + +SHF_WRITE = 0x1 +SHF_ALLOC = 0x2 +SHF_EXECINSTR = 0x4 +SHF_MERGE = 0x10 +SHF_STRINGS = 0x20 +SHF_INFO_LINK = 0x40 +SHF_LINK_ORDER = 0x80 +SHF_OS_NONCONFORMING = 0x100 +SHF_GROUP = 0x200 +SHF_TLS = 0x400 + +R_MIPS_32 = 2 +R_MIPS_26 = 4 +R_MIPS_HI16 = 5 +R_MIPS_LO16 = 6 + +MIPS_DEBUG_ST_STATIC = 2 +MIPS_DEBUG_ST_STATIC_PROC = 14 + + +class ElfFormat: + def __init__(self, is_big_endian): + self.is_big_endian = is_big_endian + self.struct_char = ">" if is_big_endian else "<" + + def pack(self, fmt, *args): + return struct.pack(self.struct_char + fmt, *args) + + def unpack(self, fmt, data): + return struct.unpack(self.struct_char + fmt, data) + + +class ElfHeader: + """ + typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; + } Elf32_Ehdr; + """ + + def __init__(self, data): + self.e_ident = data[:EI_NIDENT] + assert self.e_ident[EI_CLASS] == 1 # 32-bit + self.fmt = ElfFormat(is_big_endian=(self.e_ident[EI_DATA] == 2)) + self.e_type, self.e_machine, self.e_version, self.e_entry, self.e_phoff, self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx = self.fmt.unpack('HHIIIIIHHHHHH', data[EI_NIDENT:]) + assert self.e_type == 1 # relocatable + assert self.e_machine == 8 # MIPS I Architecture + assert self.e_phoff == 0 # no program header + assert self.e_shoff != 0 # section header + assert self.e_shstrndx != SHN_UNDEF + + def to_bin(self): + return self.e_ident + self.fmt.pack('HHIIIIIHHHHHH', self.e_type, + self.e_machine, self.e_version, self.e_entry, self.e_phoff, + self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, + self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx) + + +class Symbol: + """ + typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Half st_shndx; + } Elf32_Sym; + """ + + def __init__(self, fmt, data, strtab, name=None): + self.fmt = fmt + self.st_name, self.st_value, self.st_size, st_info, self.st_other, self.st_shndx = fmt.unpack('IIIBBH', data) + assert self.st_shndx != SHN_XINDEX, "too many sections (SHN_XINDEX not supported)" + self.bind = st_info >> 4 + self.type = st_info & 15 + self.name = name if name is not None else strtab.lookup_str(self.st_name) + self.visibility = self.st_other & 3 + + @staticmethod + def from_parts(fmt, st_name, st_value, st_size, st_info, st_other, st_shndx, strtab, name): + header = fmt.pack('IIIBBH', st_name, st_value, st_size, st_info, st_other, st_shndx) + return Symbol(fmt, header, strtab, name) + + def to_bin(self): + st_info = (self.bind << 4) | self.type + return self.fmt.pack('IIIBBH', self.st_name, self.st_value, self.st_size, st_info, self.st_other, self.st_shndx) + + +class Relocation: + def __init__(self, fmt, data, sh_type): + self.fmt = fmt + self.sh_type = sh_type + if sh_type == SHT_REL: + self.r_offset, self.r_info = fmt.unpack('II', data) + else: + self.r_offset, self.r_info, self.r_addend = fmt.unpack('III', data) + self.sym_index = self.r_info >> 8 + self.rel_type = self.r_info & 0xff + + def to_bin(self): + self.r_info = (self.sym_index << 8) | self.rel_type + if self.sh_type == SHT_REL: + return self.fmt.pack('II', self.r_offset, self.r_info) + else: + return self.fmt.pack('III', self.r_offset, self.r_info, self.r_addend) + + +class Section: + """ + typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; + } Elf32_Shdr; + """ + + def __init__(self, fmt, header, data, index): + self.fmt = fmt + self.sh_name, self.sh_type, self.sh_flags, self.sh_addr, self.sh_offset, self.sh_size, self.sh_link, self.sh_info, self.sh_addralign, self.sh_entsize = fmt.unpack('IIIIIIIIII', header) + assert not self.sh_flags & SHF_LINK_ORDER + if self.sh_entsize != 0: + assert self.sh_size % self.sh_entsize == 0 + if self.sh_type == SHT_NOBITS: + self.data = b'' + else: + self.data = data[self.sh_offset:self.sh_offset + self.sh_size] + self.index = index + self.relocated_by = [] + + @staticmethod + def from_parts(fmt, sh_name, sh_type, sh_flags, sh_link, sh_info, sh_addralign, sh_entsize, data, index): + header = fmt.pack('IIIIIIIIII', sh_name, sh_type, sh_flags, 0, 0, len(data), sh_link, sh_info, sh_addralign, sh_entsize) + return Section(fmt, header, data, index) + + def lookup_str(self, index): + assert self.sh_type == SHT_STRTAB + to = self.data.find(b'\0', index) + assert to != -1 + return self.data[index:to].decode('latin1') + + def add_str(self, string): + assert self.sh_type == SHT_STRTAB + ret = len(self.data) + self.data += string.encode('latin1') + b'\0' + return ret + + def is_rel(self): + return self.sh_type == SHT_REL or self.sh_type == SHT_RELA + + def header_to_bin(self): + if self.sh_type != SHT_NOBITS: + self.sh_size = len(self.data) + return self.fmt.pack('IIIIIIIIII', self.sh_name, self.sh_type, self.sh_flags, self.sh_addr, self.sh_offset, self.sh_size, self.sh_link, self.sh_info, self.sh_addralign, self.sh_entsize) + + def late_init(self, sections): + if self.sh_type == SHT_SYMTAB: + self.init_symbols(sections) + elif self.is_rel(): + self.rel_target = sections[self.sh_info] + self.rel_target.relocated_by.append(self) + self.init_relocs() + + def find_symbol(self, name): + assert self.sh_type == SHT_SYMTAB + for s in self.symbol_entries: + if s.name == name: + return (s.st_shndx, s.st_value) + return None + + def find_symbol_in_section(self, name, section): + pos = self.find_symbol(name) + assert pos is not None + assert pos[0] == section.index + return pos[1] + + def init_symbols(self, sections): + assert self.sh_type == SHT_SYMTAB + assert self.sh_entsize == 16 + self.strtab = sections[self.sh_link] + entries = [] + for i in range(0, self.sh_size, self.sh_entsize): + entries.append(Symbol(self.fmt, self.data[i:i+self.sh_entsize], self.strtab)) + self.symbol_entries = entries + + def init_relocs(self): + assert self.is_rel() + entries = [] + for i in range(0, self.sh_size, self.sh_entsize): + entries.append(Relocation(self.fmt, self.data[i:i+self.sh_entsize], self.sh_type)) + self.relocations = entries + + def local_symbols(self): + assert self.sh_type == SHT_SYMTAB + return self.symbol_entries[:self.sh_info] + + def global_symbols(self): + assert self.sh_type == SHT_SYMTAB + return self.symbol_entries[self.sh_info:] + + def relocate_mdebug(self, original_offset): + assert self.sh_type == SHT_MIPS_DEBUG + new_data = bytearray(self.data) + shift_by = self.sh_offset - original_offset + + # Update the file-relative offsets in the Symbolic HDRR + hdrr_magic, hdrr_vstamp, hdrr_ilineMax, hdrr_cbLine, \ + hdrr_cbLineOffset, hdrr_idnMax, hdrr_cbDnOffset, hdrr_ipdMax, \ + hdrr_cbPdOffset, hdrr_isymMax, hdrr_cbSymOffset, hdrr_ioptMax, \ + hdrr_cbOptOffset, hdrr_iauxMax, hdrr_cbAuxOffset, hdrr_issMax, \ + hdrr_cbSsOffset, hdrr_issExtMax, hdrr_cbSsExtOffset, hdrr_ifdMax, \ + hdrr_cbFdOffset, hdrr_crfd, hdrr_cbRfdOffset, hdrr_iextMax, \ + hdrr_cbExtOffset = self.fmt.unpack("HHIIIIIIIIIIIIIIIIIIIIIII", self.data[0:0x60]) + + assert hdrr_magic == 0x7009, "Invalid magic value for .mdebug symbolic header" + + hdrr_cbLineOffset += shift_by + hdrr_cbDnOffset += shift_by + hdrr_cbPdOffset += shift_by + hdrr_cbSymOffset += shift_by + hdrr_cbOptOffset += shift_by + hdrr_cbAuxOffset += shift_by + hdrr_cbSsOffset += shift_by + hdrr_cbSsExtOffset += shift_by + hdrr_cbFdOffset += shift_by + hdrr_cbRfdOffset += shift_by + hdrr_cbExtOffset += shift_by + + new_data[0:0x60] = self.fmt.pack("HHIIIIIIIIIIIIIIIIIIIIIII", hdrr_magic, hdrr_vstamp, hdrr_ilineMax, hdrr_cbLine, \ + hdrr_cbLineOffset, hdrr_idnMax, hdrr_cbDnOffset, hdrr_ipdMax, \ + hdrr_cbPdOffset, hdrr_isymMax, hdrr_cbSymOffset, hdrr_ioptMax, \ + hdrr_cbOptOffset, hdrr_iauxMax, hdrr_cbAuxOffset, hdrr_issMax, \ + hdrr_cbSsOffset, hdrr_issExtMax, hdrr_cbSsExtOffset, hdrr_ifdMax, \ + hdrr_cbFdOffset, hdrr_crfd, hdrr_cbRfdOffset, hdrr_iextMax, \ + hdrr_cbExtOffset) + + self.data = bytes(new_data) + +class ElfFile: + def __init__(self, data): + self.data = data + assert data[:4] == b'\x7fELF', "not an ELF file" + + self.elf_header = ElfHeader(data[0:52]) + self.fmt = self.elf_header.fmt + + offset, size = self.elf_header.e_shoff, self.elf_header.e_shentsize + null_section = Section(self.fmt, data[offset:offset + size], data, 0) + num_sections = self.elf_header.e_shnum or null_section.sh_size + + self.sections = [null_section] + for i in range(1, num_sections): + ind = offset + i * size + self.sections.append(Section(self.fmt, data[ind:ind + size], data, i)) + + symtab = None + for s in self.sections: + if s.sh_type == SHT_SYMTAB: + assert not symtab + symtab = s + assert symtab is not None + self.symtab = symtab + + shstr = self.sections[self.elf_header.e_shstrndx] + for s in self.sections: + s.name = shstr.lookup_str(s.sh_name) + s.late_init(self.sections) + + def find_section(self, name): + for s in self.sections: + if s.name == name: + return s + return None + + def add_section(self, name, sh_type, sh_flags, sh_link, sh_info, sh_addralign, sh_entsize, data): + shstr = self.sections[self.elf_header.e_shstrndx] + sh_name = shstr.add_str(name) + s = Section.from_parts(self.fmt, sh_name=sh_name, sh_type=sh_type, + sh_flags=sh_flags, sh_link=sh_link, sh_info=sh_info, + sh_addralign=sh_addralign, sh_entsize=sh_entsize, data=data, + index=len(self.sections)) + self.sections.append(s) + s.name = name + s.late_init(self.sections) + return s + + def drop_mdebug_gptab(self): + # We can only drop sections at the end, since otherwise section + # references might be wrong. Luckily, these sections typically are. + while self.sections[-1].sh_type in [SHT_MIPS_DEBUG, SHT_MIPS_GPTAB]: + self.sections.pop() + + def write(self, filename): + outfile = open(filename, 'wb') + outidx = 0 + def write_out(data): + nonlocal outidx + outfile.write(data) + outidx += len(data) + def pad_out(align): + if align and outidx % align: + write_out(b'\0' * (align - outidx % align)) + + self.elf_header.e_shnum = len(self.sections) + write_out(self.elf_header.to_bin()) + + for s in self.sections: + if s.sh_type != SHT_NOBITS and s.sh_type != SHT_NULL: + pad_out(s.sh_addralign) + old_offset = s.sh_offset + s.sh_offset = outidx + if s.sh_type == SHT_MIPS_DEBUG and s.sh_offset != old_offset: + # The .mdebug section has moved, relocate offsets + s.relocate_mdebug(old_offset) + write_out(s.data) + + pad_out(4) + self.elf_header.e_shoff = outidx + for s in self.sections: + write_out(s.header_to_bin()) + + outfile.seek(0) + outfile.write(self.elf_header.to_bin()) + outfile.close() + + +def is_temp_name(name): + return name.startswith('_asmpp_') + + +# https://stackoverflow.com/a/241506 +def re_comment_replacer(match): + s = match.group(0) + if s[0] in "/#": + return " " + else: + return s + + +re_comment_or_string = re.compile( + r'#.*|/\*.*?\*/|"(?:\\.|[^\\"])*"' +) + + +class Failure(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + + +class GlobalState: + def __init__(self, min_instr_count, skip_instr_count, use_jtbl_for_rodata, prelude_if_late_rodata, mips1, pascal): + # A value that hopefully never appears as a 32-bit rodata constant (or we + # miscompile late rodata). Increases by 1 in each step. + self.late_rodata_hex = 0xE0123456 + self.valuectr = 0 + self.namectr = 0 + self.min_instr_count = min_instr_count + self.skip_instr_count = skip_instr_count + self.use_jtbl_for_rodata = use_jtbl_for_rodata + self.prelude_if_late_rodata = prelude_if_late_rodata + self.mips1 = mips1 + self.pascal = pascal + + def next_late_rodata_hex(self): + dummy_bytes = struct.pack('>I', self.late_rodata_hex) + if (self.late_rodata_hex & 0xffff) == 0: + # Avoid lui + self.late_rodata_hex += 1 + self.late_rodata_hex += 1 + return dummy_bytes + + def make_name(self, cat): + self.namectr += 1 + return '_asmpp_{}{}'.format(cat, self.namectr) + + def func_prologue(self, name): + if self.pascal: + return " ".join([ + "procedure {}();".format(name), + "type", + " pi = ^integer;", + " pf = ^single;", + " pd = ^double;", + "var", + " vi: pi;", + " vf: pf;", + " vd: pd;", + "begin", + " vi := vi;", + " vf := vf;", + " vd := vd;", + ]) + else: + return 'void {}(void) {{'.format(name) + + def func_epilogue(self): + if self.pascal: + return "end;" + else: + return "}" + + def pascal_assignment(self, tp, val): + self.valuectr += 1 + address = (8 * self.valuectr) & 0x7FFF + return 'v{} := p{}({}); v{}^ := {};'.format(tp, tp, address, tp, val) + +Function = namedtuple('Function', ['text_glabels', 'asm_conts', 'late_rodata_dummy_bytes', 'jtbl_rodata_size', 'late_rodata_asm_conts', 'fn_desc', 'data']) + + +class GlobalAsmBlock: + def __init__(self, fn_desc): + self.fn_desc = fn_desc + self.cur_section = '.text' + self.asm_conts = [] + self.late_rodata_asm_conts = [] + self.late_rodata_alignment = 0 + self.late_rodata_alignment_from_content = False + self.text_glabels = [] + self.fn_section_sizes = { + '.text': 0, + '.data': 0, + '.bss': 0, + '.rodata': 0, + '.late_rodata': 0, + } + self.fn_ins_inds = [] + self.glued_line = '' + self.num_lines = 0 + + def fail(self, message, line=None): + context = self.fn_desc + if line: + context += ", at line \"" + line + "\"" + raise Failure(message + "\nwithin " + context) + + def count_quoted_size(self, line, z, real_line, output_enc): + line = line.encode(output_enc).decode('latin1') + in_quote = False + has_comma = True + num_parts = 0 + ret = 0 + i = 0 + digits = "0123456789" # 0-7 would be more sane, but this matches GNU as + while i < len(line): + c = line[i] + i += 1 + if not in_quote: + if c == '"': + in_quote = True + if z and not has_comma: + self.fail(".asciiz with glued strings is not supported due to GNU as version diffs") + num_parts += 1 + elif c == ',': + has_comma = True + else: + if c == '"': + in_quote = False + has_comma = False + continue + ret += 1 + if c != '\\': + continue + if i == len(line): + self.fail("backslash at end of line not supported", real_line) + c = line[i] + i += 1 + # (if c is in "bfnrtv", we have a real escaped literal) + if c == 'x': + # hex literal, consume any number of hex chars, possibly none + while i < len(line) and line[i] in digits + "abcdefABCDEF": + i += 1 + elif c in digits: + # octal literal, consume up to two more digits + it = 0 + while i < len(line) and line[i] in digits and it < 2: + i += 1 + it += 1 + + if in_quote: + self.fail("unterminated string literal", real_line) + if num_parts == 0: + self.fail(".ascii with no string", real_line) + return ret + num_parts if z else ret + + def align2(self): + while self.fn_section_sizes[self.cur_section] % 2 != 0: + self.fn_section_sizes[self.cur_section] += 1 + + def align4(self): + while self.fn_section_sizes[self.cur_section] % 4 != 0: + self.fn_section_sizes[self.cur_section] += 1 + + def add_sized(self, size, line): + if self.cur_section in ['.text', '.late_rodata']: + if size % 4 != 0: + self.fail("size must be a multiple of 4", line) + if size < 0: + self.fail("size cannot be negative", line) + self.fn_section_sizes[self.cur_section] += size + if self.cur_section == '.text': + if not self.text_glabels: + self.fail(".text block without an initial glabel", line) + self.fn_ins_inds.append((self.num_lines - 1, size // 4)) + + def process_line(self, line, output_enc): + self.num_lines += 1 + if line.endswith('\\'): + self.glued_line += line[:-1] + return + line = self.glued_line + line + self.glued_line = '' + + real_line = line + line = re.sub(re_comment_or_string, re_comment_replacer, line) + line = line.strip() + line = re.sub(r'^[a-zA-Z0-9_]+:\s*', '', line) + changed_section = False + emitting_double = False + if (line.startswith('glabel ') or line.startswith('jlabel ')) and self.cur_section == '.text': + self.text_glabels.append(line.split()[1]) + if not line: + pass # empty line + elif line.startswith('glabel ') or line.startswith('dlabel ') or line.startswith('jlabel ') or line.startswith('endlabel ') or (' ' not in line and line.endswith(':')): + pass # label + elif line.startswith('.section') or line in ['.text', '.data', '.rdata', '.rodata', '.bss', '.late_rodata']: + # section change + self.cur_section = '.rodata' if line == '.rdata' else line.split(',')[0].split()[-1] + if self.cur_section not in ['.data', '.text', '.rodata', '.late_rodata', '.bss']: + self.fail("unrecognized .section directive", real_line) + changed_section = True + elif line.startswith('.late_rodata_alignment'): + if self.cur_section != '.late_rodata': + self.fail(".late_rodata_alignment must occur within .late_rodata section", real_line) + value = int(line.split()[1]) + if value not in [4, 8]: + self.fail(".late_rodata_alignment argument must be 4 or 8", real_line) + if self.late_rodata_alignment and self.late_rodata_alignment != value: + self.fail(".late_rodata_alignment alignment assumption conflicts with earlier .double directive. Make sure to provide explicit alignment padding.") + self.late_rodata_alignment = value + changed_section = True + elif line.startswith('.incbin'): + self.add_sized(int(line.split(',')[-1].strip(), 0), real_line) + elif line.startswith('.word') or line.startswith('.gpword') or line.startswith('.float'): + self.align4() + self.add_sized(4 * len(line.split(',')), real_line) + elif line.startswith('.double'): + self.align4() + if self.cur_section == '.late_rodata': + align8 = self.fn_section_sizes[self.cur_section] % 8 + # Automatically set late_rodata_alignment, so the generated C code uses doubles. + # This gives us correct alignment for the transferred doubles even when the + # late_rodata_alignment is wrong, e.g. for non-matching compilation. + if not self.late_rodata_alignment: + self.late_rodata_alignment = 8 - align8 + self.late_rodata_alignment_from_content = True + elif self.late_rodata_alignment != 8 - align8: + if self.late_rodata_alignment_from_content: + self.fail("found two .double directives with different start addresses mod 8. Make sure to provide explicit alignment padding.", real_line) + else: + self.fail(".double at address that is not 0 mod 8 (based on .late_rodata_alignment assumption). Make sure to provide explicit alignment padding.", real_line) + self.add_sized(8 * len(line.split(',')), real_line) + emitting_double = True + elif line.startswith('.space'): + self.add_sized(int(line.split()[1], 0), real_line) + elif line.startswith('.balign'): + align = int(line.split()[1]) + if align != 4: + self.fail("only .balign 4 is supported", real_line) + self.align4() + elif line.startswith('.align'): + align = int(line.split()[1]) + if align != 2: + self.fail("only .align 2 is supported", real_line) + self.align4() + elif line.startswith('.asci'): + z = (line.startswith('.asciz') or line.startswith('.asciiz')) + self.add_sized(self.count_quoted_size(line, z, real_line, output_enc), real_line) + elif line.startswith('.byte'): + self.add_sized(len(line.split(',')), real_line) + elif line.startswith('.half') or line.startswith('.hword'): + self.align2() + self.add_sized(2*len(line.split(',')), real_line) + elif line.startswith('.'): + # .macro, ... + self.fail("asm directive not supported", real_line) + else: + # Unfortunately, macros are hard to support for .rodata -- + # we don't know how how space they will expand to before + # running the assembler, but we need that information to + # construct the C code. So if we need that we'll either + # need to run the assembler twice (at least in some rare + # cases), or change how this program is invoked. + # Similarly, we can't currently deal with pseudo-instructions + # that expand to several real instructions. + if self.cur_section != '.text': + self.fail("instruction or macro call in non-.text section? not supported", real_line) + self.add_sized(4, real_line) + if self.cur_section == '.late_rodata': + if not changed_section: + if emitting_double: + self.late_rodata_asm_conts.append(".align 0") + self.late_rodata_asm_conts.append(real_line) + if emitting_double: + self.late_rodata_asm_conts.append(".align 2") + else: + self.asm_conts.append(real_line) + + def finish(self, state): + src = [''] * (self.num_lines + 1) + late_rodata_dummy_bytes = [] + jtbl_rodata_size = 0 + late_rodata_fn_output = [] + + num_instr = self.fn_section_sizes['.text'] // 4 + + if self.fn_section_sizes['.late_rodata'] > 0: + # Generate late rodata by emitting unique float constants. + # This requires 3 instructions for each 4 bytes of rodata. + # If we know alignment, we can use doubles, which give 3 + # instructions for 8 bytes of rodata. + size = self.fn_section_sizes['.late_rodata'] // 4 + skip_next = False + needs_double = (self.late_rodata_alignment != 0) + extra_mips1_nop = False + if state.pascal: + jtbl_size = 9 if state.mips1 else 8 + jtbl_min_rodata_size = 2 + else: + jtbl_size = 11 if state.mips1 else 9 + jtbl_min_rodata_size = 5 + for i in range(size): + if skip_next: + skip_next = False + continue + # Jump tables give 9 instructions (11 with -mips1) for >= 5 words of rodata, + # and should be emitted when: + # - -O2 or -O2 -g3 are used, which give the right codegen + # - we have emitted our first .float/.double (to ensure that we find the + # created rodata in the binary) + # - we have emitted our first .double, if any (to ensure alignment of doubles + # in shifted rodata sections) + # - we have at least 5 words of rodata left to emit (otherwise IDO does not + # generate a jump table) + # - we have at least 10 more instructions to go in this function (otherwise our + # function size computation will be wrong since the delay slot goes unused) + if (not needs_double and state.use_jtbl_for_rodata and i >= 1 and + size - i >= jtbl_min_rodata_size and + num_instr - len(late_rodata_fn_output) >= jtbl_size + 1): + if state.pascal: + cases = " ".join("{}: ;".format(case) for case in range(size - i)) + line = "case 0 of " + cases + " otherwise end;" + else: + cases = " ".join("case {}:".format(case) for case in range(size - i)) + line = "switch (*(volatile int*)0) { " + cases + " ; }" + late_rodata_fn_output.append(line) + late_rodata_fn_output.extend([""] * (jtbl_size - 1)) + jtbl_rodata_size = (size - i) * 4 + extra_mips1_nop = i != 2 + break + dummy_bytes = state.next_late_rodata_hex() + late_rodata_dummy_bytes.append(dummy_bytes) + if self.late_rodata_alignment == 4 * ((i + 1) % 2 + 1) and i + 1 < size: + dummy_bytes2 = state.next_late_rodata_hex() + late_rodata_dummy_bytes.append(dummy_bytes2) + fval, = struct.unpack('>d', dummy_bytes + dummy_bytes2) + if state.pascal: + line = state.pascal_assignment('d', fval) + else: + line = '*(volatile double*)0 = {};'.format(fval) + late_rodata_fn_output.append(line) + skip_next = True + needs_double = False + if state.mips1: + # mips1 does not have ldc1/sdc1 + late_rodata_fn_output.append('') + late_rodata_fn_output.append('') + extra_mips1_nop = False + else: + fval, = struct.unpack('>f', dummy_bytes) + if state.pascal: + line = state.pascal_assignment('f', fval) + else: + line = '*(volatile float*)0 = {}f;'.format(fval) + late_rodata_fn_output.append(line) + extra_mips1_nop = True + late_rodata_fn_output.append('') + late_rodata_fn_output.append('') + if state.mips1 and extra_mips1_nop: + late_rodata_fn_output.append('') + + text_name = None + if self.fn_section_sizes['.text'] > 0 or late_rodata_fn_output: + text_name = state.make_name('func') + src[0] = state.func_prologue(text_name) + src[self.num_lines] = state.func_epilogue() + instr_count = self.fn_section_sizes['.text'] // 4 + if instr_count < state.min_instr_count: + self.fail("too short .text block") + tot_emitted = 0 + tot_skipped = 0 + fn_emitted = 0 + fn_skipped = 0 + skipping = True + rodata_stack = late_rodata_fn_output[::-1] + for (line, count) in self.fn_ins_inds: + for _ in range(count): + if (fn_emitted > MAX_FN_SIZE and instr_count - tot_emitted > state.min_instr_count and + (not rodata_stack or rodata_stack[-1])): + # Don't let functions become too large. When a function reaches 284 + # instructions, and -O2 -framepointer flags are passed, the IRIX + # compiler decides it is a great idea to start optimizing more. + # Also, Pascal cannot handle too large functions before it runs out + # of unique statements to write. + fn_emitted = 0 + fn_skipped = 0 + skipping = True + src[line] += (' ' + state.func_epilogue() + ' ' + + state.func_prologue(state.make_name('large_func')) + ' ') + if ( + skipping and + fn_skipped < state.skip_instr_count + + (state.prelude_if_late_rodata if rodata_stack else 0) + ): + fn_skipped += 1 + tot_skipped += 1 + else: + skipping = False + if rodata_stack: + src[line] += rodata_stack.pop() + elif state.pascal: + src[line] += state.pascal_assignment('i', '0') + else: + src[line] += '*(volatile int*)0 = 0;' + tot_emitted += 1 + fn_emitted += 1 + if rodata_stack: + size = len(late_rodata_fn_output) // 3 + available = instr_count - tot_skipped + self.fail( + "late rodata to text ratio is too high: {} / {} must be <= 1/3\n" + "add .late_rodata_alignment (4|8) to the .late_rodata " + "block to double the allowed ratio." + .format(size, available)) + + rodata_name = None + if self.fn_section_sizes['.rodata'] > 0: + if state.pascal: + self.fail(".rodata isn't supported with Pascal for now") + rodata_name = state.make_name('rodata') + src[self.num_lines] += ' const char {}[{}] = {{1}};'.format(rodata_name, self.fn_section_sizes['.rodata']) + + data_name = None + if self.fn_section_sizes['.data'] > 0: + data_name = state.make_name('data') + if state.pascal: + line = ' var {}: packed array[1..{}] of char := [otherwise: 0];'.format(data_name, self.fn_section_sizes['.data']) + else: + line = ' char {}[{}] = {{1}};'.format(data_name, self.fn_section_sizes['.data']) + src[self.num_lines] += line + + bss_name = None + if self.fn_section_sizes['.bss'] > 0: + if state.pascal: + self.fail(".bss isn't supported with Pascal") + bss_name = state.make_name('bss') + src[self.num_lines] += ' char {}[{}];'.format(bss_name, self.fn_section_sizes['.bss']) + + fn = Function( + text_glabels=self.text_glabels, + asm_conts=self.asm_conts, + late_rodata_dummy_bytes=late_rodata_dummy_bytes, + jtbl_rodata_size=jtbl_rodata_size, + late_rodata_asm_conts=self.late_rodata_asm_conts, + fn_desc=self.fn_desc, + data={ + '.text': (text_name, self.fn_section_sizes['.text']), + '.data': (data_name, self.fn_section_sizes['.data']), + '.rodata': (rodata_name, self.fn_section_sizes['.rodata']), + '.bss': (bss_name, self.fn_section_sizes['.bss']), + }) + return src, fn + +cutscene_data_regexpr = re.compile(r"CutsceneData (.|\n)*\[\] = {") +float_regexpr = re.compile(r"[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?f") + +def repl_float_hex(m): + return str(struct.unpack(">I", struct.pack(">f", float(m.group(0).strip().rstrip("f"))))[0]) + +Opts = namedtuple('Opts', ['opt', 'framepointer', 'mips1', 'kpic', 'pascal', 'input_enc', 'output_enc']) + +def parse_source(f, opts, out_dependencies, print_source=None): + if opts.opt in ['O1', 'O2']: + if opts.framepointer: + min_instr_count = 6 + skip_instr_count = 5 + else: + min_instr_count = 2 + skip_instr_count = 1 + elif opts.opt == 'O0': + if opts.framepointer: + min_instr_count = 8 + skip_instr_count = 8 + else: + min_instr_count = 4 + skip_instr_count = 4 + elif opts.opt == 'g': + if opts.framepointer: + min_instr_count = 7 + skip_instr_count = 7 + else: + min_instr_count = 4 + skip_instr_count = 4 + elif opts.opt == 'g3': + if opts.framepointer: + min_instr_count = 4 + skip_instr_count = 4 + else: + min_instr_count = 2 + skip_instr_count = 2 + else: + raise Failure("must pass one of -g, -O0, -O1, -O2, -O2 -g3") + prelude_if_late_rodata = 0 + if opts.kpic: + # Without optimizations, the PIC prelude always takes up 3 instructions. + # With optimizations, the prelude is optimized out if there's no late rodata. + if opts.opt in ('g3', 'O2'): + prelude_if_late_rodata = 3 + else: + min_instr_count += 3 + skip_instr_count += 3 + + use_jtbl_for_rodata = False + if opts.opt in ['O2', 'g3'] and not opts.framepointer and not opts.kpic: + use_jtbl_for_rodata = True + + state = GlobalState(min_instr_count, skip_instr_count, use_jtbl_for_rodata, prelude_if_late_rodata, opts.mips1, opts.pascal) + output_enc = opts.output_enc + + global_asm = None + asm_functions = [] + output_lines = [ + '#line 1 "' + f.name + '"' + ] + + is_cutscene_data = False + is_early_include = False + + for line_no, raw_line in enumerate(f, 1): + raw_line = raw_line.rstrip() + line = raw_line.lstrip() + + # Print exactly one output line per source line, to make compiler + # errors have correct line numbers. These will be overridden with + # reasonable content further down. + output_lines.append('') + + if global_asm is not None: + if line.startswith(')'): + src, fn = global_asm.finish(state) + for i, line2 in enumerate(src): + output_lines[start_index + i] = line2 + asm_functions.append(fn) + global_asm = None + else: + global_asm.process_line(raw_line, output_enc) + elif line in ['GLOBAL_ASM(', '#pragma GLOBAL_ASM(']: + global_asm = GlobalAsmBlock("GLOBAL_ASM block at line " + str(line_no)) + start_index = len(output_lines) + elif ((line.startswith('GLOBAL_ASM("') or line.startswith('#pragma GLOBAL_ASM("')) + and line.endswith('")')): + fname = line[line.index('(') + 2 : -2] + out_dependencies.append(fname) + global_asm = GlobalAsmBlock(fname) + with open(fname, encoding=opts.input_enc) as f: + for line2 in f: + global_asm.process_line(line2.rstrip(), output_enc) + src, fn = global_asm.finish(state) + output_lines[-1] = ''.join(src) + asm_functions.append(fn) + global_asm = None + elif line == '#pragma asmproc recurse': + # C includes qualified as + # #pragma asmproc recurse + # #include "file.c" + # will be processed recursively when encountered + is_early_include = True + elif is_early_include: + # Previous line was a #pragma asmproc recurse + is_early_include = False + if not line.startswith("#include "): + raise Failure("#pragma asmproc recurse must be followed by an #include ") + fpath = os.path.dirname(f.name) + fname = os.path.join(fpath, line[line.index(' ') + 2 : -1]) + out_dependencies.append(fname) + include_src = StringIO() + with open(fname, encoding=opts.input_enc) as include_file: + parse_source(include_file, opts, out_dependencies, include_src) + include_src.write('#line ' + str(line_no + 1) + ' "' + f.name + '"') + output_lines[-1] = include_src.getvalue() + include_src.close() + else: + # This is a hack to replace all floating-point numbers in an array of a particular type + # (in this case CutsceneData) with their corresponding IEEE-754 hexadecimal representation + if cutscene_data_regexpr.search(line) is not None: + is_cutscene_data = True + elif line.endswith("};"): + is_cutscene_data = False + if is_cutscene_data: + raw_line = re.sub(float_regexpr, repl_float_hex, raw_line) + output_lines[-1] = raw_line + + if print_source: + if isinstance(print_source, StringIO): + for line in output_lines: + print_source.write(line + '\n') + else: + newline_encoded = "\n".encode(output_enc) + for line in output_lines: + try: + line_encoded = line.encode(output_enc) + except UnicodeEncodeError: + print("Failed to encode a line to", output_enc) + print("The line:", line) + print("The line, utf-8-encoded:", line.encode("utf-8")) + raise + print_source.write(line_encoded) + print_source.write(newline_encoded) + print_source.flush() + + return asm_functions + +def fixup_objfile(objfile_name, functions, asm_prelude, assembler, output_enc, drop_mdebug_gptab, convert_statics): + SECTIONS = ['.data', '.text', '.rodata', '.bss'] + + with open(objfile_name, 'rb') as f: + objfile = ElfFile(f.read()) + fmt = objfile.fmt + + prev_locs = { + '.text': 0, + '.data': 0, + '.rodata': 0, + '.bss': 0, + } + to_copy = { + '.text': [], + '.data': [], + '.rodata': [], + '.bss': [], + } + asm = [] + all_late_rodata_dummy_bytes = [] + all_jtbl_rodata_size = [] + late_rodata_asm = [] + late_rodata_source_name_start = None + late_rodata_source_name_end = None + + # Generate an assembly file with all the assembly we need to fill in. For + # simplicity we pad with nops/.space so that addresses match exactly, so we + # don't have to fix up relocations/symbol references. + all_text_glabels = set() + func_sizes = {} + for function in functions: + ifdefed = False + for sectype, (temp_name, size) in function.data.items(): + if temp_name is None: + continue + assert size > 0 + loc = objfile.symtab.find_symbol(temp_name) + if loc is None: + ifdefed = True + break + loc = loc[1] + prev_loc = prev_locs[sectype] + if loc < prev_loc: + # If the dummy C generates too little asm, and we have two + # consecutive GLOBAL_ASM blocks, we detect that error here. + # On the other hand, if it generates too much, we don't have + # a good way of discovering that error: it's indistinguishable + # from a static symbol occurring after the GLOBAL_ASM block. + raise Failure("Wrongly computed size for section {} (diff {}). This is an asm-processor bug!".format(sectype, prev_loc- loc)) + if loc != prev_loc: + asm.append('.section ' + sectype) + if sectype == '.text': + for i in range((loc - prev_loc) // 4): + asm.append('nop') + else: + asm.append('.space {}'.format(loc - prev_loc)) + to_copy[sectype].append((loc, size, temp_name, function.fn_desc)) + if function.text_glabels and sectype == '.text': + func_sizes[function.text_glabels[0]] = size + prev_locs[sectype] = loc + size + if not ifdefed: + all_text_glabels.update(function.text_glabels) + all_late_rodata_dummy_bytes.append(function.late_rodata_dummy_bytes) + all_jtbl_rodata_size.append(function.jtbl_rodata_size) + late_rodata_asm.append(function.late_rodata_asm_conts) + for sectype, (temp_name, size) in function.data.items(): + if temp_name is not None: + asm.append('.section ' + sectype) + asm.append('glabel ' + temp_name + '_asm_start') + asm.append('.text') + for line in function.asm_conts: + asm.append(line) + for sectype, (temp_name, size) in function.data.items(): + if temp_name is not None: + asm.append('.section ' + sectype) + asm.append('glabel ' + temp_name + '_asm_end') + if any(late_rodata_asm): + late_rodata_source_name_start = '_asmpp_late_rodata_start' + late_rodata_source_name_end = '_asmpp_late_rodata_end' + asm.append('.section .late_rodata') + # Put some padding at the start to avoid conflating symbols with + # references to the whole section. + asm.append('.word 0, 0') + asm.append('glabel {}'.format(late_rodata_source_name_start)) + for conts in late_rodata_asm: + asm.extend(conts) + asm.append('glabel {}'.format(late_rodata_source_name_end)) + + o_file = tempfile.NamedTemporaryFile(prefix='asm-processor', suffix='.o', delete=False) + o_name = o_file.name + o_file.close() + s_file = tempfile.NamedTemporaryFile(prefix='asm-processor', suffix='.s', delete=False) + s_name = s_file.name + try: + s_file.write(asm_prelude + b'\n') + for line in asm: + s_file.write(line.encode(output_enc) + b'\n') + s_file.close() + ret = os.system(assembler + " " + s_name + " -o " + o_name) + if ret != 0: + raise Failure("failed to assemble") + with open(o_name, 'rb') as f: + asm_objfile = ElfFile(f.read()) + + # Remove clutter from objdump output for tests, and make the tests + # portable by avoiding absolute paths. Outside of tests .mdebug is + # useful for showing source together with asm, though. + mdebug_section = objfile.find_section('.mdebug') + if drop_mdebug_gptab: + objfile.drop_mdebug_gptab() + + # Unify reginfo sections + target_reginfo = objfile.find_section('.reginfo') + if target_reginfo is not None: + source_reginfo_data = list(asm_objfile.find_section('.reginfo').data) + data = list(target_reginfo.data) + for i in range(20): + data[i] |= source_reginfo_data[i] + target_reginfo.data = bytes(data) + + # Move over section contents + modified_text_positions = set() + jtbl_rodata_positions = set() + last_rodata_pos = 0 + for sectype in SECTIONS: + if not to_copy[sectype]: + continue + source = asm_objfile.find_section(sectype) + assert source is not None, "didn't find source section: " + sectype + for (pos, count, temp_name, fn_desc) in to_copy[sectype]: + loc1 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_start', source) + loc2 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_end', source) + assert loc1 == pos, "assembly and C files don't line up for section " + sectype + ", " + fn_desc + if loc2 - loc1 != count: + raise Failure("incorrectly computed size for section " + sectype + ", " + fn_desc + ". If using .double, make sure to provide explicit alignment padding.") + if sectype == '.bss': + continue + target = objfile.find_section(sectype) + assert target is not None, "missing target section of type " + sectype + data = list(target.data) + for (pos, count, _, _) in to_copy[sectype]: + data[pos:pos + count] = source.data[pos:pos + count] + if sectype == '.text': + assert count % 4 == 0 + assert pos % 4 == 0 + for i in range(count // 4): + modified_text_positions.add(pos + 4 * i) + elif sectype == '.rodata': + last_rodata_pos = pos + count + target.data = bytes(data) + + # Move over late rodata. This is heuristic, sadly, since I can't think + # of another way of doing it. + moved_late_rodata = {} + if any(all_late_rodata_dummy_bytes) or any(all_jtbl_rodata_size): + source = asm_objfile.find_section('.late_rodata') + target = objfile.find_section('.rodata') + source_pos = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_start, source) + source_end = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_end, source) + if source_end - source_pos != sum(map(len, all_late_rodata_dummy_bytes)) * 4 + sum(all_jtbl_rodata_size): + raise Failure("computed wrong size of .late_rodata") + new_data = list(target.data) + for dummy_bytes_list, jtbl_rodata_size in zip(all_late_rodata_dummy_bytes, all_jtbl_rodata_size): + for index, dummy_bytes in enumerate(dummy_bytes_list): + if not fmt.is_big_endian: + dummy_bytes = dummy_bytes[::-1] + pos = target.data.index(dummy_bytes, last_rodata_pos) + # This check is nice, but makes time complexity worse for large files: + if SLOW_CHECKS and target.data.find(dummy_bytes, pos + 4) != -1: + raise Failure("multiple occurrences of late_rodata hex magic. Change asm-processor to use something better than 0xE0123456!") + if index == 0 and len(dummy_bytes_list) > 1 and target.data[pos+4:pos+8] == b'\0\0\0\0': + # Ugly hack to handle double alignment for non-matching builds. + # We were told by .late_rodata_alignment (or deduced from a .double) + # that a function's late_rodata started out 4 (mod 8), and emitted + # a float and then a double. But it was actually 0 (mod 8), so our + # double was moved by 4 bytes. To make them adjacent to keep jump + # tables correct, move the float by 4 bytes as well. + new_data[pos:pos+4] = b'\0\0\0\0' + pos += 4 + new_data[pos:pos+4] = source.data[source_pos:source_pos+4] + moved_late_rodata[source_pos] = pos + last_rodata_pos = pos + 4 + source_pos += 4 + if jtbl_rodata_size > 0: + assert dummy_bytes_list, "should always have dummy bytes before jtbl data" + pos = last_rodata_pos + new_data[pos : pos + jtbl_rodata_size] = \ + source.data[source_pos : source_pos + jtbl_rodata_size] + for i in range(0, jtbl_rodata_size, 4): + moved_late_rodata[source_pos + i] = pos + i + jtbl_rodata_positions.add(pos + i) + last_rodata_pos += jtbl_rodata_size + source_pos += jtbl_rodata_size + target.data = bytes(new_data) + + # Merge strtab data. + strtab_adj = len(objfile.symtab.strtab.data) + objfile.symtab.strtab.data += asm_objfile.symtab.strtab.data + + # Find relocated symbols + relocated_symbols = set() + for sectype in SECTIONS + ['.late_rodata']: + for obj in [asm_objfile, objfile]: + sec = obj.find_section(sectype) + if sec is None: + continue + for reltab in sec.relocated_by: + for rel in reltab.relocations: + relocated_symbols.add(obj.symtab.symbol_entries[rel.sym_index]) + + # Move over symbols, deleting the temporary function labels. + # Skip over new local symbols that aren't relocated against, to + # avoid conflicts. + empty_symbol = objfile.symtab.symbol_entries[0] + new_syms = [s for s in objfile.symtab.symbol_entries[1:] if not is_temp_name(s.name)] + + for i, s in enumerate(asm_objfile.symtab.symbol_entries): + is_local = (i < asm_objfile.symtab.sh_info) + if is_local and s not in relocated_symbols: + continue + if is_temp_name(s.name): + assert s not in relocated_symbols + continue + if s.st_shndx not in [SHN_UNDEF, SHN_ABS]: + section_name = asm_objfile.sections[s.st_shndx].name + target_section_name = section_name + if section_name == ".late_rodata": + target_section_name = ".rodata" + elif section_name not in SECTIONS: + raise Failure("generated assembly .o must only have symbols for .text, .data, .rodata, .late_rodata, ABS and UNDEF, but found " + section_name) + objfile_section = objfile.find_section(target_section_name) + if objfile_section is None: + raise Failure("generated assembly .o has section that real objfile lacks: " + target_section_name) + s.st_shndx = objfile_section.index + # glabel's aren't marked as functions, making objdump output confusing. Fix that. + if s.name in all_text_glabels: + s.type = STT_FUNC + if s.name in func_sizes: + s.st_size = func_sizes[s.name] + if section_name == '.late_rodata': + if s.st_value == 0: + # This must be a symbol corresponding to the whole .late_rodata + # section, being referred to from a relocation. + # Moving local symbols is tricky, because it requires fixing up + # lo16/hi16 relocation references to .late_rodata+. + # Just disallow it for now. + raise Failure("local symbols in .late_rodata are not allowed") + s.st_value = moved_late_rodata[s.st_value] + s.st_name += strtab_adj + new_syms.append(s) + make_statics_global = convert_statics in ("global", "global-with-filename") + + # Add static symbols from .mdebug, so they can be referred to from GLOBAL_ASM + if mdebug_section and convert_statics != "no": + strtab_index = len(objfile.symtab.strtab.data) + new_strtab_data = [] + ifd_max, cb_fd_offset = fmt.unpack('II', mdebug_section.data[18*4 : 20*4]) + cb_sym_offset, = fmt.unpack('I', mdebug_section.data[9*4 : 10*4]) + cb_ss_offset, = fmt.unpack('I', mdebug_section.data[15*4 : 16*4]) + for i in range(ifd_max): + offset = cb_fd_offset + 18*4*i + iss_base, _, isym_base, csym = fmt.unpack('IIII', objfile.data[offset + 2*4 : offset + 6*4]) + for j in range(csym): + offset2 = cb_sym_offset + 12 * (isym_base + j) + iss, value, st_sc_index = fmt.unpack('III', objfile.data[offset2 : offset2 + 12]) + st = (st_sc_index >> 26) + sc = (st_sc_index >> 21) & 0x1f + if st in [MIPS_DEBUG_ST_STATIC, MIPS_DEBUG_ST_STATIC_PROC]: + symbol_name_offset = cb_ss_offset + iss_base + iss + symbol_name_offset_end = objfile.data.find(b'\0', symbol_name_offset) + assert symbol_name_offset_end != -1 + symbol_name = objfile.data[symbol_name_offset : symbol_name_offset_end + 1] + emitted_symbol_name = symbol_name + if convert_statics == "global-with-filename": + # Change the emitted symbol name to include the filename, + # but don't let that affect deduplication logic. + emitted_symbol_name = objfile_name.encode("utf-8") + b":" + symbol_name + section_name = {1: '.text', 2: '.data', 3: '.bss', 15: '.rodata'}[sc] + section = objfile.find_section(section_name) + symtype = STT_FUNC if sc == 1 else STT_OBJECT + binding = STB_GLOBAL if make_statics_global else STB_LOCAL + sym = Symbol.from_parts( + fmt, + st_name=strtab_index, + st_value=value, + st_size=0, + st_info=(binding << 4 | symtype), + st_other=STV_DEFAULT, + st_shndx=section.index, + strtab=objfile.symtab.strtab, + name=symbol_name[:-1].decode('latin1')) + strtab_index += len(emitted_symbol_name) + new_strtab_data.append(emitted_symbol_name) + new_syms.append(sym) + objfile.symtab.strtab.data += b''.join(new_strtab_data) + + # Get rid of duplicate symbols, favoring ones that are not UNDEF. + # Skip this for unnamed local symbols though. + new_syms.sort(key=lambda s: 0 if s.st_shndx != SHN_UNDEF else 1) + old_syms = [] + newer_syms = [] + name_to_sym = {} + for s in new_syms: + if s.name == "_gp_disp": + s.type = STT_OBJECT + if s.bind == STB_LOCAL and s.st_shndx == SHN_UNDEF: + raise Failure("local symbol \"" + s.name + "\" is undefined") + if not s.name: + if s.bind != STB_LOCAL: + raise Failure("global symbol with no name") + newer_syms.append(s) + else: + existing = name_to_sym.get(s.name) + if not existing: + name_to_sym[s.name] = s + newer_syms.append(s) + elif s.st_shndx != SHN_UNDEF: + raise Failure("symbol \"" + s.name + "\" defined twice") + else: + s.replace_by = existing + old_syms.append(s) + new_syms = newer_syms + + # Put local symbols in front, with the initial dummy entry first, and + # _gp_disp at the end if it exists. + new_syms.insert(0, empty_symbol) + new_syms.sort(key=lambda s: (s.bind != STB_LOCAL, s.name == "_gp_disp")) + num_local_syms = sum(1 for s in new_syms if s.bind == STB_LOCAL) + + for i, s in enumerate(new_syms): + s.new_index = i + for s in old_syms: + s.new_index = s.replace_by.new_index + objfile.symtab.data = b''.join(s.to_bin() for s in new_syms) + objfile.symtab.sh_info = num_local_syms + + # Fix up relocation symbol references + for sectype in SECTIONS: + target = objfile.find_section(sectype) + + if target is not None: + # fixup relocation symbol indices, since we butchered them above + for reltab in target.relocated_by: + nrels = [] + for rel in reltab.relocations: + if (sectype == '.text' and rel.r_offset in modified_text_positions or + sectype == '.rodata' and rel.r_offset in jtbl_rodata_positions): + # don't include relocations for late_rodata dummy code + continue + rel.sym_index = objfile.symtab.symbol_entries[rel.sym_index].new_index + nrels.append(rel) + reltab.relocations = nrels + reltab.data = b''.join(rel.to_bin() for rel in nrels) + + # Move over relocations + for sectype in SECTIONS + ['.late_rodata']: + source = asm_objfile.find_section(sectype) + if source is None or not source.data: + continue + + target_sectype = '.rodata' if sectype == '.late_rodata' else sectype + target = objfile.find_section(target_sectype) + assert target is not None, target_sectype + target_reltab = objfile.find_section('.rel' + target_sectype) + target_reltaba = objfile.find_section('.rela' + target_sectype) + for reltab in source.relocated_by: + for rel in reltab.relocations: + rel.sym_index = asm_objfile.symtab.symbol_entries[rel.sym_index].new_index + if sectype == '.late_rodata': + rel.r_offset = moved_late_rodata[rel.r_offset] + new_data = b''.join(rel.to_bin() for rel in reltab.relocations) + if reltab.sh_type == SHT_REL: + if not target_reltab: + target_reltab = objfile.add_section('.rel' + target_sectype, + sh_type=SHT_REL, sh_flags=0, + sh_link=objfile.symtab.index, sh_info=target.index, + sh_addralign=4, sh_entsize=8, data=b'') + target_reltab.data += new_data + else: + if not target_reltaba: + target_reltaba = objfile.add_section('.rela' + target_sectype, + sh_type=SHT_RELA, sh_flags=0, + sh_link=objfile.symtab.index, sh_info=target.index, + sh_addralign=4, sh_entsize=12, data=b'') + target_reltaba.data += new_data + + objfile.write(objfile_name) + finally: + s_file.close() + os.remove(s_name) + try: + os.remove(o_name) + except: + pass + +def run_wrapped(argv, outfile, functions): + parser = argparse.ArgumentParser(description="Pre-process .c files and post-process .o files to enable embedding assembly into C.") + parser.add_argument('filename', help="path to .c code") + parser.add_argument('--post-process', dest='objfile', help="path to .o file to post-process") + parser.add_argument('--assembler', dest='assembler', help="assembler command (e.g. \"mips-linux-gnu-as -march=vr4300 -mabi=32\")") + parser.add_argument('--asm-prelude', dest='asm_prelude', help="path to a file containing a prelude to the assembly file (with .set and .macro directives, e.g.)") + parser.add_argument('--input-enc', default='latin1', help="input encoding (default: %(default)s)") + parser.add_argument('--output-enc', default='latin1', help="output encoding (default: %(default)s)") + parser.add_argument('--drop-mdebug-gptab', dest='drop_mdebug_gptab', action='store_true', help="drop mdebug and gptab sections") + parser.add_argument('--convert-statics', dest='convert_statics', choices=["no", "local", "global", "global-with-filename"], default="local", help="change static symbol visibility (default: %(default)s)") + parser.add_argument('--force', dest='force', action='store_true', help="force processing of files without GLOBAL_ASM blocks") + parser.add_argument('-framepointer', dest='framepointer', action='store_true') + parser.add_argument('-mips1', dest='mips1', action='store_true') + parser.add_argument('-g3', dest='g3', action='store_true') + parser.add_argument('-KPIC', dest='kpic', action='store_true') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-O0', dest='opt', action='store_const', const='O0') + group.add_argument('-O1', dest='opt', action='store_const', const='O1') + group.add_argument('-O2', dest='opt', action='store_const', const='O2') + group.add_argument('-g', dest='opt', action='store_const', const='g') + args = parser.parse_args(argv) + opt = args.opt + pascal = any(args.filename.endswith(ext) for ext in (".p", ".pas", ".pp")) + if args.g3: + if opt != 'O2': + raise Failure("-g3 is only supported together with -O2") + opt = 'g3' + if args.mips1 and (opt not in ('O1', 'O2') or args.framepointer): + raise Failure("-mips1 is only supported together with -O1 or -O2") + if pascal and opt not in ('O1', 'O2', 'g3'): + raise Failure("Pascal is only supported together with -O1, -O2 or -O2 -g3") + opts = Opts(opt, args.framepointer, args.mips1, args.kpic, pascal, args.input_enc, args.output_enc) + + if args.objfile is None: + with open(args.filename, encoding=args.input_enc) as f: + deps = [] + functions = parse_source(f, opts, out_dependencies=deps, print_source=outfile) + return functions, deps + else: + if args.assembler is None: + raise Failure("must pass assembler command") + if functions is None: + with open(args.filename, encoding=args.input_enc) as f: + functions = parse_source(f, opts, out_dependencies=[]) + if not functions and not args.force: + return + asm_prelude = b'' + if args.asm_prelude: + with open(args.asm_prelude, 'rb') as f: + asm_prelude = f.read() + fixup_objfile(args.objfile, functions, asm_prelude, args.assembler, args.output_enc, args.drop_mdebug_gptab, args.convert_statics) + +def run(argv, outfile=sys.stdout.buffer, functions=None): + try: + return run_wrapped(argv, outfile, functions) + except Failure as e: + print("Error:", e, file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + run(sys.argv[1:]) diff --git a/tools/asm-processor/build.py b/tools/asm-processor/build.py new file mode 100644 index 0000000..efbaade --- /dev/null +++ b/tools/asm-processor/build.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +import sys +from pathlib import Path +import shlex +import subprocess +import tempfile +import uuid +import asm_processor + +# Boolean for debugging purposes +# Preprocessed files are temporary, set to True to keep a copy +keep_preprocessed_files = False + +dir_path = Path(__file__).resolve().parent +asm_prelude_path = dir_path / "prelude.inc" + +all_args = sys.argv[1:] +sep0 = next(index for index, arg in enumerate(all_args) if not arg.startswith("-")) +sep1 = all_args.index("--") +sep2 = all_args.index("--", sep1 + 1) + +asmproc_flags = all_args[:sep0] +compiler = all_args[sep0:sep1] + +assembler_args = all_args[sep1 + 1 : sep2] +assembler_sh = " ".join(shlex.quote(x) for x in assembler_args) + + +compile_args = all_args[sep2 + 1 :] + +in_file = Path(compile_args[-1]) +del compile_args[-1] + +out_ind = compile_args.index("-o") +out_file = Path(compile_args[out_ind + 1]) +del compile_args[out_ind + 1] +del compile_args[out_ind] + + +in_dir = in_file.resolve().parent +opt_flags = [ + x for x in compile_args if x in {"-g3", "-g", "-O0", "-O1", "-O2", "-framepointer", "-KPIC"} +] +if "-mips2" not in compile_args: + opt_flags.append("-mips1") + +asmproc_flags += opt_flags + [str(in_file)] + +# Drop .mdebug and .gptab sections from resulting binaries. This makes +# resulting .o files much smaller and speeds up builds, but loses line +# number debug data. +# asmproc_flags += ["--drop-mdebug-gptab"] + +# Convert encoding before compiling. +# asmproc_flags += ["--input-enc", "utf-8", "--output-enc", "euc-jp"] + +with tempfile.TemporaryDirectory(prefix="asm_processor") as tmpdirname: + tmpdir_path = Path(tmpdirname) + preprocessed_filename = "preprocessed_" + uuid.uuid4().hex + in_file.suffix + preprocessed_path = tmpdir_path / preprocessed_filename + + with preprocessed_path.open("wb") as f: + functions, deps = asm_processor.run(asmproc_flags, outfile=f) + + if keep_preprocessed_files: + import shutil + + keep_output_dir = Path("./asm_processor_preprocessed") + keep_output_dir.mkdir(parents=True, exist_ok=True) + + shutil.copy( + preprocessed_path, + keep_output_dir / (in_file.stem + "_" + preprocessed_filename), + ) + + compile_cmdline = ( + compiler + + compile_args + + ["-I", str(in_dir), "-o", str(out_file), str(preprocessed_path)] + ) + + try: + subprocess.check_call(compile_cmdline) + except subprocess.CalledProcessError as e: + print("Failed to compile file " + str(in_file) + ". Command line:") + print() + print(" ".join(shlex.quote(x) for x in compile_cmdline)) + print() + sys.exit(55) + + asm_processor.run( + asmproc_flags + + [ + "--post-process", + str(out_file), + "--assembler", + assembler_sh, + "--asm-prelude", + str(asm_prelude_path), + ], + functions=functions, + ) + + deps_file = out_file.with_suffix(".asmproc.d") + if deps: + with deps_file.open("w") as f: + f.write(str(out_file) + ": " + " \\\n ".join(deps) + "\n") + for dep in deps: + f.write("\n" + dep + ":\n") + else: + try: + deps_file.unlink() + except OSError: + pass diff --git a/tools/asm-processor/compile-test.sh b/tools/asm-processor/compile-test.sh new file mode 100755 index 0000000..6551662 --- /dev/null +++ b/tools/asm-processor/compile-test.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -o pipefail +INPUT="$1" +OUTPUT="${INPUT%.*}.o" + +rm -f "$OUTPUT" + +CC="$MIPS_CC" # ido 7.1 via recomp or qemu-irix +AS="mips-linux-gnu-as" +ASFLAGS="-march=vr4300 -mabi=32" +OPTFLAGS=$(grep 'COMPILE-FLAGS: ' $INPUT | sed 's#^.*COMPILE-FLAGS: ##' | sed 's#}$##') +ASMPFLAGS=$(grep 'ASMP-FLAGS: ' $INPUT | sed 's#^.*ASMP-FLAGS: ##' | sed 's#}$##') +ISET=$(grep 'COMPILE-ISET: ' $INPUT | sed 's#^.*COMPILE-ISET: ##' | sed 's#}$##') +if [[ -z "$OPTFLAGS" ]]; then + OPTFLAGS="-g" +fi +CFLAGS="-Wab,-r4300_mul -G 0 -Xcpluscomm -fullwarn -wlint -woff 819,820,852,821 -signed -c" +if [[ -z "$ISET" ]]; then + CFLAGS="$CFLAGS -mips2" +fi +if [[ "$OPTFLAGS" != *-KPIC* ]]; then + CFLAGS="$CFLAGS -non_shared" +fi + +set -e +python3 build.py --drop-mdebug-gptab $ASMPFLAGS $CC -- $AS $ASFLAGS -- $CFLAGS $OPTFLAGS $ISET -o "$OUTPUT" "$INPUT" diff --git a/tools/asm-processor/prelude.inc b/tools/asm-processor/prelude.inc new file mode 100644 index 0000000..ab83966 --- /dev/null +++ b/tools/asm-processor/prelude.inc @@ -0,0 +1,55 @@ +.set noat +.set noreorder +.set gp=64 + +.macro glabel label + .global \label + \label: +.endm + +.macro dlabel label + .global \label + \label: +.endm + +.macro jlabel label + .global \label + .type \label, @function + \label: +.endm + + +# Float register aliases (o32 ABI, odd ones are rarely used) + +.set $fv0, $f0 +.set $fv0f, $f1 +.set $fv1, $f2 +.set $fv1f, $f3 +.set $ft0, $f4 +.set $ft0f, $f5 +.set $ft1, $f6 +.set $ft1f, $f7 +.set $ft2, $f8 +.set $ft2f, $f9 +.set $ft3, $f10 +.set $ft3f, $f11 +.set $fa0, $f12 +.set $fa0f, $f13 +.set $fa1, $f14 +.set $fa1f, $f15 +.set $ft4, $f16 +.set $ft4f, $f17 +.set $ft5, $f18 +.set $ft5f, $f19 +.set $fs0, $f20 +.set $fs0f, $f21 +.set $fs1, $f22 +.set $fs1f, $f23 +.set $fs2, $f24 +.set $fs2f, $f25 +.set $fs3, $f26 +.set $fs3f, $f27 +.set $fs4, $f28 +.set $fs4f, $f29 +.set $fs5, $f30 +.set $fs5f, $f31 diff --git a/tools/asm-processor/run-tests.sh b/tools/asm-processor/run-tests.sh new file mode 100755 index 0000000..5cae0a7 --- /dev/null +++ b/tools/asm-processor/run-tests.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +for A in tests/*.c tests/*.p; do + OBJDUMPFLAGS=-srt + echo $A + ./compile-test.sh "$A" && mips-linux-gnu-objdump $OBJDUMPFLAGS "${A%.*}.o" | diff - "${A%.*}.objdump" || echo FAIL "$A" +done diff --git a/tools/asm-processor/tests/ascii.c b/tools/asm-processor/tests/ascii.c new file mode 100644 index 0000000..bb27d25 --- /dev/null +++ b/tools/asm-processor/tests/ascii.c @@ -0,0 +1,19 @@ +void foo(void) { "abcdef"; } + +GLOBAL_ASM( +.rdata + .ascii "AB" + .ascii "CD", "EF" + .ascii "GH\n\n\n\0\11\222\3333\44444\x1234567\n\nIJK" +) + +void bar(void) { "hello"; } + +GLOBAL_ASM( +.rdata + .asciiz "12" + .asciiz "34", "56" + .asciiz "78\n\n\n\0\11\222\3333\44444\x1234567\n\n9A" +) + +void baz(void) { "ghijkl"; } diff --git a/tools/asm-processor/tests/ascii.objdump b/tools/asm-processor/tests/ascii.objdump new file mode 100644 index 0000000..bf42638 --- /dev/null +++ b/tools/asm-processor/tests/ascii.objdump @@ -0,0 +1,29 @@ + +tests/ascii.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000030 .text +00000000 l d .rodata 00000050 .rodata +00000000 g F .text 00000010 foo +00000010 g F .text 00000010 bar +00000020 g F .text 00000010 baz + + +Contents of section .text: + 0000 03e00008 00000000 03e00008 00000000 ................ + 0010 03e00008 00000000 03e00008 00000000 ................ + 0020 03e00008 00000000 03e00008 00000000 ................ +Contents of section .rodata: + 0000 61626364 65660000 41424344 45464748 abcdef..ABCDEFGH + 0010 0a0a0a00 0992db33 24343467 0a0a494a .......3$44g..IJ + 0020 4b000000 68656c6c 6f000000 31320033 K...hello...12.3 + 0030 34003536 0037380a 0a0a0009 92db3324 4.56.78.......3$ + 0040 3434670a 0a394100 6768696a 6b6c0000 44g..9A.ghijkl.. +Contents of section .options: + 0000 01200000 00000000 80000000 00000000 . .............. + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000000 00000000 00000000 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/comments.c b/tools/asm-processor/tests/comments.c new file mode 100644 index 0000000..4c93669 --- /dev/null +++ b/tools/asm-processor/tests/comments.c @@ -0,0 +1,6 @@ +const char before[] = "^"; +GLOBAL_ASM( +.rdata +.asciz "aaaa /* bbbb */ # cccc", /**//**//**//**/ /*/ "xxxx" /*/ /* dddd " eeee */ "# ffff" # gggg "hhhh" /* iiii */ +) +const char after[] = "$"; diff --git a/tools/asm-processor/tests/comments.objdump b/tools/asm-processor/tests/comments.objdump new file mode 100644 index 0000000..246df20 --- /dev/null +++ b/tools/asm-processor/tests/comments.objdump @@ -0,0 +1,21 @@ + +tests/comments.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .rodata 00000030 .rodata +00000000 g O .rodata 00000002 before +00000024 g O .rodata 00000002 after + + +Contents of section .rodata: + 0000 5e000000 61616161 202f2a20 62626262 ^...aaaa /* bbbb + 0010 202a2f20 23206363 63630023 20666666 */ # cccc.# fff + 0020 66000000 24000000 00000000 00000000 f...$........... +Contents of section .options: + 0000 01200000 00000000 00000000 00000000 . .............. + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/force.c b/tools/asm-processor/tests/force.c new file mode 100644 index 0000000..03b630c --- /dev/null +++ b/tools/asm-processor/tests/force.c @@ -0,0 +1,17 @@ +// COMPILE-FLAGS: -O2 +// ASMP-FLAGS: --convert-statics=global-with-filename --force +static int xtext(int a, int b, int c); +const int rodata1[] = {1}; +static const int rodata2[] = {2}; +int data1[] = {3}; +static int data2[] = {4}; +int bss1; +static int bss2; + +static int xtext(int a, int b, int c) { + return 1; +} + +void baz(void) { + xtext(bss2, rodata2[0], data2[0]); +} diff --git a/tools/asm-processor/tests/force.objdump b/tools/asm-processor/tests/force.objdump new file mode 100644 index 0000000..7ef7024 --- /dev/null +++ b/tools/asm-processor/tests/force.objdump @@ -0,0 +1,47 @@ + +tests/force.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000050 .text +00000000 l d .rodata 00000010 .rodata +00000000 l d .data 00000010 .data +00000000 l d .bss 00000010 .bss +00000000 g O .rodata 00000004 rodata1 +00000000 g O .data 00000004 data1 +00000000 g O .bss 00000004 bss1 +00000014 g F .text 00000034 baz +00000004 g O .rodata 00000000 tests/force.o:rodata2 +00000004 g O .data 00000000 tests/force.o:data2 +00000004 g O .bss 00000000 tests/force.o:bss2 +00000000 g F .text 00000000 tests/force.o:xtext + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +0000001c R_MIPS_HI16 .bss +00000034 R_MIPS_LO16 .bss +00000020 R_MIPS_HI16 .rodata +0000002c R_MIPS_LO16 .rodata +00000024 R_MIPS_HI16 .data +00000028 R_MIPS_LO16 .data +00000030 R_MIPS_26 .text + + +Contents of section .text: + 0000 afa40000 afa50004 afa60008 03e00008 ................ + 0010 24020001 27bdffe8 afbf0014 3c040000 $...'.......<... + 0020 3c050000 3c060000 8cc60004 8ca50004 <...<........... + 0030 0c000000 8c840004 8fbf0014 27bd0018 ............'... + 0040 03e00008 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 00000001 00000002 00000000 00000000 ................ +Contents of section .data: + 0000 00000003 00000004 00000000 00000000 ................ +Contents of section .options: + 0000 01200000 00000000 a0000074 00000000 . .........t.... + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a0000074 00000000 00000000 00000000 ...t............ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/kpic-o1.c b/tools/asm-processor/tests/kpic-o1.c new file mode 100644 index 0000000..4d3346d --- /dev/null +++ b/tools/asm-processor/tests/kpic-o1.c @@ -0,0 +1,93 @@ +// COMPILE-FLAGS: -O1 -KPIC +GLOBAL_ASM( +glabel foo +addiu $a0, $a0, 1 +addiu $a0, $a0, 2 +addiu $a0, $a0, 3 +addiu $a0, $a0, 4 +addiu $a0, $a0, 5 +addiu $a0, $a0, 6 +addiu $a0, $a0, 7 +addiu $a0, $a0, 8 +addiu $a0, $a0, 9 +addiu $a0, $a0, 10 +addiu $a0, $a0, 11 +addiu $a0, $a0, 12 +) +GLOBAL_ASM( +.late_rodata +.float 1 +.text +glabel float_fn +addiu $a0, $a0, 13 +addiu $a0, $a0, 14 +addiu $a0, $a0, 15 +addiu $a0, $a0, 16 +addiu $a0, $a0, 17 +addiu $a0, $a0, 18 +addiu $a0, $a0, 19 +addiu $a0, $a0, 20 +addiu $a0, $a0, 21 +addiu $a0, $a0, 22 +addiu $a0, $a0, 23 +addiu $a0, $a0, 24 +addiu $a0, $a0, 25 +addiu $a0, $a0, 26 +addiu $a0, $a0, 27 +addiu $a0, $a0, 28 +addiu $a0, $a0, 29 +addiu $a0, $a0, 30 +) +GLOBAL_ASM( +.late_rodata +.late_rodata_alignment 4 +.float 2 +.double 1 +.double 2 +.double 3 +.double 4 +.double 5 +.double 6 +.double 7 +.double 8 +.text +glabel doubles +addiu $a0, $a0, 31 +addiu $a0, $a0, 32 +addiu $a0, $a0, 33 +addiu $a0, $a0, 34 +addiu $a0, $a0, 35 +addiu $a0, $a0, 36 +addiu $a0, $a0, 37 +addiu $a0, $a0, 38 +addiu $a0, $a0, 39 +addiu $a0, $a0, 40 +addiu $a0, $a0, 41 +addiu $a0, $a0, 42 +addiu $a0, $a0, 43 +addiu $a0, $a0, 44 +addiu $a0, $a0, 45 +addiu $a0, $a0, 46 +addiu $a0, $a0, 47 +addiu $a0, $a0, 48 +addiu $a0, $a0, 49 +addiu $a0, $a0, 50 +addiu $a0, $a0, 51 +addiu $a0, $a0, 52 +addiu $a0, $a0, 53 +addiu $a0, $a0, 54 +addiu $a0, $a0, 55 +addiu $a0, $a0, 56 +addiu $a0, $a0, 57 +addiu $a0, $a0, 58 +addiu $a0, $a0, 59 +addiu $a0, $a0, 60 +addiu $a0, $a0, 61 +addiu $a0, $a0, 62 +addiu $a0, $a0, 63 +addiu $a0, $a0, 64 +addiu $a0, $a0, 65 +addiu $a0, $a0, 66 +addiu $a0, $a0, 67 +addiu $a0, $a0, 68 +) diff --git a/tools/asm-processor/tests/kpic-o1.objdump b/tools/asm-processor/tests/kpic-o1.objdump new file mode 100644 index 0000000..6e33675 --- /dev/null +++ b/tools/asm-processor/tests/kpic-o1.objdump @@ -0,0 +1,46 @@ + +tests/kpic-o1.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000110 .text +00000000 l d .rodata 00000050 .rodata +00000000 g F .text 00000030 foo +00000030 g F .text 00000048 float_fn +00000078 g F .text 00000098 doubles +00000000 O *UND* 00000000 _gp_disp + + +RELOCATION RECORDS FOR [.text]: (none) + +Contents of section .text: + 0000 24840001 24840002 24840003 24840004 $...$...$...$... + 0010 24840005 24840006 24840007 24840008 $...$...$...$... + 0020 24840009 2484000a 2484000b 2484000c $...$...$...$... + 0030 2484000d 2484000e 2484000f 24840010 $...$...$...$... + 0040 24840011 24840012 24840013 24840014 $...$...$...$... + 0050 24840015 24840016 24840017 24840018 $...$...$...$... + 0060 24840019 2484001a 2484001b 2484001c $...$...$...$... + 0070 2484001d 2484001e 2484001f 24840020 $...$...$...$.. + 0080 24840021 24840022 24840023 24840024 $..!$.."$..#$..$ + 0090 24840025 24840026 24840027 24840028 $..%$..&$..'$..( + 00a0 24840029 2484002a 2484002b 2484002c $..)$..*$..+$.., + 00b0 2484002d 2484002e 2484002f 24840030 $..-$...$../$..0 + 00c0 24840031 24840032 24840033 24840034 $..1$..2$..3$..4 + 00d0 24840035 24840036 24840037 24840038 $..5$..6$..7$..8 + 00e0 24840039 2484003a 2484003b 2484003c $..9$..:$..;$..< + 00f0 2484003d 2484003e 2484003f 24840040 $..=$..>$..?$..@ + 0100 24840041 24840042 24840043 24840044 $..A$..B$..C$..D +Contents of section .rodata: + 0000 3f800000 40000000 3ff00000 00000000 ?...@...?....... + 0010 40000000 00000000 40080000 00000000 @.......@....... + 0020 40100000 00000000 40140000 00000000 @.......@....... + 0030 40180000 00000000 401c0000 00000000 @.......@....... + 0040 40200000 00000000 00000000 00000000 @ .............. +Contents of section .options: + 0000 01200000 00000000 92000002 00000000 . .............. + 0010 000f0ff0 00000000 00000000 00000000 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 92000012 00000000 000f0ff0 00000000 ................ + 0010 00000000 00000000 ........ diff --git a/tools/asm-processor/tests/kpic-o2.c b/tools/asm-processor/tests/kpic-o2.c new file mode 100644 index 0000000..f037341 --- /dev/null +++ b/tools/asm-processor/tests/kpic-o2.c @@ -0,0 +1,92 @@ +// COMPILE-FLAGS: -O2 -KPIC +GLOBAL_ASM( +glabel foo +addiu $a0, $a0, 1 +addiu $a0, $a0, 2 +addiu $a0, $a0, 3 +addiu $a0, $a0, 4 +addiu $a0, $a0, 5 +addiu $a0, $a0, 6 +addiu $a0, $a0, 7 +addiu $a0, $a0, 8 +addiu $a0, $a0, 9 +addiu $a0, $a0, 10 +addiu $a0, $a0, 11 +addiu $a0, $a0, 12 +) +GLOBAL_ASM( +.late_rodata +.float 1 +.text +glabel float_fn +addiu $a0, $a0, 13 +addiu $a0, $a0, 14 +addiu $a0, $a0, 15 +addiu $a0, $a0, 16 +addiu $a0, $a0, 17 +addiu $a0, $a0, 18 +addiu $a0, $a0, 19 +addiu $a0, $a0, 20 +addiu $a0, $a0, 21 +addiu $a0, $a0, 22 +addiu $a0, $a0, 23 +addiu $a0, $a0, 24 +addiu $a0, $a0, 25 +addiu $a0, $a0, 26 +addiu $a0, $a0, 27 +addiu $a0, $a0, 28 +addiu $a0, $a0, 29 +addiu $a0, $a0, 30 +) +GLOBAL_ASM( +.late_rodata +.float 2 +.double 1 +.double 2 +.double 3 +.double 4 +.double 5 +.double 6 +.double 7 +.double 8 +.text +glabel doubles +addiu $a0, $a0, 31 +addiu $a0, $a0, 32 +addiu $a0, $a0, 33 +addiu $a0, $a0, 34 +addiu $a0, $a0, 35 +addiu $a0, $a0, 36 +addiu $a0, $a0, 37 +addiu $a0, $a0, 38 +addiu $a0, $a0, 39 +addiu $a0, $a0, 40 +addiu $a0, $a0, 41 +addiu $a0, $a0, 42 +addiu $a0, $a0, 43 +addiu $a0, $a0, 44 +addiu $a0, $a0, 45 +addiu $a0, $a0, 46 +addiu $a0, $a0, 47 +addiu $a0, $a0, 48 +addiu $a0, $a0, 49 +addiu $a0, $a0, 50 +addiu $a0, $a0, 51 +addiu $a0, $a0, 52 +addiu $a0, $a0, 53 +addiu $a0, $a0, 54 +addiu $a0, $a0, 55 +addiu $a0, $a0, 56 +addiu $a0, $a0, 57 +addiu $a0, $a0, 58 +addiu $a0, $a0, 59 +addiu $a0, $a0, 60 +addiu $a0, $a0, 61 +addiu $a0, $a0, 62 +addiu $a0, $a0, 63 +addiu $a0, $a0, 64 +addiu $a0, $a0, 65 +addiu $a0, $a0, 66 +addiu $a0, $a0, 67 +addiu $a0, $a0, 68 +) diff --git a/tools/asm-processor/tests/kpic-o2.objdump b/tools/asm-processor/tests/kpic-o2.objdump new file mode 100644 index 0000000..abf87ae --- /dev/null +++ b/tools/asm-processor/tests/kpic-o2.objdump @@ -0,0 +1,46 @@ + +tests/kpic-o2.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000110 .text +00000000 l d .rodata 00000050 .rodata +00000000 g F .text 00000030 foo +00000030 g F .text 00000048 float_fn +00000078 g F .text 00000098 doubles +00000000 O *UND* 00000000 _gp_disp + + +RELOCATION RECORDS FOR [.text]: (none) + +Contents of section .text: + 0000 24840001 24840002 24840003 24840004 $...$...$...$... + 0010 24840005 24840006 24840007 24840008 $...$...$...$... + 0020 24840009 2484000a 2484000b 2484000c $...$...$...$... + 0030 2484000d 2484000e 2484000f 24840010 $...$...$...$... + 0040 24840011 24840012 24840013 24840014 $...$...$...$... + 0050 24840015 24840016 24840017 24840018 $...$...$...$... + 0060 24840019 2484001a 2484001b 2484001c $...$...$...$... + 0070 2484001d 2484001e 2484001f 24840020 $...$...$...$.. + 0080 24840021 24840022 24840023 24840024 $..!$.."$..#$..$ + 0090 24840025 24840026 24840027 24840028 $..%$..&$..'$..( + 00a0 24840029 2484002a 2484002b 2484002c $..)$..*$..+$.., + 00b0 2484002d 2484002e 2484002f 24840030 $..-$...$../$..0 + 00c0 24840031 24840032 24840033 24840034 $..1$..2$..3$..4 + 00d0 24840035 24840036 24840037 24840038 $..5$..6$..7$..8 + 00e0 24840039 2484003a 2484003b 2484003c $..9$..:$..;$..< + 00f0 2484003d 2484003e 2484003f 24840040 $..=$..>$..?$..@ + 0100 24840041 24840042 24840043 24840044 $..A$..B$..C$..D +Contents of section .rodata: + 0000 3f800000 40000000 3ff00000 00000000 ?...@...?....... + 0010 40000000 00000000 40080000 00000000 @.......@....... + 0020 40100000 00000000 40140000 00000000 @.......@....... + 0030 40180000 00000000 401c0000 00000000 @.......@....... + 0040 40200000 00000000 00000000 00000000 @ .............. +Contents of section .options: + 0000 01200000 00000000 92000002 00000000 . .............. + 0010 000f0ff0 00000000 00000000 00000000 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 92000012 00000000 000f0ff0 00000000 ................ + 0010 00000000 00000000 ........ diff --git a/tools/asm-processor/tests/label-sameline.c b/tools/asm-processor/tests/label-sameline.c new file mode 100644 index 0000000..a35b43d --- /dev/null +++ b/tools/asm-processor/tests/label-sameline.c @@ -0,0 +1,7 @@ +GLOBAL_ASM( +.rdata +.word 0x12345678 +glabel blah +.word blah2 + /*a*/ blah2: /*b*/ .word blah /*c*/ +) diff --git a/tools/asm-processor/tests/label-sameline.objdump b/tools/asm-processor/tests/label-sameline.objdump new file mode 100644 index 0000000..1f1aacf --- /dev/null +++ b/tools/asm-processor/tests/label-sameline.objdump @@ -0,0 +1,25 @@ + +tests/label-sameline.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .rodata 00000010 .rodata +00000000 l d .rodata 00000000 +00000004 g .rodata 00000000 blah + + +RELOCATION RECORDS FOR [.rodata]: +OFFSET TYPE VALUE +00000004 R_MIPS_32 +00000008 R_MIPS_32 blah + + +Contents of section .rodata: + 0000 12345678 00000008 00000000 00000000 .4Vx............ +Contents of section .options: + 0000 01200000 00000000 00000000 00000000 . .............. + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/large.c b/tools/asm-processor/tests/large.c new file mode 100644 index 0000000..4ffb4ac --- /dev/null +++ b/tools/asm-processor/tests/large.c @@ -0,0 +1,164 @@ + +GLOBAL_ASM( +glabel test + +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 +addiu $sp, $sp, -24 + sw $zero, 4($sp) +lw $t6, 4($sp) +addu $t7, $a0, $t6 +sb $zero, ($t7) +lw $t8, 4($sp) +addiu $t9, $t8, 1 +slt $at, $t9, $a1 + sw $t9, 4($sp) + nop +jr $ra + addiu $sp, $sp, 24 + +) + +void foo(void) {} diff --git a/tools/asm-processor/tests/large.objdump b/tools/asm-processor/tests/large.objdump new file mode 100644 index 0000000..17409a7 --- /dev/null +++ b/tools/asm-processor/tests/large.objdump @@ -0,0 +1,58 @@ + +tests/large.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000280 .text +00000270 g F .text 00000010 foo +00000000 g F .text 00000270 test + + +Contents of section .text: + 0000 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0010 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0020 afb90004 00000000 03e00008 27bd0018 ............'... + 0030 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0040 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0050 afb90004 00000000 03e00008 27bd0018 ............'... + 0060 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0070 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0080 afb90004 00000000 03e00008 27bd0018 ............'... + 0090 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 00a0 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 00b0 afb90004 00000000 03e00008 27bd0018 ............'... + 00c0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 00d0 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 00e0 afb90004 00000000 03e00008 27bd0018 ............'... + 00f0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0100 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0110 afb90004 00000000 03e00008 27bd0018 ............'... + 0120 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0130 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0140 afb90004 00000000 03e00008 27bd0018 ............'... + 0150 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0160 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0170 afb90004 00000000 03e00008 27bd0018 ............'... + 0180 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0190 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 01a0 afb90004 00000000 03e00008 27bd0018 ............'... + 01b0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 01c0 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 01d0 afb90004 00000000 03e00008 27bd0018 ............'... + 01e0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 01f0 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0200 afb90004 00000000 03e00008 27bd0018 ............'... + 0210 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0220 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0230 afb90004 00000000 03e00008 27bd0018 ............'... + 0240 27bdffe8 afa00004 8fae0004 008e7821 '.............x! + 0250 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0260 afb90004 00000000 03e00008 27bd0018 ............'... + 0270 03e00008 00000000 03e00008 00000000 ................ +Contents of section .options: + 0000 01200000 00000000 80000000 00000000 . .............. + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a300c032 00000000 00000000 00000000 ...2............ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_align.c b/tools/asm-processor/tests/late_rodata_align.c new file mode 100644 index 0000000..7367c79 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_align.c @@ -0,0 +1,80 @@ +GLOBAL_ASM( +.late_rodata + .float 4.1 + .float 4.2 + .float 4.3 + .float 4.4 +.text +glabel a + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float foo(void) { "foo"; return 1.1f; } + +GLOBAL_ASM( +.late_rodata +.late_rodata_alignment 4 + .float 5.1 + .float 5.2 + .float 5.3 + .float 5.4 +.text +glabel b + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float bar(void) { "bar"; return 1.2f; } + +GLOBAL_ASM( +.late_rodata +.late_rodata_alignment 8 + .float 6.1 + .float 6.2 + .float 6.3 + .float 6.4 + .float 6.5 +.text +glabel c + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + diff --git a/tools/asm-processor/tests/late_rodata_align.objdump b/tools/asm-processor/tests/late_rodata_align.objdump new file mode 100644 index 0000000..87c05e8 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_align.objdump @@ -0,0 +1,51 @@ + +tests/late_rodata_align.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000000f0 .text +00000000 l d .rodata 00000050 .rodata +00000040 g F .text 0000001c foo +00000090 g F .text 0000001c bar +00000000 g F .text 00000040 a +0000005c g F .text 00000034 b +000000ac g F .text 00000038 c + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000040 R_MIPS_HI16 .rodata +00000048 R_MIPS_LO16 .rodata +00000090 R_MIPS_HI16 .rodata +00000098 R_MIPS_LO16 .rodata + + +Contents of section .text: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00000000 00000000 00000000 ................ + 0020 00000000 00000000 00000000 00000000 ................ + 0030 00000000 00000000 00000000 00000000 ................ + 0040 3c010000 03e00008 c4200018 03e00008 <........ ...... + 0050 00000000 03e00008 00000000 00000000 ................ + 0060 00000000 00000000 00000000 00000000 ................ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 3c010000 03e00008 c420002c 03e00008 <........ .,.... + 00a0 00000000 03e00008 00000000 00000000 ................ + 00b0 00000000 00000000 00000000 00000000 ................ + 00c0 00000000 00000000 00000000 00000000 ................ + 00d0 00000000 00000000 00000000 00000000 ................ + 00e0 00000000 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 666f6f00 62617200 40833333 40866666 foo.bar.@.33@.ff + 0010 4089999a 408ccccd 3f8ccccd 40a33333 @...@...?...@.33 + 0020 40a66666 40a9999a 40accccd 3f99999a @.ff@...@...?... + 0030 40c33333 40c66666 40c9999a 40cccccd @.33@.ff@...@... + 0040 40d00000 00000000 00000000 00000000 @............... +Contents of section .options: + 0000 01200000 00000000 80000002 00000000 . .............. + 0010 000005f1 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000002 00000000 000005f1 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_doubles.c b/tools/asm-processor/tests/late_rodata_doubles.c new file mode 100644 index 0000000..0a27b41 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles.c @@ -0,0 +1,83 @@ +GLOBAL_ASM( +.late_rodata + .float 4.1 +.text +glabel a + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float foo(void) { + return 4.15f; +} + +GLOBAL_ASM( +.late_rodata + .float 4.2 + .word 0 + .double 4.3 +.text +glabel b + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float bar(void) { + return 4.4f; +} + +GLOBAL_ASM( +.late_rodata + .float 4.55 + .double 4.6 +.text +glabel c + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float baz(void) { + return 4.6f; +} diff --git a/tools/asm-processor/tests/late_rodata_doubles.objdump b/tools/asm-processor/tests/late_rodata_doubles.objdump new file mode 100644 index 0000000..84d7e67 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles.objdump @@ -0,0 +1,55 @@ + +tests/late_rodata_doubles.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000120 .text +00000000 l d .rodata 00000030 .rodata +00000040 g F .text 0000001c foo +0000009c g F .text 0000001c bar +000000f8 g F .text 0000001c baz +00000000 g F .text 00000040 a +0000005c g F .text 00000040 b +000000b8 g F .text 00000040 c + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000040 R_MIPS_HI16 .rodata +00000048 R_MIPS_LO16 .rodata +0000009c R_MIPS_HI16 .rodata +000000a4 R_MIPS_LO16 .rodata +000000f8 R_MIPS_HI16 .rodata +00000100 R_MIPS_LO16 .rodata + + +Contents of section .text: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00000000 00000000 00000000 ................ + 0020 00000000 00000000 00000000 00000000 ................ + 0030 00000000 00000000 00000000 00000000 ................ + 0040 3c010000 03e00008 c4200004 03e00008 <........ ...... + 0050 00000000 03e00008 00000000 00000000 ................ + 0060 00000000 00000000 00000000 00000000 ................ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 00000000 00000000 00000000 3c010000 ............<... + 00a0 03e00008 c4200018 03e00008 00000000 ..... .......... + 00b0 03e00008 00000000 00000000 00000000 ................ + 00c0 00000000 00000000 00000000 00000000 ................ + 00d0 00000000 00000000 00000000 00000000 ................ + 00e0 00000000 00000000 00000000 00000000 ................ + 00f0 00000000 00000000 3c010000 03e00008 ........<....... + 0100 c4200028 03e00008 00000000 03e00008 . .(............ + 0110 00000000 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 40833333 4084cccd 40866666 00000000 @.33@...@.ff.... + 0010 40113333 33333333 408ccccd 4091999a @.333333@...@... + 0020 40126666 66666666 40933333 00000000 @.ffffff@.33.... +Contents of section .options: + 0000 01200000 00000000 80000002 00000000 . .............. + 0010 000000f1 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000002 00000000 000000f1 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_doubles_mips1.c b/tools/asm-processor/tests/late_rodata_doubles_mips1.c new file mode 100644 index 0000000..b97261f --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles_mips1.c @@ -0,0 +1,86 @@ +// COMPILE-FLAGS: -O2 +// COMPILE-ISET: -mips1 +// exact copy of late_rodata_doubles.c except for the -mips1 -O2 additions +GLOBAL_ASM( +.late_rodata + .float 4.1 +.text +glabel a + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float foo(void) { + return 4.15f; +} + +GLOBAL_ASM( +.late_rodata + .float 4.2 + .word 0 + .double 4.3 +.text +glabel b + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float bar(void) { + return 4.4f; +} + +GLOBAL_ASM( +.late_rodata + .float 4.55 + .double 4.6 +.text +glabel c + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +float baz(void) { + return 4.6f; +} diff --git a/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump b/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump new file mode 100644 index 0000000..8fac85f --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump @@ -0,0 +1,52 @@ + +tests/late_rodata_doubles_mips1.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000000f0 .text +00000000 l d .rodata 00000030 .rodata +00000040 g F .text 00000010 foo +00000090 g F .text 00000010 bar +000000e0 g F .text 00000010 baz +00000000 g F .text 00000040 a +00000050 g F .text 00000040 b +000000a0 g F .text 00000040 c + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000040 R_MIPS_HI16 .rodata +00000044 R_MIPS_LO16 .rodata +00000090 R_MIPS_HI16 .rodata +00000094 R_MIPS_LO16 .rodata +000000e0 R_MIPS_HI16 .rodata +000000e4 R_MIPS_LO16 .rodata + + +Contents of section .text: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00000000 00000000 00000000 ................ + 0020 00000000 00000000 00000000 00000000 ................ + 0030 00000000 00000000 00000000 00000000 ................ + 0040 3c010000 c4200004 03e00008 00000000 <.... .......... + 0050 00000000 00000000 00000000 00000000 ................ + 0060 00000000 00000000 00000000 00000000 ................ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 3c010000 c4200018 03e00008 00000000 <.... .......... + 00a0 00000000 00000000 00000000 00000000 ................ + 00b0 00000000 00000000 00000000 00000000 ................ + 00c0 00000000 00000000 00000000 00000000 ................ + 00d0 00000000 00000000 00000000 00000000 ................ + 00e0 3c010000 c4200028 03e00008 00000000 <.... .(........ +Contents of section .rodata: + 0000 40833333 4084cccd 40866666 00000000 @.33@...@.ff.... + 0010 40113333 33333333 408ccccd 4091999a @.333333@...@... + 0020 40126666 66666666 40933333 00000000 @.ffffff@.33.... +Contents of section .options: + 0000 01200000 00000000 80000002 00000000 . .............. + 0010 000c0011 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000002 00000000 000c0011 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_jtbl.c b/tools/asm-processor/tests/late_rodata_jtbl.c new file mode 100644 index 0000000..3c2a5bb --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl.c @@ -0,0 +1,153 @@ +// COMPILE-FLAGS: -O2 +GLOBAL_ASM( +.late_rodata +.double 1 +.double 2 +.double 3 +.double 4 +.double 5 +.double 6 +.double 7 +.double 8 +.text +glabel doubles1 +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +) + +float a(void) { return 1.1f; } + +GLOBAL_ASM( +.late_rodata +.float 1 +.double 2 +.double 3 +.double 4 +.double 5 +.double 6 +.double 7 +.double 8 +.double 9 +.float 10 +.text +glabel doubles2 +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +) + +GLOBAL_ASM( +glabel a2 +move $a0, $a0 +nop +nop +nop +jr $ra +move $a0, $a0 +) + +GLOBAL_ASM( +.late_rodata + +glabel jtbl +.word case0, case1, case2, case3, case4, case5, case6, case7, case8, case9, case10 +.word case11, case12, case13, case14, case15, case16, case17, case18, case19, case20 +.word case21, case22, case23, case24, case25, case26 + +.text +glabel foo +sltiu $at, $a0, 0xa +beqz $at, .L756E659B + sll $t7, $a0, 2 +lui $at, %hi(jtbl) +addu $at, $at, $t7 +lw $t7, %lo(jtbl)($at) +jr $t7 + nop +case0: addiu $a0, $a0, 1 +case1: addiu $a0, $a0, 1 +case2: addiu $a0, $a0, 1 +case3: addiu $a0, $a0, 1 +case4: addiu $a0, $a0, 1 +case5: addiu $a0, $a0, 1 +case6: addiu $a0, $a0, 1 +case7: addiu $a0, $a0, 1 +case8: addiu $a0, $a0, 1 +case9: addiu $a0, $a0, 1 +case10: addiu $a0, $a0, 1 +case11: addiu $a0, $a0, 1 +case12: addiu $a0, $a0, 1 +case13: addiu $a0, $a0, 1 +case14: addiu $a0, $a0, 1 +case15: addiu $a0, $a0, 1 +case16: addiu $a0, $a0, 1 +case17: addiu $a0, $a0, 1 +case18: addiu $a0, $a0, 1 +case19: addiu $a0, $a0, 1 +case20: addiu $a0, $a0, 1 +case21: addiu $a0, $a0, 1 +case22: addiu $a0, $a0, 1 +case23: addiu $a0, $a0, 1 +case24: addiu $a0, $a0, 1 +case25: addiu $a0, $a0, 1 +case26: +jr $ra + addiu $v0, $a0, 1 + +.L756E659B: +addiu $v0, $zero, 2 +jr $ra + nop +) + +GLOBAL_ASM( +glabel b2 +move $a0, $a0 +nop +nop +jr $ra +move $a0, $a0 +) + +float b(void) { return 1.2f; } diff --git a/tools/asm-processor/tests/late_rodata_jtbl.objdump b/tools/asm-processor/tests/late_rodata_jtbl.objdump new file mode 100644 index 0000000..44bb6e8 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl.objdump @@ -0,0 +1,110 @@ + +tests/late_rodata_jtbl.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000001a0 .text +00000000 l d .rodata 00000100 .rodata +00000000 l d .text 00000000 +0000005c g F .text 0000000c a +0000018c g F .text 0000000c b +00000000 g F .text 0000005c doubles1 +00000068 g F .text 0000005c doubles2 +000000c4 g F .text 00000018 a2 +000000dc g F .text 0000009c foo +0000008c g .rodata 00000000 jtbl +00000178 g F .text 00000014 b2 + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +0000005c R_MIPS_HI16 .rodata +00000064 R_MIPS_LO16 .rodata +0000018c R_MIPS_HI16 .rodata +00000194 R_MIPS_LO16 .rodata +000000e8 R_MIPS_HI16 jtbl +000000f0 R_MIPS_LO16 jtbl + + +RELOCATION RECORDS FOR [.rodata]: +OFFSET TYPE VALUE +0000008c R_MIPS_32 +00000090 R_MIPS_32 +00000094 R_MIPS_32 +00000098 R_MIPS_32 +0000009c R_MIPS_32 +000000a0 R_MIPS_32 +000000a4 R_MIPS_32 +000000a8 R_MIPS_32 +000000ac R_MIPS_32 +000000b0 R_MIPS_32 +000000b4 R_MIPS_32 +000000b8 R_MIPS_32 +000000bc R_MIPS_32 +000000c0 R_MIPS_32 +000000c4 R_MIPS_32 +000000c8 R_MIPS_32 +000000cc R_MIPS_32 +000000d0 R_MIPS_32 +000000d4 R_MIPS_32 +000000d8 R_MIPS_32 +000000dc R_MIPS_32 +000000e0 R_MIPS_32 +000000e4 R_MIPS_32 +000000e8 R_MIPS_32 +000000ec R_MIPS_32 +000000f0 R_MIPS_32 +000000f4 R_MIPS_32 + + +Contents of section .text: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00000000 00000000 00000000 ................ + 0020 00000000 00000000 00000000 00000000 ................ + 0030 00000000 00000000 00000000 00000000 ................ + 0040 00000000 00000000 00000000 00000000 ................ + 0050 00000000 00000000 00000000 3c010000 ............<... + 0060 03e00008 c4200040 00000000 00000000 ..... .@........ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 00000000 00000000 00000000 00000000 ................ + 00a0 00000000 00000000 00000000 00000000 ................ + 00b0 00000000 00000000 00000000 00000000 ................ + 00c0 00000000 00802025 00000000 00000000 ...... %........ + 00d0 00000000 03e00008 00802025 2c81000a .......... %,... + 00e0 10200022 00047880 3c010000 002f0821 . ."..x.<..../.! + 00f0 8c2f0000 01e00008 00000000 24840001 ./..........$... + 0100 24840001 24840001 24840001 24840001 $...$...$...$... + 0110 24840001 24840001 24840001 24840001 $...$...$...$... + 0120 24840001 24840001 24840001 24840001 $...$...$...$... + 0130 24840001 24840001 24840001 24840001 $...$...$...$... + 0140 24840001 24840001 24840001 24840001 $...$...$...$... + 0150 24840001 24840001 24840001 24840001 $...$...$...$... + 0160 24840001 03e00008 24820001 24020002 $.......$...$... + 0170 03e00008 00000000 00802025 00000000 .......... %.... + 0180 00000000 03e00008 00802025 3c010000 .......... %<... + 0190 03e00008 c42000f8 00000000 00000000 ..... .......... +Contents of section .rodata: + 0000 3ff00000 00000000 40000000 00000000 ?.......@....... + 0010 40080000 00000000 40100000 00000000 @.......@....... + 0020 40140000 00000000 40180000 00000000 @.......@....... + 0030 401c0000 00000000 40200000 00000000 @.......@ ...... + 0040 3f8ccccd 3f800000 40000000 00000000 ?...?...@....... + 0050 40080000 00000000 40100000 00000000 @.......@....... + 0060 40140000 00000000 40180000 00000000 @.......@....... + 0070 401c0000 00000000 40200000 00000000 @.......@ ...... + 0080 40220000 00000000 41200000 000000fc @"......A ...... + 0090 00000100 00000104 00000108 0000010c ................ + 00a0 00000110 00000114 00000118 0000011c ................ + 00b0 00000120 00000124 00000128 0000012c ... ...$...(..., + 00c0 00000130 00000134 00000138 0000013c ...0...4...8...< + 00d0 00000140 00000144 00000148 0000014c ...@...D...H...L + 00e0 00000150 00000154 00000158 0000015c ...P...T...X...\ + 00f0 00000160 00000164 3f99999a 00000000 ...`...d?....... +Contents of section .options: + 0000 01200000 00000000 80004002 00000000 . ........@..... + 0010 000000f1 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 8000c016 00000000 000000f1 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_jtbl_mips1.c b/tools/asm-processor/tests/late_rodata_jtbl_mips1.c new file mode 100644 index 0000000..505f4c1 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl_mips1.c @@ -0,0 +1,155 @@ +// COMPILE-FLAGS: -O2 +// COMPILE-ISET: -mips1 +// exact copy of late_rodata_jtbl.c except for the -mips1 addition +GLOBAL_ASM( +.late_rodata +.double 1 +.double 2 +.double 3 +.double 4 +.double 5 +.double 6 +.double 7 +.double 8 +.text +glabel doubles1 +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +) + +float a(void) { return 1.1f; } + +GLOBAL_ASM( +.late_rodata +.float 1 +.double 2 +.double 3 +.double 4 +.double 5 +.double 6 +.double 7 +.double 8 +.double 9 +.float 10 +.text +glabel doubles2 +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +) + +GLOBAL_ASM( +glabel a2 +move $a0, $a0 +nop +nop +nop +jr $ra +move $a0, $a0 +) + +GLOBAL_ASM( +.late_rodata + +glabel jtbl +.word case0, case1, case2, case3, case4, case5, case6, case7, case8, case9, case10 +.word case11, case12, case13, case14, case15, case16, case17, case18, case19, case20 +.word case21, case22, case23, case24, case25, case26 + +.text +glabel foo +sltiu $at, $a0, 0xa +beqz $at, .L756E659B + sll $t7, $a0, 2 +lui $at, %hi(jtbl) +addu $at, $at, $t7 +lw $t7, %lo(jtbl)($at) +jr $t7 + nop +case0: addiu $a0, $a0, 1 +case1: addiu $a0, $a0, 1 +case2: addiu $a0, $a0, 1 +case3: addiu $a0, $a0, 1 +case4: addiu $a0, $a0, 1 +case5: addiu $a0, $a0, 1 +case6: addiu $a0, $a0, 1 +case7: addiu $a0, $a0, 1 +case8: addiu $a0, $a0, 1 +case9: addiu $a0, $a0, 1 +case10: addiu $a0, $a0, 1 +case11: addiu $a0, $a0, 1 +case12: addiu $a0, $a0, 1 +case13: addiu $a0, $a0, 1 +case14: addiu $a0, $a0, 1 +case15: addiu $a0, $a0, 1 +case16: addiu $a0, $a0, 1 +case17: addiu $a0, $a0, 1 +case18: addiu $a0, $a0, 1 +case19: addiu $a0, $a0, 1 +case20: addiu $a0, $a0, 1 +case21: addiu $a0, $a0, 1 +case22: addiu $a0, $a0, 1 +case23: addiu $a0, $a0, 1 +case24: addiu $a0, $a0, 1 +case25: addiu $a0, $a0, 1 +case26: +jr $ra + addiu $v0, $a0, 1 + +.L756E659B: +addiu $v0, $zero, 2 +jr $ra + nop +) + +GLOBAL_ASM( +glabel b2 +move $a0, $a0 +nop +nop +jr $ra +move $a0, $a0 +) + +float b(void) { return 1.2f; } diff --git a/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump b/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump new file mode 100644 index 0000000..d37c8bb --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump @@ -0,0 +1,110 @@ + +tests/late_rodata_jtbl_mips1.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000001a0 .text +00000000 l d .rodata 00000100 .rodata +00000000 l d .text 00000000 +0000005c g F .text 00000010 a +00000190 g F .text 00000010 b +00000000 g F .text 0000005c doubles1 +0000006c g F .text 0000005c doubles2 +000000c8 g F .text 00000018 a2 +000000e0 g F .text 0000009c foo +0000008c g .rodata 00000000 jtbl +0000017c g F .text 00000014 b2 + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +0000005c R_MIPS_HI16 .rodata +00000060 R_MIPS_LO16 .rodata +00000190 R_MIPS_HI16 .rodata +00000194 R_MIPS_LO16 .rodata +000000ec R_MIPS_HI16 jtbl +000000f4 R_MIPS_LO16 jtbl + + +RELOCATION RECORDS FOR [.rodata]: +OFFSET TYPE VALUE +0000008c R_MIPS_32 +00000090 R_MIPS_32 +00000094 R_MIPS_32 +00000098 R_MIPS_32 +0000009c R_MIPS_32 +000000a0 R_MIPS_32 +000000a4 R_MIPS_32 +000000a8 R_MIPS_32 +000000ac R_MIPS_32 +000000b0 R_MIPS_32 +000000b4 R_MIPS_32 +000000b8 R_MIPS_32 +000000bc R_MIPS_32 +000000c0 R_MIPS_32 +000000c4 R_MIPS_32 +000000c8 R_MIPS_32 +000000cc R_MIPS_32 +000000d0 R_MIPS_32 +000000d4 R_MIPS_32 +000000d8 R_MIPS_32 +000000dc R_MIPS_32 +000000e0 R_MIPS_32 +000000e4 R_MIPS_32 +000000e8 R_MIPS_32 +000000ec R_MIPS_32 +000000f0 R_MIPS_32 +000000f4 R_MIPS_32 + + +Contents of section .text: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00000000 00000000 00000000 ................ + 0020 00000000 00000000 00000000 00000000 ................ + 0030 00000000 00000000 00000000 00000000 ................ + 0040 00000000 00000000 00000000 00000000 ................ + 0050 00000000 00000000 00000000 3c010000 ............<... + 0060 c4200040 03e00008 00000000 00000000 . .@............ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 00000000 00000000 00000000 00000000 ................ + 00a0 00000000 00000000 00000000 00000000 ................ + 00b0 00000000 00000000 00000000 00000000 ................ + 00c0 00000000 00000000 00802025 00000000 .......... %.... + 00d0 00000000 00000000 03e00008 00802025 .............. % + 00e0 2c81000a 10200022 00047880 3c010000 ,.... ."..x.<... + 00f0 002f0821 8c2f0000 01e00008 00000000 ./.!./.......... + 0100 24840001 24840001 24840001 24840001 $...$...$...$... + 0110 24840001 24840001 24840001 24840001 $...$...$...$... + 0120 24840001 24840001 24840001 24840001 $...$...$...$... + 0130 24840001 24840001 24840001 24840001 $...$...$...$... + 0140 24840001 24840001 24840001 24840001 $...$...$...$... + 0150 24840001 24840001 24840001 24840001 $...$...$...$... + 0160 24840001 24840001 03e00008 24820001 $...$.......$... + 0170 24020002 03e00008 00000000 00802025 $............. % + 0180 00000000 00000000 03e00008 00802025 .............. % + 0190 3c010000 c42000f8 03e00008 00000000 <.... .......... +Contents of section .rodata: + 0000 3ff00000 00000000 40000000 00000000 ?.......@....... + 0010 40080000 00000000 40100000 00000000 @.......@....... + 0020 40140000 00000000 40180000 00000000 @.......@....... + 0030 401c0000 00000000 40200000 00000000 @.......@ ...... + 0040 3f8ccccd 3f800000 40000000 00000000 ?...?...@....... + 0050 40080000 00000000 40100000 00000000 @.......@....... + 0060 40140000 00000000 40180000 00000000 @.......@....... + 0070 401c0000 00000000 40200000 00000000 @.......@ ...... + 0080 40220000 00000000 41200000 00000100 @"......A ...... + 0090 00000104 00000108 0000010c 00000110 ................ + 00a0 00000114 00000118 0000011c 00000120 ............... + 00b0 00000124 00000128 0000012c 00000130 ...$...(...,...0 + 00c0 00000134 00000138 0000013c 00000140 ...4...8...<...@ + 00d0 00000144 00000148 0000014c 00000150 ...D...H...L...P + 00e0 00000154 00000158 0000015c 00000160 ...T...X...\...` + 00f0 00000164 00000168 3f99999a 00000000 ...d...h?....... +Contents of section .options: + 0000 01200000 00000000 80004002 00000000 . ........@..... + 0010 000000f1 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 8000c016 00000000 000000f1 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_misaligned_doubles.c b/tools/asm-processor/tests/late_rodata_misaligned_doubles.c new file mode 100644 index 0000000..a453dbd --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_misaligned_doubles.c @@ -0,0 +1,77 @@ +GLOBAL_ASM( +.late_rodata + .float 4.01 + .word 0 + .double 4.02 +.text +glabel a + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +double foo(void) { return 4.03; } + +GLOBAL_ASM( +.late_rodata + .float 4.04 + .double 4.05 +.text +glabel b + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + +double bar(void) { return 4.06; } +float baz(void) { return 4.07f; } + +GLOBAL_ASM( +.late_rodata + .double 4.08 +.text +glabel c + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +) + diff --git a/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump b/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump new file mode 100644 index 0000000..cdba84d --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump @@ -0,0 +1,56 @@ + +tests/late_rodata_misaligned_doubles.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000120 .text +00000000 l d .rodata 00000040 .rodata +00000040 g F .text 0000001c foo +0000009c g F .text 0000001c bar +000000b8 g F .text 0000001c baz +00000000 g F .text 00000040 a +0000005c g F .text 00000040 b +000000d4 g F .text 00000040 c + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000040 R_MIPS_HI16 .rodata +00000048 R_MIPS_LO16 .rodata +0000009c R_MIPS_HI16 .rodata +000000a4 R_MIPS_LO16 .rodata +000000b8 R_MIPS_HI16 .rodata +000000c0 R_MIPS_LO16 .rodata + + +Contents of section .text: + 0000 00000000 00000000 00000000 00000000 ................ + 0010 00000000 00000000 00000000 00000000 ................ + 0020 00000000 00000000 00000000 00000000 ................ + 0030 00000000 00000000 00000000 00000000 ................ + 0040 3c010000 03e00008 d4200010 03e00008 <........ ...... + 0050 00000000 03e00008 00000000 00000000 ................ + 0060 00000000 00000000 00000000 00000000 ................ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 00000000 00000000 00000000 3c010000 ............<... + 00a0 03e00008 d4200028 03e00008 00000000 ..... .(........ + 00b0 03e00008 00000000 3c010000 03e00008 ........<....... + 00c0 c4200030 03e00008 00000000 03e00008 . .0............ + 00d0 00000000 00000000 00000000 00000000 ................ + 00e0 00000000 00000000 00000000 00000000 ................ + 00f0 00000000 00000000 00000000 00000000 ................ + 0100 00000000 00000000 00000000 00000000 ................ + 0110 00000000 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 408051ec 00000000 4010147a e147ae14 @.Q.....@..z.G.. + 0010 40101eb8 51eb851f 00000000 408147ae @...Q.......@.G. + 0020 40103333 33333333 40103d70 a3d70a3d @.333333@.=p...= + 0030 40823d71 00000000 401051eb 851eb852 @.=q....@.Q....R +Contents of section .options: + 0000 01200000 00000000 80000002 00000000 . .............. + 0010 000000f3 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000002 00000000 000000f3 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/line-continuation-separate-file.s b/tools/asm-processor/tests/line-continuation-separate-file.s new file mode 100644 index 0000000..e130180 --- /dev/null +++ b/tools/asm-processor/tests/line-continuation-separate-file.s @@ -0,0 +1,4 @@ +.rdata + label: .asciiz "1\n\ +2", \ + "34", "56" diff --git a/tools/asm-processor/tests/line-continuation.asmproc.d b/tools/asm-processor/tests/line-continuation.asmproc.d new file mode 100644 index 0000000..687dd1a --- /dev/null +++ b/tools/asm-processor/tests/line-continuation.asmproc.d @@ -0,0 +1,3 @@ +tests/line-continuation.o: tests/line-continuation-separate-file.s + +tests/line-continuation-separate-file.s: diff --git a/tools/asm-processor/tests/line-continuation.c b/tools/asm-processor/tests/line-continuation.c new file mode 100644 index 0000000..d5ab093 --- /dev/null +++ b/tools/asm-processor/tests/line-continuation.c @@ -0,0 +1,22 @@ +void foo(void) { "abcdef"; } + +GLOBAL_ASM( +.rdata + .ascii "AB" \ + "CD", "EF" + .ascii "GH\n\n\n\0\11\222\3333\44444\x1234567\n\nIJK" +) + +void bar(void) { "hello"; } + +GLOBAL_ASM( +.rdata + .asciiz "1\ +2" + .asciiz "34", "56" + .asciiz "78\n\n\n\0\11\222\3333\44444\x1234567\n\n9A" +) + +void baz(void) { "ghijkl"; } + +GLOBAL_ASM("tests/line-continuation-separate-file.s") diff --git a/tools/asm-processor/tests/line-continuation.objdump b/tools/asm-processor/tests/line-continuation.objdump new file mode 100644 index 0000000..038766f --- /dev/null +++ b/tools/asm-processor/tests/line-continuation.objdump @@ -0,0 +1,30 @@ + +tests/line-continuation.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000030 .text +00000000 l d .rodata 00000060 .rodata +00000000 g F .text 00000010 foo +00000010 g F .text 00000010 bar +00000020 g F .text 00000010 baz + + +Contents of section .text: + 0000 03e00008 00000000 03e00008 00000000 ................ + 0010 03e00008 00000000 03e00008 00000000 ................ + 0020 03e00008 00000000 03e00008 00000000 ................ +Contents of section .rodata: + 0000 61626364 65660000 41424344 45464748 abcdef..ABCDEFGH + 0010 0a0a0a00 0992db33 24343467 0a0a494a .......3$44g..IJ + 0020 4b000000 68656c6c 6f000000 31320033 K...hello...12.3 + 0030 34003536 0037380a 0a0a0009 92db3324 4.56.78.......3$ + 0040 3434670a 0a394100 6768696a 6b6c0000 44g..9A.ghijkl.. + 0050 310a3200 33340035 36000000 00000000 1.2.34.56....... +Contents of section .options: + 0000 01200000 00000000 80000000 00000000 . .............. + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000000 00000000 00000000 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/o0.c b/tools/asm-processor/tests/o0.c new file mode 100644 index 0000000..6f8e5e4 --- /dev/null +++ b/tools/asm-processor/tests/o0.c @@ -0,0 +1,28 @@ +// COMPILE-FLAGS: -O0 + +int a(void) { return 1; } +GLOBAL_ASM( +glabel foo +addiu $a0, $a0, 1 +addiu $a0, $a0, 2 +addiu $a0, $a0, 3 +jr $ra +addiu $a0, $a0, 4 +) +float b(void) { return 1.2f; } +GLOBAL_ASM( +.late_rodata +glabel float1 +.float 12.34 + +.text +glabel bar +addiu $a0, $a0, 5 +addiu $a0, $a0, 6 +addiu $a0, $a0, 7 +addiu $a0, $a0, 8 +lui $v0, %hi(float1 + 1) +jr $ra +addiu $v0, $v0, %lo(float1 + 1) +) +float c(void) { return 1.3f; } diff --git a/tools/asm-processor/tests/o0.objdump b/tools/asm-processor/tests/o0.objdump new file mode 100644 index 0000000..f94ec7a --- /dev/null +++ b/tools/asm-processor/tests/o0.objdump @@ -0,0 +1,44 @@ + +tests/o0.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000090 .text +00000000 l d .rodata 00000010 .rodata +00000000 g F .text 0000001c a +00000030 g F .text 00000020 b +0000006c g F .text 00000020 c +0000001c g F .text 00000014 foo +00000050 g F .text 0000001c bar +00000004 g .rodata 00000000 float1 + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000030 R_MIPS_HI16 .rodata +00000034 R_MIPS_LO16 .rodata +0000006c R_MIPS_HI16 .rodata +00000070 R_MIPS_LO16 .rodata +00000060 R_MIPS_HI16 float1 +00000068 R_MIPS_LO16 float1 + + +Contents of section .text: + 0000 24020001 03e00008 00000000 03e00008 $............... + 0010 00000000 03e00008 00000000 24840001 ............$... + 0020 24840002 24840003 03e00008 24840004 $...$.......$... + 0030 3c010000 c4200000 03e00008 00000000 <.... .......... + 0040 03e00008 00000000 03e00008 00000000 ................ + 0050 24840005 24840006 24840007 24840008 $...$...$...$... + 0060 3c020000 03e00008 24420001 3c010000 <.......$B..<... + 0070 c4200008 03e00008 00000000 03e00008 . .............. + 0080 00000000 03e00008 00000000 00000000 ................ +Contents of section .rodata: + 0000 3f99999a 414570a4 3fa66666 00000000 ?...AEp.?.ff.... +Contents of section .options: + 0000 01200000 00000000 80000006 00000000 . .............. + 0010 00000011 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000016 00000000 00000011 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/o2.c b/tools/asm-processor/tests/o2.c new file mode 100644 index 0000000..144a604 --- /dev/null +++ b/tools/asm-processor/tests/o2.c @@ -0,0 +1,26 @@ +// COMPILE-FLAGS: -O2 + +int a(void) { return 1; } +GLOBAL_ASM( +glabel foo +addiu $a0, $a0, 1 +addiu $a0, $a0, 2 +addiu $a0, $a0, 3 +jr $ra +addiu $a0, $a0, 4 +) +float b(void) { return 1.2f; } +GLOBAL_ASM( +.late_rodata +glabel float1 +.float 12.34 + +.text +glabel bar +addiu $a0, $a0, 5 +addiu $a0, $a0, 6 +lui $v0, %hi(float1 + 1) +jr $ra +addiu $v0, $v0, %lo(float1 + 1) +) +float c(void) { return 1.3f; } diff --git a/tools/asm-processor/tests/o2.objdump b/tools/asm-processor/tests/o2.objdump new file mode 100644 index 0000000..61e3fb0 --- /dev/null +++ b/tools/asm-processor/tests/o2.objdump @@ -0,0 +1,40 @@ + +tests/o2.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000050 .text +00000000 l d .rodata 00000010 .rodata +00000000 g F .text 00000008 a +0000001c g F .text 0000000c b +0000003c g F .text 0000000c c +00000008 g F .text 00000014 foo +00000028 g F .text 00000014 bar +00000004 g .rodata 00000000 float1 + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +0000001c R_MIPS_HI16 .rodata +00000024 R_MIPS_LO16 .rodata +0000003c R_MIPS_HI16 .rodata +00000044 R_MIPS_LO16 .rodata +00000030 R_MIPS_HI16 float1 +00000038 R_MIPS_LO16 float1 + + +Contents of section .text: + 0000 03e00008 24020001 24840001 24840002 ....$...$...$... + 0010 24840003 03e00008 24840004 3c010000 $.......$...<... + 0020 03e00008 c4200000 24840005 24840006 ..... ..$...$... + 0030 3c020000 03e00008 24420001 3c010000 <.......$B..<... + 0040 03e00008 c4200008 00000000 00000000 ..... .......... +Contents of section .rodata: + 0000 3f99999a 414570a4 3fa66666 00000000 ?...AEp.?.ff.... +Contents of section .options: + 0000 01200000 00000000 80000006 00000000 . .............. + 0010 00000011 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80000016 00000000 00000011 00000000 ................ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/pascal.objdump b/tools/asm-processor/tests/pascal.objdump new file mode 100644 index 0000000..cb3740f --- /dev/null +++ b/tools/asm-processor/tests/pascal.objdump @@ -0,0 +1,137 @@ + +tests/pascal.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000000e0 .text +00000000 l d .rodata 00000030 .rodata +00000000 l d .data 00000010 .data +00000000 l d .bss 00000010 .bss +00000000 l O .bss 00000000 $dat +00000000 g F .text 0000000c foo +000000d0 g F .text 0000000c bar +0000000c g F .text 00000004 test +00000048 g F .text 00000004 test2 +0000008c g F .text 00000044 test3 +00000000 *UND* 00000000 get +00000000 *UND* 00000000 put +00000000 *UND* 00000000 pascal_close +00000000 *UND* 00000000 fflush +00000000 *UND* 00000000 filesize +00000000 *UND* 00000000 curpos +00000000 *UND* 00000000 seek +00000000 *UND* 00000000 eof +00000000 *UND* 00000000 eoln +00000000 *UND* 00000000 page +00000000 *UND* 00000000 reset +00000000 *UND* 00000000 rewrite +00000000 *UND* 00000000 cos +00000000 *UND* 00000000 exp +00000000 *UND* 00000000 sqrt +00000000 *UND* 00000000 log +00000000 *UND* 00000000 atan +00000000 *UND* 00000000 sin +00000000 *UND* 00000000 __random_float +00000000 *UND* 00000000 clock +00000000 *UND* 00000000 exit +00000000 *UND* 00000000 __date +00000000 *UND* 00000000 __time +00000000 *UND* 00000000 get_arg +00000000 *UND* 00000000 new +00000000 *UND* 00000000 dispose +00000000 *UND* 00000000 initfile +00000000 *UND* 00000000 peek_char +00000000 *UND* 00000000 next_char +00000000 *UND* 00000000 readln +00000000 *UND* 00000000 read_int64 +00000000 *UND* 00000000 read_card64 +00000000 *UND* 00000000 read_integer +00000000 *UND* 00000000 read_cardinal +00000000 *UND* 00000000 read_integer_range +00000000 *UND* 00000000 read_real +00000000 *UND* 00000000 read_double +00000000 *UND* 00000000 read_extended +00000000 *UND* 00000000 read_string +00000000 *UND* 00000000 read_enum +00000000 *UND* 00000000 read_char +00000000 *UND* 00000000 read_char_range +00000000 *UND* 00000000 read_boolean +00000000 *UND* 00000000 read_set +00000000 *UND* 00000000 writeln +00000000 *UND* 00000000 write_int64 +00000000 *UND* 00000000 write_card64 +00000000 *UND* 00000000 write_integer +00000000 *UND* 00000000 write_cardinal +00000000 *UND* 00000000 write_boolean +00000000 *UND* 00000000 write_char +00000000 *UND* 00000000 write_real +00000000 *UND* 00000000 write_double +00000000 *UND* 00000000 write_extended +00000000 *UND* 00000000 write_string +00000000 *UND* 00000000 write_enum +00000000 *UND* 00000000 write_set +00000000 *UND* 00000000 caseerror +00000000 *UND* 00000000 __pc_nloc_goto +00000000 *UND* 00000000 memcpy +00000000 *UND* 00000000 __in_range +00000000 *UND* 00000000 __ll_mul +00000000 *UND* 00000000 __ll_div +00000000 *UND* 00000000 __ull_div +00000000 *UND* 00000000 __ll_mod +00000000 *UND* 00000000 __ll_rem +00000000 *UND* 00000000 __ull_rem +00000000 *UND* 00000000 __ll_lshift +00000000 *UND* 00000000 __ll_rshift +00000000 *UND* 00000000 __ll_to_f +00000000 *UND* 00000000 __ull_to_f +00000000 *UND* 00000000 __ll_to_d +00000000 *UND* 00000000 __ull_to_d +00000000 *UND* 00000000 __f_ll_ll +00000000 *UND* 00000000 __f_to_ull +00000000 *UND* 00000000 __d_to_ll +00000000 *UND* 00000000 __d_to_ull +00000000 *UND* 00000000 round64 +00000000 *UND* 00000000 trunc64 +00000000 *UND* 00000000 max64 +00000000 *UND* 00000000 min64 +00000000 *UND* 00000000 abs64 +00000000 *UND* 00000000 odd64 +00000000 *UND* 00000000 trapNaN +00000000 *UND* 00000008 input +00000000 *UND* 00000008 output +00000000 *UND* 00000008 err +00000000 *UND* 00000008 __Argc + + +RELOCATION RECORDS FOR [.text]: (none) + +RELOCATION RECORDS FOR [.rodata]: (none) + +Contents of section .text: + 0000 00041080 03e00008 00441023 27bdffe8 .........D.#'... + 0010 18a00009 afa00004 8fae0004 008e7821 ..............x! + 0020 a1e00000 8fb80004 27190001 0325082a ........'....%.* + 0030 1420fff9 afb90004 10000001 00000000 . .............. + 0040 03e00008 27bd0018 00000000 00000000 ....'........... + 0050 00000000 00000000 00000000 00000000 ................ + 0060 00000000 00000000 00000000 00000000 ................ + 0070 00000000 00000000 00000000 00000000 ................ + 0080 00000000 00000000 00000000 00000000 ................ + 0090 00000000 00000000 00000000 00000000 ................ + 00a0 00000000 00000000 00000000 00000000 ................ + 00b0 00000000 00000000 00000000 00000000 ................ + 00c0 00000000 00000000 00000000 00000000 ................ + 00d0 00041080 03e00008 00441023 00000000 .........D.#.... +Contents of section .rodata: + 0000 00123123 00456456 00789789 00000001 ..1#.EdV.x...... + 0010 3ff19999 9999999a 00000002 00000003 ?............... + 0020 4000cccc cccccccd 00000000 00000000 @............... +Contents of section .data: + 0000 00002323 00003434 00000000 00000000 ..##..44........ +Contents of section .options: + 0000 01200000 00000000 80004016 00000000 . ........@..... + 0010 000000f0 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a300c036 00000000 000000f0 00000000 ...6............ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/pascal.p b/tools/asm-processor/tests/pascal.p new file mode 100644 index 0000000..0886126 --- /dev/null +++ b/tools/asm-processor/tests/pascal.p @@ -0,0 +1,95 @@ +{ COMPILE-FLAGS: -O2 } + +function foo(x: integer): integer; +begin + foo := x * 3 +end; + +GLOBAL_ASM( +.section .data +.word 0x2323 + +.late_rodata +.word 0x123123 +.word 0x456456 +.word 0x789789 +.text +glabel test +/* 000090 00400090 27BDFFF8 */ addiu $sp, $sp, -24 +/* 000094 00400094 18A00009 */ blez $a1, .L004000BC +/* 000098 00400098 AFA00004 */ sw $zero, 4($sp) +.L0040009C: +/* 00009C 0040009C 8FAE0004 */ lw $t6, 4($sp) +/* 0000A0 004000A0 008E7821 */ addu $t7, $a0, $t6 +/* 0000A4 004000A4 A1E00000 */ sb $zero, ($t7) +/* 0000A8 004000A8 8FB80004 */ lw $t8, 4($sp) +/* 0000AC 004000AC 27190001 */ addiu $t9, $t8, 1 +/* 0000B0 004000B0 0325082A */ slt $at, $t9, $a1 +/* 0000B4 004000B4 1420FFF9 */ bnez $at, .L0040009C +/* 0000B8 004000B8 AFB90004 */ sw $t9, 4($sp) +.L004000BC: +/* 0000BC 004000BC 10000001 */ b .L004000C4 +/* 0000C0 004000C0 00000000 */ nop +.L004000C4: +/* 0000C4 004000C4 03E00008 */ jr $ra +/* 0000C8 004000C8 27BD0008 */ addiu $sp, $sp, 24 +) + +GLOBAL_ASM( +.section .data +.word 0x3434 + +.late_rodata +.word 0x1 +.double 1.1 +.word 0x2, 0x3 +.text +glabel test2 +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +) + +GLOBAL_ASM( +.late_rodata +.double 2.1 +.text +glabel test3 +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +nop +) + +function bar(x: integer): integer; +begin + return x * 3 +end; + diff --git a/tools/asm-processor/tests/static-global.c b/tools/asm-processor/tests/static-global.c new file mode 100644 index 0000000..a7f6169 --- /dev/null +++ b/tools/asm-processor/tests/static-global.c @@ -0,0 +1,33 @@ +// COMPILE-FLAGS: -O2 +// ASMP-FLAGS: --convert-statics=global +static int xtext(int a, int b, int c); +const int rodata1[] = {1}; +static const int rodata2[] = {2}; +int data1[] = {3}; +static int data2[] = {4}; +int bss1; +static int bss2; + +GLOBAL_ASM( +glabel bar +lui $a0, %hi(rodata2) +lw $a0, %lo(rodata2)($a0) +lui $a1, %hi(data2) +lw $a1, %lo(data2)($a0) +lui $a2, %hi(bss2) +lw $a2, %lo(bss2)($a0) +jal xtext +nop +jr $ra +nop +nop +nop +) + +static int xtext(int a, int b, int c) { + return 1; +} + +void baz(void) { + xtext(bss2, rodata2[0], data2[0]); +} diff --git a/tools/asm-processor/tests/static-global.objdump b/tools/asm-processor/tests/static-global.objdump new file mode 100644 index 0000000..a519e4f --- /dev/null +++ b/tools/asm-processor/tests/static-global.objdump @@ -0,0 +1,58 @@ + +tests/static-global.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000080 .text +00000000 l d .rodata 00000010 .rodata +00000000 l d .data 00000010 .data +00000000 l d .bss 00000010 .bss +00000000 g O .rodata 00000004 rodata1 +00000000 g O .data 00000004 data1 +00000000 g O .bss 00000004 bss1 +00000044 g F .text 00000034 baz +00000000 g F .text 00000030 bar +00000004 g O .rodata 00000000 rodata2 +00000004 g O .data 00000000 data2 +00000004 g O .bss 00000000 bss2 +00000030 g F .text 00000000 xtext + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +0000004c R_MIPS_HI16 .bss +00000064 R_MIPS_LO16 .bss +00000050 R_MIPS_HI16 .rodata +0000005c R_MIPS_LO16 .rodata +00000054 R_MIPS_HI16 .data +00000058 R_MIPS_LO16 .data +00000060 R_MIPS_26 .text +00000000 R_MIPS_HI16 rodata2 +00000004 R_MIPS_LO16 rodata2 +00000008 R_MIPS_HI16 data2 +0000000c R_MIPS_LO16 data2 +00000010 R_MIPS_HI16 bss2 +00000014 R_MIPS_LO16 bss2 +00000018 R_MIPS_26 xtext + + +Contents of section .text: + 0000 3c040000 8c840000 3c050000 8c850000 <.......<....... + 0010 3c060000 8c860000 0c000000 00000000 <............... + 0020 03e00008 00000000 00000000 00000000 ................ + 0030 afa40000 afa50004 afa60008 03e00008 ................ + 0040 24020001 27bdffe8 afbf0014 3c040000 $...'.......<... + 0050 3c050000 3c060000 8cc60004 8ca50004 <...<........... + 0060 0c00000c 8c840004 8fbf0014 27bd0018 ............'... + 0070 03e00008 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 00000001 00000002 00000000 00000000 ................ +Contents of section .data: + 0000 00000003 00000004 00000000 00000000 ................ +Contents of section .options: + 0000 01200000 00000000 a0000074 00000000 . .........t.... + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a0000074 00000000 00000000 00000000 ...t............ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/static.c b/tools/asm-processor/tests/static.c new file mode 100644 index 0000000..c265021 --- /dev/null +++ b/tools/asm-processor/tests/static.c @@ -0,0 +1,32 @@ +// COMPILE-FLAGS: -O2 +static int xtext(int a, int b, int c); +const int rodata1[] = {1}; +static const int rodata2[] = {2}; +int data1[] = {3}; +static int data2[] = {4}; +int bss1; +static int bss2; + +GLOBAL_ASM( +glabel bar +lui $a0, %hi(rodata2) +lw $a0, %lo(rodata2)($a0) +lui $a1, %hi(data2) +lw $a1, %lo(data2)($a0) +lui $a2, %hi(bss2) +lw $a2, %lo(bss2)($a0) +jal xtext +nop +jr $ra +nop +nop +nop +) + +static int xtext(int a, int b, int c) { + return 1; +} + +void baz(void) { + xtext(bss2, rodata2[0], data2[0]); +} diff --git a/tools/asm-processor/tests/static.objdump b/tools/asm-processor/tests/static.objdump new file mode 100644 index 0000000..dd62c94 --- /dev/null +++ b/tools/asm-processor/tests/static.objdump @@ -0,0 +1,58 @@ + +tests/static.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 00000080 .text +00000000 l d .rodata 00000010 .rodata +00000000 l d .data 00000010 .data +00000000 l d .bss 00000010 .bss +00000004 l O .rodata 00000000 rodata2 +00000004 l O .data 00000000 data2 +00000004 l O .bss 00000000 bss2 +00000030 l F .text 00000000 xtext +00000000 g O .rodata 00000004 rodata1 +00000000 g O .data 00000004 data1 +00000000 g O .bss 00000004 bss1 +00000044 g F .text 00000034 baz +00000000 g F .text 00000030 bar + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +0000004c R_MIPS_HI16 .bss +00000064 R_MIPS_LO16 .bss +00000050 R_MIPS_HI16 .rodata +0000005c R_MIPS_LO16 .rodata +00000054 R_MIPS_HI16 .data +00000058 R_MIPS_LO16 .data +00000060 R_MIPS_26 .text +00000000 R_MIPS_HI16 rodata2 +00000004 R_MIPS_LO16 rodata2 +00000008 R_MIPS_HI16 data2 +0000000c R_MIPS_LO16 data2 +00000010 R_MIPS_HI16 bss2 +00000014 R_MIPS_LO16 bss2 +00000018 R_MIPS_26 xtext + + +Contents of section .text: + 0000 3c040000 8c840000 3c050000 8c850000 <.......<....... + 0010 3c060000 8c860000 0c000000 00000000 <............... + 0020 03e00008 00000000 00000000 00000000 ................ + 0030 afa40000 afa50004 afa60008 03e00008 ................ + 0040 24020001 27bdffe8 afbf0014 3c040000 $...'.......<... + 0050 3c050000 3c060000 8cc60004 8ca50004 <...<........... + 0060 0c00000c 8c840004 8fbf0014 27bd0018 ............'... + 0070 03e00008 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 00000001 00000002 00000000 00000000 ................ +Contents of section .data: + 0000 00000003 00000004 00000000 00000000 ................ +Contents of section .options: + 0000 01200000 00000000 a0000074 00000000 . .........t.... + 0010 00000000 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a0000074 00000000 00000000 00000000 ...t............ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/test1.c b/tools/asm-processor/tests/test1.c new file mode 100644 index 0000000..475555a --- /dev/null +++ b/tools/asm-processor/tests/test1.c @@ -0,0 +1,71 @@ + +GLOBAL_ASM( +.rdata +.word 0x1212 +) + +GLOBAL_ASM( +.late_rodata +.word 0x123123 +.text +glabel test +/* 000090 00400090 27BDFFF8 */ addiu $sp, $sp, -24 +/* 000094 00400094 18A00009 */ blez $a1, .L004000BC +/* 000098 00400098 AFA00004 */ sw $zero, 4($sp) +.L0040009C: +/* 00009C 0040009C 8FAE0004 */ lw $t6, 4($sp) +/* 0000A0 004000A0 008E7821 */ addu $t7, $a0, $t6 +/* 0000A4 004000A4 A1E00000 */ sb $zero, ($t7) +/* 0000A8 004000A8 8FB80004 */ lw $t8, 4($sp) +/* 0000AC 004000AC 27190001 */ addiu $t9, $t8, 1 +/* 0000B0 004000B0 0325082A */ slt $at, $t9, $a1 +/* 0000B4 004000B4 1420FFF9 */ bnez $at, .L0040009C +/* 0000B8 004000B8 AFB90004 */ sw $t9, 4($sp) +.L004000BC: +/* 0000BC 004000BC 10000001 */ b .L004000C4 +/* 0000C0 004000C0 00000000 */ nop +.L004000C4: +/* 0000C4 004000C4 03E00008 */ jr $ra +/* 0000C8 004000C8 27BD0008 */ addiu $sp, $sp, 24 +) + +char bss1[3]; +GLOBAL_ASM( +.bss +bss2: +.space 3 +) +char bss3[3]; +char bss4[3]; +const int rodata1[2] = {1}; +extern int some_rodata; + +unsigned g(float, int); +unsigned f(void) { + return g(1.1f, some_rodata); +} + +GLOBAL_ASM( +.rdata +glabel some_rodata +.word 0x1313 +.text +.late_rodata +.word 0x321321 +.text +glabel g +/* 0000C0 004000C0 27BDFFE8 */ addiu $sp, $sp, -0x18 +/* 0000C4 004000C4 AFBF0014 */ sw $ra, 0x14($sp) +/* 0000C8 004000C8 240E0004 */ addiu $t6, $zero, 4 +/* 0000CC 004000CC 3C010041 */ lui $at, %hi(D_410100) +/* 0000D0 004000D0 AC2E0100 */ sw $t6, %lo(D_410100)($at) +/* 0000D4 004000D4 0C10002C */ jal func_004000B0 +/* 0000D8 004000D8 00000000 */ nop +/* 0000DC 004000DC 10000001 */ b .L004000E4 +/* 0000E0 004000E0 00000000 */ nop +.L004000E4: +/* 0000E4 004000E4 8FBF0014 */ lw $ra, 0x14($sp) +/* 0000E8 004000E8 27BD0018 */ addiu $sp, $sp, 0x18 +/* 0000EC 004000EC 03E00008 */ jr $ra +/* 0000F0 004000F0 00000000 */ nop +) diff --git a/tools/asm-processor/tests/test1.objdump b/tools/asm-processor/tests/test1.objdump new file mode 100644 index 0000000..b97ae46 --- /dev/null +++ b/tools/asm-processor/tests/test1.objdump @@ -0,0 +1,54 @@ + +tests/test1.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000000b0 .text +00000000 l d .rodata 00000020 .rodata +00000000 l d .bss 00000010 .bss +00000000 g O .bss 00000003 bss1 +00000008 g O .bss 00000003 bss3 +0000000c g O .bss 00000003 bss4 +00000004 g O .rodata 00000008 rodata1 +0000003c g F .text 0000003c f +00000000 g F .text 0000003c test +0000000c g .rodata 00000000 some_rodata +00000078 g F .text 00000004 g +00000000 *UND* 00000000 D_410100 +00000000 *UND* 00000000 func_004000B0 + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000044 R_MIPS_HI16 .rodata +00000054 R_MIPS_LO16 .rodata +00000048 R_MIPS_HI16 some_rodata +0000004c R_MIPS_LO16 some_rodata +00000050 R_MIPS_26 g +00000084 R_MIPS_HI16 D_410100 +00000088 R_MIPS_LO16 D_410100 +0000008c R_MIPS_26 func_004000B0 + + +Contents of section .text: + 0000 27bdffe8 18a00009 afa00004 8fae0004 '............... + 0010 008e7821 a1e00000 8fb80004 27190001 ..x!........'... + 0020 0325082a 1420fff9 afb90004 10000001 .%.*. .......... + 0030 00000000 03e00008 27bd0018 27bdffe8 ........'...'... + 0040 afbf0014 3c010000 3c050000 8ca50000 ....<...<....... + 0050 0c000000 c42c0014 10000003 00000000 .....,.......... + 0060 10000001 00000000 8fbf0014 27bd0018 ............'... + 0070 03e00008 00000000 27bdffe8 afbf0014 ........'....... + 0080 240e0004 3c010000 ac2e0000 0c000000 $...<........... + 0090 00000000 10000001 00000000 8fbf0014 ................ + 00a0 27bd0018 03e00008 00000000 00000000 '............... +Contents of section .rodata: + 0000 00001212 00000001 00000000 00001313 ................ + 0010 00123123 3f8ccccd 00321321 00000000 ..1#?....2.!.... +Contents of section .options: + 0000 01200000 00000000 a0000022 00000000 . .........".... + 0010 00001010 00000000 00000000 00007ff0 ................ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a300c032 00000000 00001010 00000000 ...2............ + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/test2.c b/tools/asm-processor/tests/test2.c new file mode 100644 index 0000000..15969fe --- /dev/null +++ b/tools/asm-processor/tests/test2.c @@ -0,0 +1,69 @@ +const char buf1[1] = {1}; +float func1(void) { + "func1"; + return 0.1f; +} +const char buf2[1] = {2}; +void func2(void) { + *(volatile float*)0 = -3.5792360305786133f; + *(volatile float*)0 = -3.5792362689971924f; + // "func2"; + // return 0.2f; +} +const char buf3[1] = {3}; +int func3(int x) { + switch(x) { + case 0: + return 1; + case 1: + return 2; + case 2: + return 3; + case 3: + return 4; + case 4: + return 5; + case 5: + return 4; + case 6: + return 4; + case 7: + return 4; + default: + return 3; + } +} + +#if 1 +GLOBAL_ASM( +.rdata +.word 0x66756e63 # func +.word 0x34000000 # 4\0\0\0 +.word jumptarget + 4 + +.late_rodata +glabel rv +.word 0x3e4ccccd # 0.2f +.word jumptarget + 8 + +.text +glabel func4 +lui $at, %hi(rv) +glabel jumptarget +jr $ra +lwc1 $f0, %lo(rv)($at) +jr $ra +nop +jr $ra +nop +jr $ra +nop +jr $ra +nop +) +#else +float func4(void) { + "func4"; + return 0.2f; +} +#endif diff --git a/tools/asm-processor/tests/test2.objdump b/tools/asm-processor/tests/test2.objdump new file mode 100644 index 0000000..276ed9f --- /dev/null +++ b/tools/asm-processor/tests/test2.objdump @@ -0,0 +1,76 @@ + +tests/test2.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000000f0 .text +00000000 l d .rodata 00000060 .rodata +00000000 g O .rodata 00000001 buf1 +00000000 g F .text 0000001c func1 +0000000c g O .rodata 00000001 buf2 +0000001c g F .text 00000028 func2 +00000010 g O .rodata 00000001 buf3 +00000044 g F .text 0000007c func3 +000000c4 g F .text 00000000 jumptarget +000000c0 g F .text 0000000c func4 +0000004c g .rodata 00000000 rv + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000000 R_MIPS_HI16 .rodata +00000008 R_MIPS_LO16 .rodata +0000001c R_MIPS_HI16 .rodata +00000020 R_MIPS_LO16 .rodata +00000028 R_MIPS_HI16 .rodata +0000002c R_MIPS_LO16 .rodata +00000054 R_MIPS_HI16 .rodata +0000005c R_MIPS_LO16 .rodata +000000c0 R_MIPS_HI16 rv +000000c8 R_MIPS_LO16 rv + + +RELOCATION RECORDS FOR [.rodata]: +OFFSET TYPE VALUE +0000002c R_MIPS_32 .text +00000030 R_MIPS_32 .text +00000034 R_MIPS_32 .text +00000038 R_MIPS_32 .text +0000003c R_MIPS_32 .text +00000040 R_MIPS_32 .text +00000044 R_MIPS_32 .text +00000048 R_MIPS_32 .text +0000001c R_MIPS_32 jumptarget +00000050 R_MIPS_32 jumptarget + + +Contents of section .text: + 0000 3c010000 03e00008 c4200020 03e00008 <........ . .... + 0010 00000000 03e00008 00000000 3c010000 ............<... + 0020 c4240024 e4040000 3c010000 c4260028 .$.$....<....&.( + 0030 e4060000 03e00008 00000000 03e00008 ................ + 0040 00000000 2c810008 10200017 00000000 ....,.... ...... + 0050 00047080 3c010000 002e0821 8c2e002c ..p.<......!..., + 0060 01c00008 00000000 03e00008 24020001 ............$... + 0070 03e00008 24020002 03e00008 24020003 ....$.......$... + 0080 03e00008 24020004 03e00008 24020005 ....$.......$... + 0090 03e00008 24020004 03e00008 24020004 ....$.......$... + 00a0 03e00008 24020004 03e00008 24020003 ....$.......$... + 00b0 03e00008 00000000 03e00008 00000000 ................ + 00c0 3c010000 03e00008 c4200000 03e00008 <........ ...... + 00d0 00000000 03e00008 00000000 03e00008 ................ + 00e0 00000000 03e00008 00000000 00000000 ................ +Contents of section .rodata: + 0000 01000000 66756e63 31000000 02000000 ....func1....... + 0010 03000000 66756e63 34000000 00000004 ....func4....... + 0020 3dcccccd c0651234 c0651235 00000068 =....e.4.e.5...h + 0030 00000070 00000078 00000080 00000088 ...p...x........ + 0040 00000090 00000098 000000a0 3e4ccccd ............>L.. + 0050 00000008 00000000 00000000 00000000 ................ +Contents of section .options: + 0000 01200000 00000000 80004016 00000000 . ........@..... + 0010 00000051 00000000 00000000 00007ff0 ...Q............ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 80004016 00000000 00000051 00000000 ..@........Q.... + 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/test3.c b/tools/asm-processor/tests/test3.c new file mode 100644 index 0000000..d74bb4c --- /dev/null +++ b/tools/asm-processor/tests/test3.c @@ -0,0 +1,70 @@ + +GLOBAL_ASM( +.rdata +.word 321321 +.text +glabel test +/* 000090 00400090 27BDFFF8 */ addiu $sp, $sp, -24 +/* 000094 00400094 18A00009 */ blez $a1, .L004000BC +/* 000098 00400098 AFA00004 */ sw $zero, 4($sp) +.L0040009C: +/* 00009C 0040009C 8FAE0004 */ lw $t6, 4($sp) +/* 0000A0 004000A0 008E7821 */ addu $t7, $a0, $t6 +/* 0000A4 004000A4 A1E00000 */ sb $zero, ($t7) +/* 0000A8 004000A8 8FB80004 */ lw $t8, 4($sp) +/* 0000AC 004000AC 27190001 */ addiu $t9, $t8, 1 +/* 0000B0 004000B0 0325082A */ slt $at, $t9, $a1 +/* 0000B4 004000B4 1420FFF9 */ bnez $at, .L0040009C +/* 0000B8 004000B8 AFB90004 */ sw $t9, 4($sp) +.L004000BC: +/* 0000BC 004000BC 10000001 */ b .L004000C4 +/* 0000C0 004000C0 00000000 */ nop +.L004000C4: +/* 0000C4 004000C4 03E00008 */ jr $ra +/* 0000C8 004000C8 27BD0008 */ addiu $sp, $sp, 24 +) + +// static -> no symbols +// bss +char globalBuf[4]; +const char constBuf[4]; + +// data +char globalBufInit[4] = {1}; + +// rodata +const char constBufInit[4] = {1}; +const char constBufInit2[1] = {2}; +const char constBufInit3[1] = {3}; + +unsigned g(void); +unsigned f(void) { + // aligns to 4 or 8 byte boundary (char -> 4, double -> 8) + double x = 5.1; + float y = 5.2f; + float z = 5.3f; + "Hello "; + "World"; + return g(); +} + +GLOBAL_ASM( +.rdata +.word 123123 +.text +glabel g +/* 0000C0 004000C0 27BDFFE8 */ addiu $sp, $sp, -0x18 +/* 0000C4 004000C4 AFBF0014 */ sw $ra, 0x14($sp) +/* 0000C8 004000C8 240E0004 */ addiu $t6, $zero, 4 +/* 0000CC 004000CC 3C010041 */ lui $at, %hi(D_410100) +/* 0000D0 004000D0 AC2E0100 */ sw $t6, %lo(D_410100)($at) +/* 0000D4 004000D4 0C10002C */ jal func_004000B0 +/* 0000D8 004000D8 00000000 */ nop +/* 0000DC 004000DC 10000001 */ b .L004000E4 +/* 0000E0 004000E0 00000000 */ nop +.L004000E4: +/* 0000E4 004000E4 8FBF0014 */ lw $ra, 0x14($sp) +/* 0000E8 004000E8 27BD0018 */ addiu $sp, $sp, 0x18 +/* 0000EC 004000EC 03E00008 */ jr $ra +/* 0000F0 004000F0 00000000 */ nop +) diff --git a/tools/asm-processor/tests/test3.objdump b/tools/asm-processor/tests/test3.objdump new file mode 100644 index 0000000..bfa7f6e --- /dev/null +++ b/tools/asm-processor/tests/test3.objdump @@ -0,0 +1,64 @@ + +tests/test3.o: file format elf32-tradbigmips + +SYMBOL TABLE: +00000000 l d .text 000000d0 .text +00000000 l d .rodata 00000040 .rodata +00000000 l d .data 00000010 .data +00000000 l d .bss 00000010 .bss +00000000 g O .bss 00000004 globalBuf +00000004 g O .bss 00000004 constBuf +00000000 g O .data 00000004 globalBufInit +00000004 g O .rodata 00000004 constBufInit +00000008 g O .rodata 00000001 constBufInit2 +0000000c g O .rodata 00000001 constBufInit3 +0000003c g F .text 00000054 f +00000000 g F .text 00000004 test +00000090 g F .text 00000004 g +00000000 *UND* 00000000 D_410100 +00000000 *UND* 00000000 func_004000B0 + + +RELOCATION RECORDS FOR [.text]: +OFFSET TYPE VALUE +00000044 R_MIPS_HI16 .rodata +00000048 R_MIPS_LO16 .rodata +00000050 R_MIPS_HI16 .rodata +00000054 R_MIPS_LO16 .rodata +0000005c R_MIPS_HI16 .rodata +00000060 R_MIPS_LO16 .rodata +00000068 R_MIPS_26 g +0000009c R_MIPS_HI16 D_410100 +000000a0 R_MIPS_LO16 D_410100 +000000a4 R_MIPS_26 func_004000B0 + + +Contents of section .text: + 0000 27bdffe8 18a00009 afa00004 8fae0004 '............... + 0010 008e7821 a1e00000 8fb80004 27190001 ..x!........'... + 0020 0325082a 1420fff9 afb90004 10000001 .%.*. .......... + 0030 00000000 03e00008 27bd0018 27bdffd8 ........'...'... + 0040 afbf0014 3c010000 d4240028 f7a40020 ....<....$.(... + 0050 3c010000 c4260030 e7a6001c 3c010000 <....&.0....<... + 0060 c4280034 e7a80018 0c000000 00000000 .(.4............ + 0070 10000003 00000000 10000001 00000000 ................ + 0080 8fbf0014 27bd0028 03e00008 00000000 ....'..(........ + 0090 27bdffe8 afbf0014 240e0004 3c010000 '.......$...<... + 00a0 ac2e0000 0c000000 00000000 10000001 ................ + 00b0 00000000 8fbf0014 27bd0018 03e00008 ........'....... + 00c0 00000000 00000000 00000000 00000000 ................ +Contents of section .rodata: + 0000 0004e729 01000000 02000000 03000000 ...)............ + 0010 48656c6c 6f202000 576f726c 64000000 Hello .World... + 0020 0001e0f3 00000000 40146666 66666666 ........@.ffffff + 0030 40a66666 40a9999a 00000000 00000000 @.ff@........... +Contents of section .data: + 0000 01000000 00000000 00000000 00000000 ................ +Contents of section .options: + 0000 01200000 00000000 a0000002 00000000 . .............. + 0010 00000170 00000000 00000000 00007ff0 ...p............ + 0020 07100000 00000000 00000000 00000000 ................ + 0030 08100000 00000000 00000000 00000000 ................ +Contents of section .reginfo: + 0000 a300c032 00000000 00000170 00000000 ...2.......p.... + 0010 00000000 00007ff0 ........ diff --git a/tools/asmproc b/tools/asmproc deleted file mode 160000 index 92b9ec7..0000000 --- a/tools/asmproc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 92b9ec72f40fde329bd91a83046b6c74bdc00199 diff --git a/tools/first_diff.py b/tools/first_diff.py index 2bf3319..670814a 100755 --- a/tools/first_diff.py +++ b/tools/first_diff.py @@ -39,15 +39,15 @@ def firstDiffMain(): parser = argparse.ArgumentParser(description="Find the first difference(s) between the built ROM and the base ROM.") parser.add_argument("-c", "--count", type=int, default=5, help="find up to this many instruction difference(s)") - parser.add_argument("-v", "--version", help="Which version should be processed", default="jp") + parser.add_argument("-v", "--version", help="Which version should be processed", default="us") parser.add_argument("-a", "--add-colons", action='store_true', help="Add colon between bytes" ) args = parser.parse_args() buildFolder = Path("build") - BUILTROM = buildFolder / f"pokestadium.z64" - BUILTMAP = buildFolder / f"pokestadium.map" + BUILTROM = buildFolder / f"pokestadium-{args.version}.z64" + BUILTMAP = buildFolder / f"pokestadium-{args.version}.map" EXPECTEDROM = "expected" / BUILTROM EXPECTEDMAP = "expected" / BUILTMAP diff --git a/tools/ido/linux/5.3/acpp b/tools/ido/linux/5.3/acpp new file mode 100755 index 0000000..4a6dc6d Binary files /dev/null and b/tools/ido/linux/5.3/acpp differ diff --git a/tools/ido/linux/5.3/as0 b/tools/ido/linux/5.3/as0 new file mode 100755 index 0000000..95d53d8 Binary files /dev/null and b/tools/ido/linux/5.3/as0 differ diff --git a/tools/ido/linux/5.3/as1 b/tools/ido/linux/5.3/as1 new file mode 100755 index 0000000..c337e34 Binary files /dev/null and b/tools/ido/linux/5.3/as1 differ diff --git a/tools/ido/linux/5.3/c++filt b/tools/ido/linux/5.3/c++filt new file mode 100755 index 0000000..65c63d5 Binary files /dev/null and b/tools/ido/linux/5.3/c++filt differ diff --git a/tools/ido/linux/5.3/cc b/tools/ido/linux/5.3/cc new file mode 100755 index 0000000..711a8bc Binary files /dev/null and b/tools/ido/linux/5.3/cc differ diff --git a/tools/ido/linux/5.3/cfe b/tools/ido/linux/5.3/cfe new file mode 100755 index 0000000..015da1a Binary files /dev/null and b/tools/ido/linux/5.3/cfe differ diff --git a/tools/ido/linux/5.3/copt b/tools/ido/linux/5.3/copt new file mode 100755 index 0000000..b0d4dd9 Binary files /dev/null and b/tools/ido/linux/5.3/copt differ diff --git a/tools/ido_recomp/linux/5.3/err.english.cc b/tools/ido/linux/5.3/err.english.cc similarity index 100% rename from tools/ido_recomp/linux/5.3/err.english.cc rename to tools/ido/linux/5.3/err.english.cc diff --git a/tools/ido/linux/5.3/ld b/tools/ido/linux/5.3/ld new file mode 100755 index 0000000..4671f07 Binary files /dev/null and b/tools/ido/linux/5.3/ld differ diff --git a/tools/ido/linux/5.3/libc.so b/tools/ido/linux/5.3/libc.so new file mode 100644 index 0000000..17495ef Binary files /dev/null and b/tools/ido/linux/5.3/libc.so differ diff --git a/tools/ido/linux/5.3/libc.so.1 b/tools/ido/linux/5.3/libc.so.1 new file mode 100644 index 0000000..17495ef Binary files /dev/null and b/tools/ido/linux/5.3/libc.so.1 differ diff --git a/tools/ido/linux/5.3/libexc.so b/tools/ido/linux/5.3/libexc.so new file mode 100644 index 0000000..209c536 Binary files /dev/null and b/tools/ido/linux/5.3/libexc.so differ diff --git a/tools/ido/linux/5.3/libgen.so b/tools/ido/linux/5.3/libgen.so new file mode 100644 index 0000000..7b8ec7f Binary files /dev/null and b/tools/ido/linux/5.3/libgen.so differ diff --git a/tools/ido/linux/5.3/libm.so b/tools/ido/linux/5.3/libm.so new file mode 100644 index 0000000..05bf478 Binary files /dev/null and b/tools/ido/linux/5.3/libm.so differ diff --git a/tools/ido/linux/5.3/strip b/tools/ido/linux/5.3/strip new file mode 100755 index 0000000..7c69878 Binary files /dev/null and b/tools/ido/linux/5.3/strip differ diff --git a/tools/ido/linux/5.3/ugen b/tools/ido/linux/5.3/ugen new file mode 100755 index 0000000..1251ffd Binary files /dev/null and b/tools/ido/linux/5.3/ugen differ diff --git a/tools/ido/linux/5.3/ujoin b/tools/ido/linux/5.3/ujoin new file mode 100755 index 0000000..8984b5b Binary files /dev/null and b/tools/ido/linux/5.3/ujoin differ diff --git a/tools/ido/linux/5.3/uld b/tools/ido/linux/5.3/uld new file mode 100755 index 0000000..6f2e7ce Binary files /dev/null and b/tools/ido/linux/5.3/uld differ diff --git a/tools/ido/linux/5.3/umerge b/tools/ido/linux/5.3/umerge new file mode 100755 index 0000000..e83f78c Binary files /dev/null and b/tools/ido/linux/5.3/umerge differ diff --git a/tools/ido/linux/5.3/uopt b/tools/ido/linux/5.3/uopt new file mode 100755 index 0000000..55dc556 Binary files /dev/null and b/tools/ido/linux/5.3/uopt differ diff --git a/tools/ido/linux/5.3/upas b/tools/ido/linux/5.3/upas new file mode 100755 index 0000000..912e7b4 Binary files /dev/null and b/tools/ido/linux/5.3/upas differ diff --git a/tools/ido/linux/5.3/usplit b/tools/ido/linux/5.3/usplit new file mode 100755 index 0000000..9c712e5 Binary files /dev/null and b/tools/ido/linux/5.3/usplit differ diff --git a/tools/ido/linux/7.1/NCC b/tools/ido/linux/7.1/NCC new file mode 100755 index 0000000..5fffe03 Binary files /dev/null and b/tools/ido/linux/7.1/NCC differ diff --git a/tools/ido/linux/7.1/acpp b/tools/ido/linux/7.1/acpp new file mode 100755 index 0000000..bf41770 Binary files /dev/null and b/tools/ido/linux/7.1/acpp differ diff --git a/tools/ido/linux/7.1/as0 b/tools/ido/linux/7.1/as0 new file mode 100755 index 0000000..4262381 Binary files /dev/null and b/tools/ido/linux/7.1/as0 differ diff --git a/tools/ido/linux/7.1/as1 b/tools/ido/linux/7.1/as1 new file mode 100755 index 0000000..0f0b5f1 Binary files /dev/null and b/tools/ido/linux/7.1/as1 differ diff --git a/tools/ido/linux/7.1/cc b/tools/ido/linux/7.1/cc new file mode 100755 index 0000000..5fffe03 Binary files /dev/null and b/tools/ido/linux/7.1/cc differ diff --git a/tools/ido/linux/7.1/cfe b/tools/ido/linux/7.1/cfe new file mode 100755 index 0000000..e5a786b Binary files /dev/null and b/tools/ido/linux/7.1/cfe differ diff --git a/tools/ido/linux/7.1/edgcpfe b/tools/ido/linux/7.1/edgcpfe new file mode 100755 index 0000000..259edf5 Binary files /dev/null and b/tools/ido/linux/7.1/edgcpfe differ diff --git a/tools/ido_recomp/linux/7.1/err.english.cc b/tools/ido/linux/7.1/err.english.cc similarity index 100% rename from tools/ido_recomp/linux/7.1/err.english.cc rename to tools/ido/linux/7.1/err.english.cc diff --git a/tools/ido/linux/7.1/ugen b/tools/ido/linux/7.1/ugen new file mode 100755 index 0000000..869faca Binary files /dev/null and b/tools/ido/linux/7.1/ugen differ diff --git a/tools/ido/linux/7.1/ujoin b/tools/ido/linux/7.1/ujoin new file mode 100755 index 0000000..0525fbb Binary files /dev/null and b/tools/ido/linux/7.1/ujoin differ diff --git a/tools/ido/linux/7.1/uld b/tools/ido/linux/7.1/uld new file mode 100755 index 0000000..4bbafd8 Binary files /dev/null and b/tools/ido/linux/7.1/uld differ diff --git a/tools/ido/linux/7.1/umerge b/tools/ido/linux/7.1/umerge new file mode 100755 index 0000000..76802fc Binary files /dev/null and b/tools/ido/linux/7.1/umerge differ diff --git a/tools/ido/linux/7.1/uopt b/tools/ido/linux/7.1/uopt new file mode 100755 index 0000000..2ec9586 Binary files /dev/null and b/tools/ido/linux/7.1/uopt differ diff --git a/tools/ido/linux/7.1/upas b/tools/ido/linux/7.1/upas new file mode 100755 index 0000000..1d0d530 Binary files /dev/null and b/tools/ido/linux/7.1/upas differ diff --git a/tools/ido/linux/7.1/usplit b/tools/ido/linux/7.1/usplit new file mode 100755 index 0000000..8d700fb Binary files /dev/null and b/tools/ido/linux/7.1/usplit differ diff --git a/tools/ido_recomp/macos/5.3/acpp b/tools/ido/macos/5.3/acpp similarity index 100% rename from tools/ido_recomp/macos/5.3/acpp rename to tools/ido/macos/5.3/acpp diff --git a/tools/ido_recomp/macos/5.3/as0 b/tools/ido/macos/5.3/as0 similarity index 100% rename from tools/ido_recomp/macos/5.3/as0 rename to tools/ido/macos/5.3/as0 diff --git a/tools/ido_recomp/macos/5.3/as1 b/tools/ido/macos/5.3/as1 similarity index 100% rename from tools/ido_recomp/macos/5.3/as1 rename to tools/ido/macos/5.3/as1 diff --git a/tools/ido_recomp/macos/5.3/cc b/tools/ido/macos/5.3/cc similarity index 100% rename from tools/ido_recomp/macos/5.3/cc rename to tools/ido/macos/5.3/cc diff --git a/tools/ido_recomp/macos/5.3/cfe b/tools/ido/macos/5.3/cfe similarity index 100% rename from tools/ido_recomp/macos/5.3/cfe rename to tools/ido/macos/5.3/cfe diff --git a/tools/ido_recomp/macos/5.3/copt b/tools/ido/macos/5.3/copt similarity index 100% rename from tools/ido_recomp/macos/5.3/copt rename to tools/ido/macos/5.3/copt diff --git a/tools/ido_recomp/macos/5.3/err.english.cc b/tools/ido/macos/5.3/err.english.cc similarity index 100% rename from tools/ido_recomp/macos/5.3/err.english.cc rename to tools/ido/macos/5.3/err.english.cc diff --git a/tools/ido_recomp/macos/5.3/ld b/tools/ido/macos/5.3/ld similarity index 100% rename from tools/ido_recomp/macos/5.3/ld rename to tools/ido/macos/5.3/ld diff --git a/tools/ido_recomp/macos/5.3/strip b/tools/ido/macos/5.3/strip similarity index 100% rename from tools/ido_recomp/macos/5.3/strip rename to tools/ido/macos/5.3/strip diff --git a/tools/ido_recomp/macos/5.3/ugen b/tools/ido/macos/5.3/ugen similarity index 100% rename from tools/ido_recomp/macos/5.3/ugen rename to tools/ido/macos/5.3/ugen diff --git a/tools/ido_recomp/macos/5.3/ujoin b/tools/ido/macos/5.3/ujoin similarity index 100% rename from tools/ido_recomp/macos/5.3/ujoin rename to tools/ido/macos/5.3/ujoin diff --git a/tools/ido_recomp/macos/5.3/uld b/tools/ido/macos/5.3/uld similarity index 100% rename from tools/ido_recomp/macos/5.3/uld rename to tools/ido/macos/5.3/uld diff --git a/tools/ido_recomp/macos/5.3/umerge b/tools/ido/macos/5.3/umerge similarity index 100% rename from tools/ido_recomp/macos/5.3/umerge rename to tools/ido/macos/5.3/umerge diff --git a/tools/ido_recomp/macos/5.3/uopt b/tools/ido/macos/5.3/uopt similarity index 100% rename from tools/ido_recomp/macos/5.3/uopt rename to tools/ido/macos/5.3/uopt diff --git a/tools/ido_recomp/macos/5.3/usplit b/tools/ido/macos/5.3/usplit similarity index 100% rename from tools/ido_recomp/macos/5.3/usplit rename to tools/ido/macos/5.3/usplit diff --git a/tools/ido_recomp/macos/7.1/acpp b/tools/ido/macos/7.1/acpp similarity index 100% rename from tools/ido_recomp/macos/7.1/acpp rename to tools/ido/macos/7.1/acpp diff --git a/tools/ido_recomp/macos/7.1/as0 b/tools/ido/macos/7.1/as0 similarity index 100% rename from tools/ido_recomp/macos/7.1/as0 rename to tools/ido/macos/7.1/as0 diff --git a/tools/ido_recomp/macos/7.1/as1 b/tools/ido/macos/7.1/as1 similarity index 100% rename from tools/ido_recomp/macos/7.1/as1 rename to tools/ido/macos/7.1/as1 diff --git a/tools/ido_recomp/macos/7.1/cc b/tools/ido/macos/7.1/cc similarity index 100% rename from tools/ido_recomp/macos/7.1/cc rename to tools/ido/macos/7.1/cc diff --git a/tools/ido_recomp/macos/7.1/cfe b/tools/ido/macos/7.1/cfe similarity index 100% rename from tools/ido_recomp/macos/7.1/cfe rename to tools/ido/macos/7.1/cfe diff --git a/tools/ido_recomp/macos/7.1/err.english.cc b/tools/ido/macos/7.1/err.english.cc similarity index 100% rename from tools/ido_recomp/macos/7.1/err.english.cc rename to tools/ido/macos/7.1/err.english.cc diff --git a/tools/ido_recomp/macos/7.1/ugen b/tools/ido/macos/7.1/ugen similarity index 100% rename from tools/ido_recomp/macos/7.1/ugen rename to tools/ido/macos/7.1/ugen diff --git a/tools/ido_recomp/macos/7.1/ujoin b/tools/ido/macos/7.1/ujoin similarity index 100% rename from tools/ido_recomp/macos/7.1/ujoin rename to tools/ido/macos/7.1/ujoin diff --git a/tools/ido_recomp/macos/7.1/uld b/tools/ido/macos/7.1/uld similarity index 100% rename from tools/ido_recomp/macos/7.1/uld rename to tools/ido/macos/7.1/uld diff --git a/tools/ido_recomp/macos/7.1/umerge b/tools/ido/macos/7.1/umerge similarity index 100% rename from tools/ido_recomp/macos/7.1/umerge rename to tools/ido/macos/7.1/umerge diff --git a/tools/ido_recomp/macos/7.1/uopt b/tools/ido/macos/7.1/uopt similarity index 100% rename from tools/ido_recomp/macos/7.1/uopt rename to tools/ido/macos/7.1/uopt diff --git a/tools/ido_recomp/macos/7.1/upas b/tools/ido/macos/7.1/upas similarity index 100% rename from tools/ido_recomp/macos/7.1/upas rename to tools/ido/macos/7.1/upas diff --git a/tools/ido_recomp/macos/7.1/usplit b/tools/ido/macos/7.1/usplit similarity index 100% rename from tools/ido_recomp/macos/7.1/usplit rename to tools/ido/macos/7.1/usplit diff --git a/tools/ido_recomp/linux/5.3/as1 b/tools/ido_recomp/linux/5.3/as1 deleted file mode 100755 index 17ff2aa..0000000 Binary files a/tools/ido_recomp/linux/5.3/as1 and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/cc b/tools/ido_recomp/linux/5.3/cc deleted file mode 100755 index 6dbb85e..0000000 Binary files a/tools/ido_recomp/linux/5.3/cc and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/cfe b/tools/ido_recomp/linux/5.3/cfe deleted file mode 100755 index d742f7b..0000000 Binary files a/tools/ido_recomp/linux/5.3/cfe and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/ugen b/tools/ido_recomp/linux/5.3/ugen deleted file mode 100755 index 692086f..0000000 Binary files a/tools/ido_recomp/linux/5.3/ugen and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/ujoin b/tools/ido_recomp/linux/5.3/ujoin deleted file mode 100755 index f9c90b8..0000000 Binary files a/tools/ido_recomp/linux/5.3/ujoin and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/uld b/tools/ido_recomp/linux/5.3/uld deleted file mode 100755 index f227222..0000000 Binary files a/tools/ido_recomp/linux/5.3/uld and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/umerge b/tools/ido_recomp/linux/5.3/umerge deleted file mode 100755 index 00a8281..0000000 Binary files a/tools/ido_recomp/linux/5.3/umerge and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/uopt b/tools/ido_recomp/linux/5.3/uopt deleted file mode 100755 index 49558be..0000000 Binary files a/tools/ido_recomp/linux/5.3/uopt and /dev/null differ diff --git a/tools/ido_recomp/linux/5.3/usplit b/tools/ido_recomp/linux/5.3/usplit deleted file mode 100755 index a1c5eba..0000000 Binary files a/tools/ido_recomp/linux/5.3/usplit and /dev/null differ diff --git a/tools/ido_recomp/linux/7.1/as1 b/tools/ido_recomp/linux/7.1/as1 deleted file mode 100755 index a7bb3ad..0000000 Binary files a/tools/ido_recomp/linux/7.1/as1 and /dev/null differ diff --git a/tools/ido_recomp/linux/7.1/cc b/tools/ido_recomp/linux/7.1/cc deleted file mode 100755 index e926b54..0000000 Binary files a/tools/ido_recomp/linux/7.1/cc and /dev/null differ diff --git a/tools/ido_recomp/linux/7.1/cfe b/tools/ido_recomp/linux/7.1/cfe deleted file mode 100755 index 3a3e983..0000000 Binary files a/tools/ido_recomp/linux/7.1/cfe and /dev/null differ diff --git a/tools/ido_recomp/linux/7.1/ugen b/tools/ido_recomp/linux/7.1/ugen deleted file mode 100755 index e8e8756..0000000 Binary files a/tools/ido_recomp/linux/7.1/ugen and /dev/null differ diff --git a/tools/ido_recomp/linux/7.1/uopt b/tools/ido_recomp/linux/7.1/uopt deleted file mode 100755 index fd93d2d..0000000 Binary files a/tools/ido_recomp/linux/7.1/uopt and /dev/null differ diff --git a/tools/sym_info.py b/tools/sym_info.py index 5ec2268..dde10c5 100755 --- a/tools/sym_info.py +++ b/tools/sym_info.py @@ -11,11 +11,11 @@ def symInfoMain(): parser = argparse.ArgumentParser(description="Display various information about a symbol or address.") parser.add_argument("symname", help="symbol name or VROM/VRAM address to lookup") parser.add_argument("-e", "--expected", dest="use_expected", action="store_true", help="use the map file in expected/build/ instead of build/") - parser.add_argument("-v", "--version", help="Which version should be processed", default="jp") + parser.add_argument("-v", "--version", help="Which version should be processed", default="us") args = parser.parse_args() - BUILTMAP = Path(f"build") / f"pokestadium.map" + BUILTMAP = Path(f"build") / f"pokestadium-{args.version}.map" mapPath = BUILTMAP if args.use_expected: diff --git a/tools/symbol_addrs.txt b/tools/symbol_addrs.txt deleted file mode 100644 index 5ba6f61..0000000 --- a/tools/symbol_addrs.txt +++ /dev/null @@ -1,745 +0,0 @@ -LeoByteToLBA = 0x80055050; -LeoCJCreateLeoManager = 0x80055BB0; -LeoDriveExist = 0x800564C0; -LeoLBAToByte = 0x80052710; -LeoReadDiskID = 0x80052B10; -LeoReadWrite = 0x80050FC0; -LeoReadRTC = 0x80056670; -LeoReset = 0x80051384; -LeoResetClear = 0x80051438; -LeoSeek = 0x80056790; -LeoSetRTC = 0x80054800; -LeoSpdlMotor = 0x80053650; -LeoTestUnitReady = 0x80056590; -leoVerifyRTC = 0x800548C0; -_Litob = 0x80064CA0; -_Printf = 0x8005D850; -_Putfld = 0x8005D1E0; -__leoSetReset = 0x80051414; -__leoResetCalled = 0x80079510; -__ll_div = 0x8005751C; -__ll_lshift = 0x800574B4; -__ll_mod = 0x80057608; -__ll_mul = 0x80057578; -__ll_rem = 0x800574E0; -__ll_rshift = 0x800576A4; -__osAiDeviceBusy = 0x80065C50; -__osCheckId = 0x8005CA40; -__osCheckPackId = 0x8005C730; -__osContAddressCrc = 0x80063C90; -__osContDataCrc = 0x80063D60; -__osContGetInitData = 0x800589D0; -__osContRamRead = 0x80063A60; -__osContRamWrite = 0x80063810; -__osDequeueThread = 0x80056CB0; -__osDevMgrMain = 0x8005B820; -__osDisableInt = 0x80062A90; -__osDispatchThread = 0x80057E44; // ! -__osEepStatus = 0x8005BFA4; -__osEnqueueAndYield = 0x80057CEC; // ! -__osGbpakSelectBank = 0x80065AD0; -__osGetId = 0x8005C894; -__osIdCheckSum = 0x8005C2E4; -__osLeoInterrupt = 0x80055DF0; -__osLeoAbnormalResume = 0x80056350; -__osLeoResume = 0x80056404; -__osPackEepReadData = 0x80065E44; -__osPackEepWriteData = 0x8005BEF8; -__osPackReadData = 0x80058F20; -__osPackRequestData = 0x80058AA0; -__osPfsGetOneChannelData = 0x800598C4; -__osPfsGetStatus = 0x80059730; -__osPfsRWInode = 0x8005CB14; -__osPfsRequestOneChannel = 0x80059800; -__osPfsSelectBank = 0x80063670; -__osPiCreateAccessQueue = 0x800567F0; -__osPiGetAccess = 0x80056840; -__osPiRelAccess = 0x80056884; -__osPopThread = 0x80057E34; // ! -__osRepairPackId = 0x8005C3E0; -__osResetGlobalIntMask = 0x80062870; -__osRestoreInt = 0x80062B00; -__osRunningThread = 0x80079630; -__osSetCause = 0x800568B0; -__osSetGlobalIntMask = 0x80062220; -__osSiDeviceBusy = 0x8005E570; -__osSiRawReadIo = 0x8005AA50; -__osSiRawStartDma = 0x8005A8E0; -__osSiRawWriteIo = 0x80064F40; -__osSpDeviceBusy = 0x8005E540; -__osSpGetStatus = 0x80064FA0; -__osSpRawStartDma = 0x8005A850; -__osSpSetPc = 0x80065F10; -__osSpSetStatus = 0x80064F90; -__osSumCalc = 0x8005C270; -__osViSwapContext = 0x80062C60; -__ull_div = 0x80057478; -__ull_divremi = 0x800575A8; -__ull_rem = 0x8005743C; -__ull_rshift = 0x80057410; -__locReadTimer = 0x80055864; -__locSetTimer = 0x800559D4; -guLookAtReflect = 0x8005AECC; -guLookAtReflectF = 0x8005AAC0; -guMtxF2L = 0x8005AF50; -guMtxIdent = 0x8005B0D8; -guMtxIdentF = 0x8005B050; -guMtxL2F = 0x8005B108; -guNormalize = 0x80062420; -guOrtho = 0x80062A24; -guOrthoF = 0x800628D0; -guScale = 0x80056D44; -guScaleF = 0x80056CF0; -guTranslate = 0x8005E5E8; -guTranslateF = 0x8005E5A0; -ldiv = 0x80064C10; -LEOcur_command = 0x801006C8; -LEOPiInfo = 0x80100710; -LEOPiDmaParam = 0x80100718; -mseq_tbl = 0x80101090; -rd_mseq_code = 0x8007E170; -wt_mseq_code = 0x8007E1B0; -unit_atten = 0x80100844; -asic_cur_status = 0x80100840; -currentCommand = 0x80100730; -LEOc2ctrl_que = 0x801006F8; -LEOcommand_que = 0x80100638; // allow_duplicated:True -LEOcontrol_que = 0x80100668; -LEOcontrol_que_buf = 0x801006B4; -LEOevent_que = 0x80100650; -LEOevent_que_buf = 0x801006B0; -LEOdma_que = 0x80100680; -LEOdma_que_buf = 0x801006B8; -LEOpost_que = 0x800FF9D0; -LEOpost_que_buf = 0x800FF9E8; -LEOblock_que = 0x80100698; -LEOblock_que_buf = 0x801006C0; -LEOcommandThread = 0x800FFAD8; -LEOcommandThreadStack = 0x80100238; -LEOinterruptThread = 0x800FFC88; -LEOinterruptThreadStack = 0x80100638; // allow_duplicated:True -LEOclr_que_flag = 0x801006D5; -LEO_ZERO_MESG = 0X8007DA30; -LEORAM_START_LBA = 0x8007DD18; -LEORAM_BYTE = 0x8007DD28; -LEOVZONE_TBL = 0x8007DB98; -LEOZONE_SCYL_TBL = 0x8007DC78; -LEOVZONE_PZONEHD_TBL = 0x8007DC98; -LEOBYTE_TBL1 = 0x8007DB78; -LEOBYTE_TBL2 = 0x8007DB84; -LEOZONE_OUTERCYL_TBL = 0x8007DD08; -LEO_TempBuffer = 0x80100850; -read_id_cmd = 0x80079590; -leo_disk_id_lba = 0x8007DAF0; -leo_sys_read_cmd = 0x80079560; -leo_sys_form_lbas = 0x8007DA40; -ymdupper = 0x8007E1F0; -dayupper = 0x8007E1F8; -LEO_sys_data = 0x800FF9F0; -LEOdrive_flag = 0x801006D4; -LEOtgt_param = 0x801006E0; -leoDiskStack = 0x801020D0; -LEOdisk_type = 0x801006D8; -LEO_country_code = 0x801006EC; -LEOrw_flags = 0x801006D6; -LEOc2_param = 0x80101080; -LEOC2_Syndrome = 0x80100940; -leoC2_Correction = 0x80053710; -leoC2_single_ecc = 0x8005379C; -leoC2_double_ecc = 0x80053870; -leoC2_3_ecc = 0x80053AF0; -leoC2_4_ecc = 0x80053ED8; -leoAlpha_mult = 0x80054774; -leoAlpha_div = 0x800547B8; -ganlog = 0x8007DD50; -glog = 0x8007DF50; -leoAnalize_asic_status = 0x80052D00; -leoChk_asic_ready = 0x80052E0C; -leoChk_cur_drvmode = 0x80053540; -leoChk_done_status = 0x80052EF4; -leoChk_err_retry = 0x80053430; -leoClrUA_MEDIUM_CHANGED = 0x8005360C; -leoClrUA_RESET = 0x800535F0; -leoClr_queue = 0x800551B0; -leoClr_reset = 0x80055258; -leoCommand = 0x80051224; -leoDetect_index_w = 0x800532C4; -leoDrive_reset = 0x80053580; -leoInitialize = 0x80051050; -leoInquiry = 0x800529C0; -leoLba_to_phys = 0x80054D60; -leoLba_to_vzone = 0x80054F54; -leoMode_sel = 0x80054C10; -leoRead = 0x80052550; -leoReadDiskId = 0x80052B70; -leoReadTimer = 0x80055570; -leoRead_common = 0x8005257C; -leoRead_system_area = 0x8005233C; -leoRecal_i = 0x800532EC; -leoRecal_w = 0x80053314; -leoRecv_event_mesg = 0x800533DC; -leoInitUnit_atten = 0x80053640; -leoRetUnit_atten = 0x800535BC; -leoChkUnit_atten = 0x800535B0; -leoRezero = 0x80054FB0; -leoSeek_i = 0x8005333C; -leoSeek_w = 0x800533A0; -leoSend_asic_cmd_i = 0x800530A8; -leoSend_asic_cmd_w = 0x800531A0; -leoSend_asic_cmd_w_nochkDiskChange = 0x800531D8; -leoSetTimer = 0x8005562C; -leoSetUA_MEDIUM_CHANGED = 0x80053628; -leoSet_mseq = 0x80054970; -leoStart_stop = 0x80054B20; -leoTest_unit_rdy = 0x80056630; -leoTranslate = 0x800552D0; -leoWait_mecha_cmd_done = 0x80053150; -leointerrupt = 0x800514C0; -read_write_track = 0x80051650; -leoChk_mecha_int = 0x80051C4C; -leosetup_BM = 0x80051CB4; -leochk_err_reg = 0x80051D9C; -LEOwrite_pointer = 0x801006C4; -LEOc2ctrl_que_buf = 0x801006F0; -LEOasic_bm_ctl_shadow = 0x801006CC; -LEOasic_seq_ctl_shadow = 0x801006D0; -LeoBootGame = 0x8000B8B0; // defined:true -__LeoBootGame2 = 0x8000B9EC; -__LeoBootGame3 = 0x8000BD10; -leomain = 0x80051EC0; -lldiv = 0x80064B10; -Main = 0x80000530; -memcpy = 0x8005E250; -osAiGetLength = 0x80063700; -osAiSetFrequency = 0x80062270; -osAiSetNextBuffer = 0x80065BA0; -osContGetReadData = 0x80058E94; -osContInit = 0x80058860; -osContStartReadData = 0x80058E10; -osCreateThread = 0x80058CC0; -osCreateViManager = 0x80064FC0; -osDestroyThread = 0x80057300; -osDpGetCounters = 0x800623C0; -osDpSetStatus = 0x800624D0; -osDriveRomInit = 0x80052860; -osEPiRawReadIo = 0x8005E890; -osEPiRawStartDma = 0x8005EA40; -osEPiRawWriteIo = 0x80063E10; -osEepromLongRead = 0x80059000; -osEepromProbe = 0x8005BD10; -osEepromRead = 0x80065C80; -osEepromWrite = 0x8005BD80; -osGbpakCheckConnector = 0x800582C0; -osGbpakGetStatus = 0x8005DEA0; -osGbpakInit = 0x80059500; -osGbpakPower = 0x80058750; -osGbpakReadId = 0x80063350; -osGbpakReadWrite = 0x80065910; -osGetThreadPri = 0x8005E870; -osGetTime = 0x8005F150; -osJamMesg = 0x8005E640; -osLeoDiskInit = 0x80052A70; -osPiGetCmdQueue = 0x80062F60; -osPiRawStartDma = 0x8005BC30; -osRecvMesg = 0x80056AD0; -osSendMesg = 0x800568C0; -osSetEventMesg = 0x8005CDF0; -osSetIntMask = 0x80056C10; -osSetThreadPri = 0x8005E790; -osSetTimer = 0x80063F70; -osSpTaskYield = 0x8005AAA0; -osSpTaskYielded = 0x8005EC20; -osStartThread = 0x80065370; -osStopThread = 0x80056A10; -osSyncPrintf = 0x8005E210; -osViBlack = 0x8005A9E0; -osViGetCurrentFramebuffer = 0x80065ED0; -osViSetEvent = 0x800632E0; -osViSetMode = 0x8005B1C0; -osViSetSpecialFeatures = 0x80063150; -osViSetXScale = 0x800654C0; -osViSetYScale = 0x800655F0; -osViSwapBuffer = 0x8005E9F0; -osVirtualToPhysical = 0x80059090; -osYieldThread = 0x800637C0; -proutSprintf = 0x8005E020; -rmonPrintf = 0x8005E22C; -sprintf = 0x8005E044; -strchr = 0x8005E2A4; -strlen = 0x8005E27C; -viMgrMain = 0x80065140; -leoRd_capacity = 0x80054CC0; -leoWrite = 0x80055A80; -leoSeek = 0x800566D0; -__osSetCount = 0x80058FF0; -__osSetSR = 0x80059110; -osWritebackDCache = 0x80059120; -osInitialize = 0x800591A0; -__osGetSR = 0x800594F0; -alFxPull = 0x80059960; -alFxParam = 0x80059CA0; -alFxParamHdl = 0x80059CB8; -_loadOutputBuffer = 0x80059F14; -_loadBuffer = 0x8005A134; -_saveBuffer = 0x8005A2CC; -_filterBuffer = 0x8005A460; -_doModFunc = 0x8005A510; -__osSiCreateAccessQueue = 0x80058BA0; -__osSiGetAccess = 0x80058BF0; -__osSiRelAccess = 0x80058C34; -osGetMemSize = 0x8005C150; -sqrtf = 0x8005CEB0; -guMtxXFMF = 0x8005CEE0; -guMtxCatF = 0x8005CF80; -guMtxXFML = 0x8005D0F0; -guMtxCatL = 0x8005D150; -guRandom = 0x8005D1B0; -osUnmapTLBAll = 0x8005E0A0; -alHeapInit = 0x8005E1D0; -osInvalDCache = 0x8005E2F0; -osCreateMesgQueue = 0x8005E3A0; -osInvalICache = 0x8005E3D0; -bcmp = 0x8005EE40; -__osTimerServicesInit = 0x8005F1E0; -__osTimerInterrupt = 0x8005F26C; -__osSetTimerIntr = 0x8005F3E4; -__osInsertTimer = 0x8005F458; -_init_lpfilter = 0x8005FC60; -alFxNew = 0x8005FD00; -alEnvmixerNew = 0x8006013C; -alLoadNew = 0x800601E4; -alResampleNew = 0x8006028C; -alAuxBusNew = 0x80060318; -alMainBusNew = 0x8006036C; -alSaveNew = 0x800603C0; -alMainBusParam = 0x80060410; -alMainBusPull = 0x80060440; -alAuxBusParam = 0x80060560; -alAuxBusPull = 0x80060590; -alEnvmixerPull = 0x80060670; -alResampleParam = 0x800612F0; -alResamplePull = 0x800613DC; -alFilterNew = 0x80062140; -alSavePull = 0x80062160; -alSaveParam = 0x800621EC; -__osActiveQueue = 0x8007962C; -__osGetActiveQueue = 0x80062410; -__osSetCompare = 0x800624B0; -osAiGetStatus = 0x800624C0; -alCopy = 0x800624E0; -_bcopy = 0x80062560; -__osViInit = 0x80062B20; -__cosf = 0x80062F90; -osEPiReadIo = 0x80063100; -osSetTime = 0x800632B0; -osCartRomInit = 0x80063510; -__osSetFpcCsr = 0x800636F0; -osEPiWriteIo = 0x80063710; -osMapTLBRdb = 0x80063760; -__osViCurr = 0x8007ACF0; -__osViGetCurrentContext = 0x800652D0; -osWritebackDCacheAll = 0x800652E0; -alHeapDBAlloc = 0x80065310; -__d_to_ll = 0x80065650; -__f_to_ll = 0x8006566C; -__d_to_ull = 0x80065688; -__f_to_ull = 0x80065728; -__ll_to_d = 0x800657C4; -__ll_to_f = 0x800657DC; -__ull_to_d = 0x800657F4; -__ull_to_f = 0x80065828; -alSynAllocFX = 0x80065860; -alSynDelete = 0x80065900; -__osSetHWIntrRoutine = 0x80065F50; -entry_point = 0x80000400; -alSynNew = 0x8005F5E0; -alAudioFrame = 0x8005F8E0; -__allocParam = 0x8005FAB0; -__freeParam = 0x8005FAE0; -_collectPVoices = 0x8005FAF8; -_freePVoice = 0x8005FB58; -_timeToSamples = 0x8005FBDC; -alUnlink = 0x80056F50; -alLink = 0x80056F80; -alClose = 0x80056FA4; -alInit = 0x80056FDC; -_VirtualToPhysicalTask = 0x80057010; -osSpTaskLoad = 0x8005712C; -osSpTaskStartGo = 0x800572BC; -sTmpTask = 0x80102100; -__osPiAccessQueue = 0x801020E8; -__osPiAccessQueueEnabled = 0x80079610; -piAccessBuf = 0x801020E0; -__sinf = 0x80056D90; -__libm_qnan_f = 0x8007E5D0; -bzero = 0x80057FD0; -var80090ab0 = 0x80102200; -g_GbpakMesgQueue = 0x80102220; -var80090ae8 = 0x80102238; -__osContPifRam = 0x80102140; -__osMaxControllers = 0x80102181; -__osContLastCmd = 0x80102180; -__osEepromTimerQ = 0x801021A8; -__osEepromTimerMsg = 0x801021C0; -__osContInitialized = 0x80079680; -__osSiAccessQueue = 0x801021D8; -__osSiAccessQueueEnabled = 0x80079690; -siAccessBuf = 0x801021D0; -__osCleanupThread = 0x80057FC0; -__osProbeTLB = 0x8005B5E0; -__osFinalRom = 0x801021F0; -__osExceptionPreamble = 0x800576D0; -__osCartRomInit = 0x80059448; -osResetType = 0x8000030C; -osAppNMIBuffer = 0x8000031C; -osTvType = 0x80000300; -__osGetCause = 0x80063E00; -CartRomHandle = 0x80102430; -LeoDiskHandle = 0x801024A8; -__LeoDiskHandle = 0x801007C0; -__osGlobalIntMask = 0x800796B0; -__osShutdown = 0x800796AC; -osViClock = 0x800796A8; -__osPfsInodeCacheBank = 0x8007A934; -__osPfsPifRam = 0x801023F0; -alGlobals = 0x80079640; -guPerspectiveF = 0x8005A5C0; -guPerspective = 0x8005A7F0; -alSeqFileNew = 0x80058278; -__osDiskHandle = 0x80100834; -__osPiTable = 0x8007A87C; -osViRepeatLine = 0x8005B230; -osPfsIsPlug = 0x8005B2A0; -__osPfsRequestData = 0x8005B440; -__osPfsGetInitData = 0x8005B510; -osCreatePiManager = 0x8005B6A0; -osEPiStartDma = 0x8005E0F0; -__osEepromTimer = 0x80102188; -osEepromLongWrite = 0x8005E450; -guRotateRPYF = 0x8005ECA0; -guRotateRPY = 0x8005EDEC; -guRotateF = 0x8005EF60; -guRotate = 0x8005F0F4; -_Ldtob = 0x800645C0; -alAdpcmPull = 0x80061C9C; -alLoadParam = 0x800615F0; -osEPiLinkHandle = 0x8005A990; -__osViNext = 0x8007ACF4; -piEventQueue = 0x801036D0; -piEventBuf = 0x801036E8; -piThread = 0x80102520; -__osPiDevMgr = 0x8007A860; -piThreadStack = 0x801026D0; -osRomBase = 0x80000308; -__osEepPifRam = 0x80104B70; -osGetCount = 0x8005BD00; -__osPfsInodeCacheChannel = 0x8007A930; -__osPfsInodeCache = 0x801036F0; -__osPreNMI = 0x8007A940; -__osEventStateTab = 0x801037F0; -osAfterPreNMI = 0x8005CEC0; -__osThreadTail = 0x80079620; -__osRunQueue = 0x80079628; -__osEnqueueThread = 0x80057DEC; -__osCurrentHandle = 0x8007A880; -__osTimerList = 0x8007A9B0; -__osBaseTimer = 0x80103890; -__osCurrentTime = 0x801038B0; -__osCurrentTime+4 = 0x801038B4; -__osBaseCounter = 0x801038B8; -__osViIntrCount = 0x801038BC; -__osTimerCounter = 0x801038C0; -_timeToSamplesNoRound = 0x8005FB90; -alEnvmixerParam = 0x80060B78; -_pullSubFrame = 0x80060C58; -_frexpf = 0x80060F40; -_ldexpf = 0x8006102C; -_getRate = 0x80061054; -_getVol = 0x80061238; -osViModePalLan1 = 0x8007AD00; -osViModeMpalLan1 = 0x8007ADA0; -osViModeNtscLan1 = 0x8007AD50; -g_OsGbNintendoData = 0x8007ADF0; -g_OsGbCartVersions = 0x8007AE20; -__CartRomHandle = 0x801038D0; -__DriveRomHandle = 0x80100740; -__osPfsLastChannel = 0x8007AE50; -__osViDevMgr = 0x8007AE90; -__leoQueuesCreated = 0x80079514; -__leoActive = 0x800795B0; -__leoVersion = 0x801010D0; -__additional_scanline = 0x8007AEAC; -viThread = 0x80103950; -viThreadStack = 0x80103B00; -viEventQueue = 0x80104B00; -viEventBuf = 0x80104B18; -viRetraceMsg = 0x80104B30; -viCounterMsg = 0x80104B48; -__osHwIntTable = 0x80079650; -set_watch_lohi = 0x8000B7D0; -trigger_fault = 0x8000B7E0; -crash_screen_sleep = 0x800082C0; -crash_screen_copy_to_buf = 0x80008810; -gCrashScreenCharToGlyph = 0x800695B0; -crash_screen_printf = 0x80008834; -crash_screen_print_fpr = 0x800088F0; -crash_screen_print_fpcsr = 0x80008974; -gFpcsrDesc = 0x80069778; -crash_screen_get_faulted_thread = 0x80008E48; -crash_screen_printf_with_bg = 0x80009020; -crash_screen_draw_rect = 0x80008444; -crash_screen_draw_glyph = 0x8000854C; -gCrashScreenFont = 0x80069630; -crash_screen_thread_entry = 0x80008EB4; -crash_screen_init = 0x80008F7C; -crash_screen_set_draw_info = 0x80008F54; -crash_screen_draw = 0x80008A00; -gFaultCauses = 0x80069730; -osMemSize = 0x80000318; -gSegments = 0x800A5870; -gFragments = 0x800A58F0; -Memmap_SetSegmentMap = 0x80001CE0; -Memmap_GetSegmentBaseVaddr = 0x80001CFC; -Memmap_GetSegmentVaddr = 0x80001D10; -Memmap_GetSegmentVaddrMask = 0x80001D60; -Memmap_ClearSegmentMemmap = 0x80001D9C; -Memmap_SetSegments = 0x80001DB8; -Memmap_RelocateFragment = 0x80001E50; -Memmap_SetFragmentMap = 0x800020B0; -Memmap_GetFragmentBaseVaddr = 0x800020CC; -Memmap_GetFragmentVaddr = 0x800020E0; -Memmap_GetFragmentVaddrMask = 0x80002144; -Memmap_ClearFragmentMemmap = 0x8000218C; -Memmap_GetLoadedFragmentVaddr = 0x800021A8; -gControllerStatuses = 0x800A73D0; -gControllerPads = 0x800A73E0; -gSIEventMesgQueue = 0x800A73B0; -gControllerBits = 0x800A73C8; -gEepromProbe = 0x800A73C9; -gSIEventMesgBuf = 0x800A73F8; -gEepromMesgQueue = 0x800A7400; -gEepromMesgBuf = 0x800A73FC; -Cont_InitControllers = 0x80005830; -Cont_AdjustAnalogStick = 0x80005950; -Cont_StartReadInputs = 0x80005A84; -Cont_ReadInputs = 0x80005AB0; -Cont_GetControllerBits = 0x80005B90; -Cont_IsEepromPresent = 0x80005B9C; -Cont_AttemptReadEeprom = 0x80005BAC; -Cont_AttemptWriteEeprom = 0x80005C64; -Cont_BlockEepromQueue = 0x80005D1C; -Cont_NoBlockEepromQueue = 0x80005D48; -Cont_InitEepromQueue = 0x80005D74; -Cont_SetupControllers = 0x80005DB8; -HAL_Strcpy = 0x8000A530; -HAL_Strcpy2 = 0x8000A560; -HAL_Strcmp = 0x8000A5B8; -HAL_Memset = 0x8000A5FC; -.L8120A860 = 0x8120A860; -D_8780FA30 = 0x8780FA30; -D_8780FA34 = 0x8780FA34; -D_87906044 = 0x87906044; -D_87906048 = 0x87906048; -D_87906060 = 0x87906060; -D_87906064 = 0x87906064; -D_87906068 = 0x87906068; -D_8790606C = 0x8790606C; -D_87906070 = 0x87906070; -D_87906094 = 0x87906094; -D_87906098 = 0x87906098; -D_879060A4 = 0x879060A4; -D_879060C4 = 0x879060C4; -D_879060C8 = 0x879060C8; -gShowCPUProfiler = 0x80068BC0; -gShowMEMProfiler = 0x80068BC4; -draw_profiler_bar_cpu = 0x8000948C; -profiler_log_gfx_time = 0x80009288; -profiler_log_vblank_time = 0x8000932C; -gDisplayListHead = 0x800A7420; -draw_profiler_mode_1 = 0x800097D0; -draw_profiler_mode_0 = 0x80009A38; -draw_profiler = 0x80009F8C; -HAL_Printf = 0x80008154; -print_profiler_metrics = 0x8000A0FC; -clear_profiler_data = 0x8000A21C; -draw_profiler_bar_cpu_keep_max = 0x80009630; -Yay0_Decompress = 0x8000B7F0; -Util_ConvertAddrToVirtAddr = 0x80002E80; -Util_Memcpy = 0x80002F28; -Util_DrawRect = 0x8000302C; -Util_Memclear = 0x8000330C; -UnkHeapThing = 0x80104BC0; -gMemPool = 0x800A6070; -main_pool_alloc_from_pool = 0x80002380; -main_pool_get_available = 0x80002764; -main_pool_free = 0x80002430; -main_pool_set_func = 0x80002A14; -main_pool_alloc_with_func = 0x8000254C; -main_pool_alloc = 0x800025C4; -main_pool_try_free = 0x80002620; -main_pool_realloc = 0x80002680; -main_pool_push_state = 0x80002784; -main_pool_pop_state = 0x80002838; -main_pool_get_pool = 0x80002A30; -main_pool_get_block_dist = 0x80002A24; -main_pool_search = 0x80002960; -text_bss_VRAM = 0x8007ED80; -gHeap = 0x80104BB0; -gMainPool = 0x800A60B0; -mem_pool_try_init = 0x80002A40; -mem_pool_init = 0x80002A88; -mem_pool_alloc = 0x80002AF8; -mem_pool_free = 0x80002BD0; -Util_DrawMemProfiler = 0x8000310C; -Util_Malloc = 0x80002FDC; -Util_Free = 0x80003004; -MathUtil_Atan2Lookup = 0x8000A300; -MathUtil_Atan2s = 0x8000A360; -gArctanTable = 0x8006E7F0; -gSineTable = 0x800697F0; -gCosineTable = 0x8006A7F0; -MathUtil_Random16 = 0x8000A4D4; -MathUtil_Random_ZeroOne = 0x8000A4F8; -SoftReset_ClearLines320 = 0x800054A0; -SoftReset_ClearLines640 = 0x8000551C; -gSoftResetLineNum = 0x800A7300; -gSoftResetRed = 0x800A7308; -gSoftResetGreen = 0x800A730C; -gSoftResetBlue = 0x800A7310; -SoftReset_Thread = 0x80005674; -SoftReset_CreateThread = 0x800057C0; -func_80004DB4 = 0x80004DB4; //defined:true -gControllers = 0x800A7320; //defined:true -fragment1_ROM_START = 0x7F980; // defined:true -fragment1_misc_yay0_ROM_START = 0xADC80; // defined:true -fragment2_ROM_START = 0x107FA0; // defined:true -fragment3_ROM_START = 0x118990; // defined:true -fragment4_ROM_START = 0x11F560; // defined:true -fragment5_ROM_START = 0x120920; // defined:true -fragment6_ROM_START = 0x120A10; // defined:true -fragment7_ROM_START = 0x1278D0; // defined:true -fragment8_ROM_START = 0x12DF40; // defined:true -fragment9_ROM_START = 0x1329E0; // defined:true -fragment10_ROM_START = 0x134680; // defined:true -fragment11_ROM_START = 0x138F20; // defined:true -fragment12_ROM_START = 0x142B10; // defined:true -fragment13_ROM_START = 0x143700; // defined:true -fragment14_ROM_START = 0x1442E0; // defined:true -fragment15_ROM_START = 0x14CA50; // defined:true -fragment16_ROM_START = 0x1589E0; // defined:true -fragment17_ROM_START = 0x15F990; // defined:true -fragment18_ROM_START = 0x1708B0; // defined:true -fragment19_ROM_START = 0x17FB40; // defined:true -fragment20_ROM_START = 0x1802B0; // defined:true -fragment21_ROM_START = 0x185A10; // defined:true -fragment22_ROM_START = 0x191660; // defined:true -fragment23_ROM_START = 0x1A8570; // defined:true -fragment24_ROM_START = 0x1CE9E0; // defined:true -fragment25_ROM_START = 0x1EA640; // defined:true -fragment26_ROM_START = 0x1EA860; // defined:true -fragment27_ROM_START = 0x1F7C90; // defined:true -fragment28_ROM_START = 0x214900; // defined:true -fragment29_ROM_START = 0x23C250; // defined:true -fragment29_misc_1_ROM_START = 0x23D500; // defined:true -fragment29_misc_2_ROM_START = 0x23FB60; // defined:true -fragment29_misc_3_ROM_START = 0x24F430; // defined:true -fragment30_ROM_START = 0x255230; // defined:true -fragment31_ROM_START = 0x2552C0; // defined:true -fragment32_ROM_START = 0x25A740; // defined:true -fragment33_ROM_START = 0x25B0D0; // defined:true -fragment33_misc_ROM_START = 0x25F440; // defined:true -fragment34_ROM_START = 0x261F70; // defined:true -fragment35_ROM_START = 0x271260; // defined:true -fragment36_ROM_START = 0x2717E0; // defined:true -fragment37_ROM_START = 0x272830; // defined:true -fragment38_ROM_START = 0x275CE0; // defined:true -fragment39_ROM_START = 0x27BCA0; // defined:true -fragment40_ROM_START = 0x285DC0; // defined:true -fragment41_ROM_START = 0x287EB0; // defined:true -fragment42_ROM_START = 0x29DD30; // defined:true -fragment43_ROM_START = 0x2A1B30; // defined:true -fragment44_ROM_START = 0x2A4DF0; // defined:true -fragment45_ROM_START = 0x2A9790; // defined:true -fragment46_ROM_START = 0x2AD270; // defined:true -fragment47_ROM_START = 0x2AD8F0; // defined:true -fragment48_ROM_START = 0x2B3F70; // defined:true -fragment49_ROM_START = 0x2B46F0; // defined:true -fragment50_ROM_START = 0x2B5350; // defined:true -fragment51_ROM_START = 0x2BD0A0; // defined:true -fragment52_ROM_START = 0x2BD130; // defined:true -fragment53_ROM_START = 0x2BD6E0; // defined:true -fragment54_ROM_START = 0x2BDAC0; // defined:true -fragment55_ROM_START = 0x2BED20; // defined:true -fragment56_ROM_START = 0x2C3220; // defined:true -fragment57_ROM_START = 0x2C49D0; // defined:true -fragment58_ROM_START = 0x2CF350; // defined:true -fragment59_ROM_START = 0x2D24C0; // defined:true -fragment60_ROM_START = 0x2D5CB0; // defined:true -fragment61_ROM_START = 0x2D7890; // defined:true -fragment62_ROM_START = 0x2EA8C0; // defined:true -fragment63_ROM_START = 0x394100; // defined:true -fragment64_ROM_START = 0x3AEE50; // defined:true -fragment65_ROM_START = 0x3B2AE0; // defined:true -fragment66_ROM_START = 0x3B6130; // defined:true -fragment67_ROM_START = 0x3B8530; // defined:true -fragment68_ROM_START = 0x3B8570; // defined:true -fragment69_ROM_START = 0x3B8600; // defined:true -fragment70_ROM_START = 0x3B8690; // defined:true -fragment71_ROM_START = 0x3B8720; // defined:true -fragment72_ROM_START = 0x3B87B0; // defined:true -fragment73_ROM_START = 0x3B8840; // defined:true -fragment74_ROM_START = 0x3B88D0; // defined:true -fragment75_ROM_START = 0x3B8960; // defined:true -fragment76_ROM_START = 0x3B9590; // defined:true -fragment77_ROM_START = 0x3B9620; // defined:true -_3B96B0_ROM_START = 0x3B96B0; // defined:true -_3BA190_ROM_START = 0x3BA190; // defined:true -_3CB130_ROM_START = 0x3CB130; // defined:true -_45B580_ROM_START = 0x45B580; // defined:true -_4A21C0_ROM_START = 0x4A21C0; // defined:true -_4BD6B0_ROM_START = 0x4BD6B0; // defined:true -_4BE810_ROM_START = 0x4BE810; // defined:true -_4D1330_ROM_START = 0x4D1330; // defined:true -_4EB0C0_ROM_START = 0x4EB0C0; // defined:true -_5046B0_ROM_START = 0x5046B0; // defined:true -_52ABA0_ROM_START = 0x52ABA0; // defined:true -_52F6D0_ROM_START = 0x52F6D0; // defined:true -_533B20_ROM_START = 0x533B20; // defined:true -_56E7D0_ROM_START = 0x56E7D0; // defined:true -_5C7A70_ROM_START = 0x5C7A70; // defined:true -_5C7AD0_ROM_START = 0x5C7AD0; // defined:true -_5F6790_ROM_START = 0x5F6790; // defined:true -_5F92A0_ROM_START = 0x5F92A0; // defined:true -_5FFC30_ROM_START = 0x5FFC30; // defined:true -_613110_ROM_START = 0x613110; // defined:true -_6230D0_ROM_START = 0x6230D0; // defined:true -_66E1D0_ROM_START = 0x66E1D0; // defined:true -_66F540_ROM_START = 0x66F540; // defined:true -_66FD80_ROM_START = 0x66FD80; // defined:true -_675FA0_ROM_START = 0x675FA0; // defined:true -_696350_ROM_START = 0x696350; // defined:true -_69D090_ROM_START = 0x69D090; // defined:true -_6A9750_ROM_START = 0x6A9750; // defined:true -_6AE1D0_ROM_START = 0x6AE1D0; // defined:true -_6B0FB0_ROM_START = 0x6B0FB0; // defined:true -_6B4F00_ROM_START = 0x6B4F00; // defined:true -_6C1AB0_ROM_START = 0x6C1AB0; // defined:true -_6C4CE0_ROM_START = 0x6C4CE0; // defined:true -_6C4E50_ROM_START = 0x6C4E50; // defined:true -_6CA730_ROM_START = 0x6CA730; // defined:true -_6E2FC0_ROM_START = 0x6E2FC0; // defined:true -_6E8910_ROM_START = 0x6E8910; // defined:true -_6EB340_ROM_START = 0x6EB340; // defined:true -_6EC4D0_ROM_START = 0x6EC4D0; // defined:true -_6ECE80_ROM_START = 0x6ECE80; // defined:true -_701E50_ROM_START = 0x701E50; // defined:true -_70D3A0_ROM_START = 0x70D3A0; // defined:true -_7820E0_ROM_START = 0x7820E0; // defined:true -_783760_ROM_START = 0x783760; // defined:true -_798CD0_ROM_START = 0x798CD0; // defined:true -_7994B0_ROM_START = 0x7994B0; // defined:true -_79AFB0_ROM_START = 0x79AFB0; // defined:true -_79AFB0_ROM_END = 0x79B8F0; // defined:true -abs = 0x8000B8A0; // defined:true -D_86002B84 = 0x86002B84; // size:3 -D_86002B88 = 0x86002B88; // size:3 diff --git a/yamls/us/header.yaml b/yamls/us/header.yaml new file mode 100644 index 0000000..61d81b8 --- /dev/null +++ b/yamls/us/header.yaml @@ -0,0 +1,54 @@ +name: Pokemon Stadium (North America) +sha1: ed7bef5a306f88c0a6e96b15e71fee2ef32058f3 +options: + basename: pokestadium + target_path: baseroms/us/baserom.z64 + ld_script_path: linker_scripts/us/pokestadium.ld + base_path: . + compiler: IDO + find_file_boundaries: False + header_encoding: ASCII + platform: n64 + + undefined_funcs_auto_path: linker_scripts/us/auto/undefined_funcs_auto.ld + undefined_syms_auto_path: linker_scripts/us/auto/undefined_syms_auto.ld + + symbol_addrs_path: + - linker_scripts/us/symbol_addrs.txt + - linker_scripts/us/ignored_addresses.txt + reloc_addrs_path: + - relocs/reloc_addrs-us.txt + + asm_path: asm/us + src_path: src + asset_path: assets/us + + build_path: build + lib_path: build/lib + + extensions_path: tools/splat_ext + mips_abi_float_regs: o32 + + do_c_func_detection: True + o_as_suffix: True + gfx_ucode: f3dex2 + mnemonic_ljust: 12 + rom_address_padding: True + dump_symbols: True + generated_c_preamble: | + #include "global.h" + asm_inc_header: "" + use_legacy_include_asm: False + create_asm_dependencies: True + asm_function_macro: glabel + asm_jtbl_label_macro: jlabel + asm_data_macro: dlabel + include_macro_inc: False + libultra_symbols: True + hardware_regs: True + asm_emit_size_directive: False + segment_end_before_align: True + ld_align_section_vram_end: False + image_type_in_extension: true + +segments: diff --git a/splat.yaml b/yamls/us/rom.yaml similarity index 61% rename from splat.yaml rename to yamls/us/rom.yaml index a14087a..2ee1f1f 100644 --- a/splat.yaml +++ b/yamls/us/rom.yaml @@ -1,15 +1,3 @@ -name: Pokemon Stadium (North America) -basename: pokestadium -options: - compiler: IDO - symbol_addrs_path: tools/symbol_addrs.txt - target_path: baserom.z64 - basename: pokestadium - base_path: . - ld_script_path: pokestadium.ld - platform: n64 - ld_legacy_generation: true -segments: - name: header type: header start: 0x00 @@ -31,10 +19,10 @@ segments: subsegments: - [0x1000, hasm, entry] # bootloader - [0x1060, c, main] # rsp graphics - - [0x11B0, bin, noppad_11B0] # There's an extra nop align here, but cant reproduce it with just splat functionality alone. need a . += 0x10 in the linker script at this spot. + - [0x11B0, pad] - [0x11C0, c, rsp] # rsp audio - [0x1A80, c, dma] # DMA transfer - - [0x1F70, bin, noppad_1F70] # Extra nop align like earlier. Weird + - [0x1F70, pad] - [0x1F80, c, dp_intro] # dp intro code - [0x28E0, c, memmap] - [0x2EC0, c, memory_main] # handles the main global pool @@ -104,7 +92,7 @@ segments: - [0x485C0, c] # moves code - [0x48C60, c] # move effects code - [0x490A0, c] # audio functions to 0x50C00 - - [0x49190, bin] + - [0x49190, hasm, ../../src/unk_49190] - [0x49790, c] - [0x49BA0, c] - [0x49DC0, c] @@ -130,10 +118,12 @@ segments: - [0x51850, c] - [0x518A0, c] - [0x51B20, c] + + # libleo - [0x51BC0, c, libleo/readwrite] - [0x51C50, c, libleo/leofunc] - [0x520C0, c, libleo/leoint] - - [0x52AB0, bin, noppad_52AB0] # again with the weird nop padding. + - [0x52AB0, pad] - [0x52AC0, c, libleo/leocmdex] - [0x53150, c, libleo/leoread] - [0x53310, c, libleo/lbatobyte] @@ -165,163 +155,166 @@ segments: - [0x57270, c, libleo/readrtc] - [0x572D0, c, libleo/leoseek] - [0x57390, c, libleo/seek] - - [0x573F0, c, libultra/io/piacs] - - [0x574B0, hasm, libultra/os/setcause] - - [0x574C0, c, libultra/os/sendmesg] - - [0x57610, c, libultra/os/stopthread] - - [0x576D0, c, libultra/os/recvmesg] - - [0x57810, hasm, libultra/os/setintmask] - - [0x578B0, c, libultra/os/dequeuethread] - - [0x578F0, c, libultra/gu/scale] - - [0x57990, c, libultra/gu/sinf] - - [0x57B50, c, libultra/al/sl] - - [0x57C10, c, libultra/io/sptask] - - [0x57F00, c, libultra/os/destroythread] - - [0x58010, c, libultra/libc/ll] - - [0x582D0, hasm, libultra/os/exceptasm] - - [0x58BD0, hasm, libultra/libc/bzero] - - [0x58C70, c, libultra/al/bnkf] - - [0x58EC0, c, libultra/io/gbpakcheckconnector] - - [0x59350, c, libultra/io/gbpakpower] - - [0x59460, c, libultra/io/controller] - - [0x597A0, c, libultra/io/siacs] - - [0x59860, bin, noppad_59860] # again with the weird nop padding. - - [0x598C0, c, libultra/os/createthread] - - [0x59A10, c, libultra/io/contreaddata] - - [0x59BF0, hasm, libultra/os/setcount] - - [0x59C00, c, libultra/io/conteeplongread] - - [0x59C90, c, libultra/os/virtualtophysical] - - [0x59D10, hasm, libultra/os/setsr] - - [0x59D20, hasm, libultra/os/writebackdcache] - - [0x59DA0, c, libultra/os/initialize] - - [0x5A0F0, hasm, libultra/os/getsr] - - [0x5A100, c, libultra/io/gbpakinit] - - [0x5A330, c, libultra/io/pfsgetstatus] - - [0x5A560, c, libultra/al/reverb] - - [0x5B1C0, c, libultra/gu/perspective] - - [0x5B450, c, libultra/io/sprawdma] - - [0x5B4E0, c, libultra/io/sirawdma] - - [0x5B590, c, libultra/os/epilinkhandle] - - [0x5B5E0, c, libultra/io/viblack] - - [0x5B650, c, libultra/io/sirawread] - - [0x5B6A0, c, libultra/io/sptaskyield] - - [0x5B6C0, c, libultra/gu/lookatref] - - [0x5BB50, c, libultra/gu/mtxutil] - - [0x5BDC0, c, libultra/io/visetmode] - - [0x5BE30, c, libultra/io/virepeatline] - - [0x5BEA0, c, libultra/io/pfsisplug] - - [0x5C1E0, hasm, libultra/os/probetlb] - - [0x5C2A0, c, libultra/io/pimgr] - - [0x5C410, bin, noppad_5C410] - - [0x5C420, c, libultra/io/devmgr] - - [0x5C830, c, libultra/io/pirawdma] - - [0x5C900, hasm, libultra/os/osGetCount] - - [0x5C910, c, libultra/io/conteepprobe] - - [0x5C980, c, libultra/io/conteepwrite] - - [0x5CD50, c, libultra/os/getmemsize] - - [0x5CE70, c, libultra/io/contpfs] - - [0x5D9F0, c, libultra/os/seteventmesg] - - [0x5DAB0, c, libultra/gu/sqrtf] - - [0x5DAC0, c, libultra/os/afterprenmi] - - [0x5DAE0, c, libultra/gu/mtxcatf] - - [0x5DCF0, c, libultra/gu/mtxcatl] - - [0x5DDB0, c, libultra/gu/random] - - [0x5DDE0, c, libultra/libc/xprintf] - - [0x5EAA0, c, libultra/io/gbpakgetstatus] - - [0x5EC20, c, libultra/libc/sprintf] - - [0x5ECA0, hasm, libultra/os/unmaptlball] - - [0x5ECF0, c, libultra/io/epidma] - - [0x5EDD0, c, libultra/al/heapinit] - - [0x5EE10, c, libultra/libc/syncprintf] - - [0x5EE50, c, libultra/libc/string] - - [0x5EEF0, hasm, libultra/os/invalidcache] - - [0x5EFA0, c, libultra/os/createmesgqueue] - - [0x5EFD0, hasm, libultra/os/invalicache] - - [0x5F050, c, libultra/io/conteeplongwrite] - - [0x5F140, c, libultra/io/sp] - - [0x5F170, c, libultra/io/si] - - [0x5F1A0, c, libultra/gu/translate] - - [0x5F240, c, libultra/os/jammesg] - - [0x5F390, c, libultra/os/setthreadpri] - - [0x5F470, c, libultra/os/getthreadpri] - - [0x5F490, c, libultra/io/epirawread] - - [0x5F5F0, c, libultra/io/viswapbuf] - - [0x5F640, c, libultra/io/epirawdma] - - [0x5F820, c, libultra/io/sptaskyielded] - - [0x5F8A0, c, libultra/gu/rotateRPY] - - [0x5FA40, hasm, libultra/libc/bcmp] - - [0x5FB60, c, libultra/gu/rotate] - - [0x5FD50, c, libultra/os/gettime] - - [0x5FDE0, c, libultra/os/timerintr] - - [0x601E0, c, libultra/al/synthesizer] - - [0x60860, c, libultra/al/drvrNew] - - [0x61010, c, libultra/al/mainbus] - - [0x61160, c, libultra/al/auxbus] - - [0x61270, c, libultra/al/env] - - [0x61EF0, c, libultra/al/resample] - - [0x621F0, c, libultra/al/load] - - [0x62D40, c, libultra/al/filter] - - [0x62D60, c, libultra/al/save] - - [0x62E20, c, libultra/os/setglobalintmask] - - [0x62E70, c, libultra/io/aisetfreq] - - [0x62FC0, c, libultra/io/dpctr] - - [0x63010, c, libultra/os/getactivequeue] - - [0x63020, c, libultra/gu/normalize] - - [0x630B0, hasm, libultra/os/setcompare] - - [0x630C0, c, libultra/io/aigetstat] - - [0x630D0, c, libultra/io/dpsetstat] - - [0x630E0, c, libultra/al/copy] - - [0x63160, hasm, libultra/libc/bcopy] - - [0x63470, c, libultra/os/resetglobalintmask] - - [0x634D0, c, libultra/gu/ortho] - - [0x63690, hasm, libultra/os/interrupt] - - [0x63720, c, libultra/io/vi] - - [0x63860, c, libultra/io/viswapcontext] - - [0x63B60, c, libultra/io/pigetcmdq] - - [0x63B90, c, libultra/gu/cosf] - - [0x63D00, c, libultra/io/epiread] - - [0x63D50, c, libultra/io/visetspecial] - - [0x63EB0, c, libultra/os/settime] - - [0x63EE0, c, libultra/io/visetevent] - - [0x63F50, c, libultra/io/gbpakreadid] - - [0x64110, c, libultra/io/cartrominit] - - [0x64270, c, libultra/io/pfsselectbank] - - [0x642F0, hasm, libultra/os/setfpccsr] - - [0x64300, c, libultra/io/aigetlen] - - [0x64310, c, libultra/io/epiwrite] - - [0x64360, hasm, libultra/os/maptlbrdb] - - [0x643C0, c, libultra/os/yieldthread] - - [0x64410, c, libultra/io/contramwrite] - - [0x64660, c, libultra/io/contramread] - - [0x64890, c, libultra/io/crc] - - [0x64A00, hasm, libultra/os/__osGetCause] - - [0x64A10, c, libultra/io/epirawwrite] - - [0x64B70, c, libultra/os/settimer] - - [0x64C50, c, libultra/libc/xldtob] - - [0x65710, c, libultra/libc/ldiv] - - [0x658A0, c, libultra/libc/xlitob] - - [0x65B40, c, libultra/io/sirawwrite] - - [0x65B90, c, libultra/io/spsetstat] - - [0x65BA0, c, libultra/io/spgetstat] - - [0x65BB0, bin, noppad_65BB0] - - [0x65BC0, c, libultra/io/vimgr] - - [0x65ED0, c, libultra/io/vigetcurrcontext] - - [0x65EE0, hasm, libultra/os/writebackdcacheall] - - [0x65F10, c, libultra/al/heapalloc] - - [0x65F70, c, libultra/os/startthread] - - [0x660C0, c, libultra/io/visetxscale] - - [0x661F0, c, libultra/io/visetyscale] - - [0x66250, c, libultra/libc/llcvt] - - [0x66460, c, libultra/al/synallocfx] - - [0x66500, c, libultra/al/syndelete] - - [0x66510, c, libultra/io/gbpakreadwrite] - - [0x666D0, c, libultra/io/gbpakselectbank] - - [0x667A0, c, libultra/io/aisetnextbuf] - - [0x66850, c, libultra/io/ai] - - [0x66880, c, libultra/io/conteepread] - - [0x66AD0, c, libultra/io/vigetcurrframebuf] - - [0x66B10, c, libultra/io/spsetpc] - - [0x66B50, c, libultra/os/sethwinterrupt] + + #libultra + - [0x573F0, lib, libultra, piacs] + - [0x574B0, lib, libultra, setcause] + - [0x574C0, lib, libultra, sendmesg] + - [0x57610, lib, libultra, stopthread] + - [0x576D0, lib, libultra, recvmesg] + - [0x57810, lib, libultra, setintmask] + - [0x578B0, lib, libultra, thread] + - [0x578F0, lib, libultra, scale] + - [0x57990, lib, libultra, sinf] + - [0x57B50, lib, libultra, sl] + - [0x57C10, lib, libultra, sptask] + - [0x57F00, lib, libultra, destroythread] + - [0x58010, lib, libultra, ll] + - [0x582D0, lib, libultra, exceptasm] + - [0x58BD0, lib, libultra, bzero] + - [0x58C70, lib, libultra, bnkf] + - [0x58EC0, lib, libultra, gbpakcheckconnector] + - [0x59350, lib, libultra, gbpakpower] + - [0x59460, lib, libultra, controller] + - [0x597A0, lib, libultra, siacs] + - [0x59860, pad] + - [0x598C0, lib, libultra, createthread] + - [0x59A10, lib, libultra, contreaddata] + - [0x59BF0, lib, libultra, setcount] + - [0x59C00, lib, libultra, conteeplongread] + - [0x59C90, lib, libultra, virtualtophysical] + - [0x59D10, lib, libultra, setsr] + - [0x59D20, lib, libultra, writebackdcache] + - [0x59DA0, lib, libultra, initialize] + - [0x5A0F0, lib, libultra, getsr] + - [0x5A100, lib, libultra, gbpakinit] + - [0x5A330, lib, libultra, pfsgetstatus] + - [0x5A560, lib, libultra, reverb] + - [0x5B1C0, lib, libultra, perspective] + - [0x5B450, lib, libultra, sprawdma] + - [0x5B4E0, lib, libultra, sirawdma] + - [0x5B590, lib, libultra, epilinkhandle] + - [0x5B5E0, lib, libultra, viblack] + - [0x5B650, lib, libultra, sirawread] + - [0x5B6A0, lib, libultra, sptaskyield] + - [0x5B6C0, lib, libultra, lookatref] + - [0x5BB50, lib, libultra, mtxutil] + - [0x5BDC0, lib, libultra, visetmode] + - [0x5BE30, lib, libultra, virepeatline] + - [0x5BEA0, lib, libultra, pfsisplug] + - [0x5C1E0, lib, libultra, probetlb] + - [0x5C2A0, lib, libultra, pimgr] + - [0x5C410, pad] + - [0x5C420, lib, libultra, devmgr] + - [0x5C830, lib, libultra, pirawdma] + - [0x5C900, lib, libultra, getcount] + - [0x5C910, lib, libultra, conteepprobe] + - [0x5C980, lib, libultra, conteepwrite] + - [0x5CD50, lib, libultra, getmemsize] + - [0x5CE70, lib, libultra, contpfs] + - [0x5D9F0, lib, libultra, seteventmesg] + - [0x5DAB0, lib, libultra, sqrtf] + - [0x5DAC0, lib, libultra, afterprenmi] + - [0x5DAE0, lib, libultra, mtxcatf] + - [0x5DCF0, lib, libultra, mtxcatl] + - [0x5DDB0, lib, libultra, random] + - [0x5DDE0, lib, libultra, xprintf] + - [0x5EAA0, lib, libultra, gbpakgetstatus] + - [0x5EC20, lib, libultra, sprintf] + - [0x5ECA0, lib, libultra, unmaptlball] + - [0x5ECF0, lib, libultra, epidma] + - [0x5EDD0, lib, libultra, heapinit] + - [0x5EE10, lib, libultra, syncprintf] + - [0x5EE50, lib, libultra, string] + - [0x5EEF0, lib, libultra, invaldcache] + - [0x5EFA0, lib, libultra, createmesgqueue] + - [0x5EFD0, lib, libultra, invalicache] + - [0x5F050, lib, libultra, conteeplongwrite] + - [0x5F140, lib, libultra, sp] + - [0x5F170, lib, libultra, si] + - [0x5F1A0, lib, libultra, translate] + - [0x5F240, lib, libultra, jammesg] + - [0x5F390, lib, libultra, setthreadpri] + - [0x5F470, lib, libultra, getthreadpri] + - [0x5F490, lib, libultra, epirawread] + - [0x5F5F0, lib, libultra, viswapbuf] + - [0x5F640, lib, libultra, epirawdma] + - [0x5F820, lib, libultra, sptaskyielded] + - [0x5F8A0, lib, libultra, rotaterpy] + - [0x5FA40, lib, libultra, bcmp] + - [0x5FB60, lib, libultra, rotate] + - [0x5FD50, lib, libultra, gettime] + - [0x5FDE0, lib, libultra, timerintr] + - [0x601E0, lib, libultra, synthesizer] + - [0x60860, lib, libultra, drvrnew] + - [0x61010, lib, libultra, mainbus] + - [0x61160, lib, libultra, auxbus] + - [0x61270, lib, libultra, env] + - [0x61EF0, lib, libultra, resample] + - [0x621F0, lib, libultra, load] + - [0x62D40, lib, libultra, filter] + - [0x62D60, lib, libultra, save] + - [0x62E20, lib, libultra, setglobalintmask] + - [0x62E70, lib, libultra, aisetfreq] + - [0x62FC0, lib, libultra, dpctr] + - [0x63010, lib, libultra, getactivequeue] + - [0x63020, lib, libultra, normalize] + - [0x630B0, lib, libultra, setcompare] + - [0x630C0, lib, libultra, aigetstat] + - [0x630D0, lib, libultra, dpsetstat] + - [0x630E0, lib, libultra, copy] + - [0x63160, lib, libultra, bcopy] + - [0x63470, lib, libultra, resetglobalintmask] + - [0x634D0, lib, libultra, ortho] + - [0x63690, lib, libultra, interrupt] + - [0x63720, lib, libultra, vi] + - [0x63860, lib, libultra, viswapcontext] + - [0x63B60, lib, libultra, pigetcmdq] + - [0x63B90, lib, libultra, cosf] + - [0x63D00, lib, libultra, epiread] + - [0x63D50, lib, libultra, visetspecial] + - [0x63EB0, lib, libultra, settime] + - [0x63EE0, lib, libultra, visetevent] + - [0x63F50, lib, libultra, gbpakreadid] + - [0x64110, lib, libultra, cartrominit] + - [0x64270, lib, libultra, pfsselectbank] + - [0x642F0, lib, libultra, setfpccsr] + - [0x64300, lib, libultra, aigetlen] + - [0x64310, lib, libultra, epiwrite] + - [0x64360, lib, libultra, maptlbrdb] + - [0x643C0, lib, libultra, yieldthread] + - [0x64410, lib, libultra, contramwrite] + - [0x64660, lib, libultra, contramread] + - [0x64890, lib, libultra, crc] + - [0x64A00, lib, libultra, getcause] + - [0x64A10, lib, libultra, epirawwrite] + - [0x64B70, lib, libultra, settimer] + - [0x64C50, lib, libultra, xldtob] + - [0x65710, lib, libultra, ldiv] + - [0x658A0, lib, libultra, xlitob] + - [0x65B40, lib, libultra, sirawwrite] + - [0x65B90, lib, libultra, spsetstat] + - [0x65BA0, lib, libultra, spgetstat] + - [0x65BB0, pad] + - [0x65BC0, lib, libultra, vimgr] + - [0x65ED0, lib, libultra, vigetcurrcontext] + - [0x65EE0, lib, libultra, writebackdcacheall] + - [0x65F10, lib, libultra, heapalloc] + - [0x65F70, lib, libultra, startthread] + - [0x660C0, lib, libultra, visetxscale] + - [0x661F0, lib, libultra, visetyscale] + - [0x66250, lib, libultra, llcvt] + - [0x66460, lib, libultra, synallocfx] + - [0x66500, lib, libultra, syndelete] + - [0x66510, lib, libultra, gbpakreadwrite] + - [0x666D0, lib, libultra, gbpaksetbank] + - [0x667A0, lib, libultra, aisetnextbuf] + - [0x66850, lib, libultra, ai] + - [0x66880, lib, libultra, conteepread] + - [0x66AD0, lib, libultra, vigetcurrframebuf] + - [0x66B10, lib, libultra, spsetpc] + - [0x66B50, lib, libultra, sethwinterrupt] + #- [0x66BC0, asm] - [0x66BC0, bin] - [0x66C90, bin, F3DEX2] @@ -337,25 +330,41 @@ segments: - [0x6A3E0, data, rom_data_6A3E0] - [0x6A3F0, .data, math_util] - [0x6FC00, data, rom_data_6FC00] + + # libleo - [0x7A180, .data, libleo/driverominit] - [0x7A190, data, rom_data_7A190] - - [0x7A2A0, .data, libultra/os/initialize] - - [0x7A2C0, .data, libultra/al/reverb] + + # libultra + - [0x7A210, lib, libultra, piacs, .data] + - [0x7A220, lib, libultra, thread, .data] + - [0x7A240, lib, libultra, sl, .data] + - [0x7A250, lib, libultra, exceptasm, .data] + - [0x7A280, lib, libultra, controller, .data] + - [0x7A290, lib, libultra, siacs, .data] + - [0x7A2A0, lib, libultra, initialize, .data] + - [0x7A2C0, lib, libultra, reverb, .data] - [0x7A2E0, data, rom_data_7A2E0] - - [0x7B550, .data, libultra/gu/random] - - [0x7B560, .data, libultra/libc/xprintf] - - [0x7B5B0, .data, libultra/os/timerintr] - - [0x7B5C0, .data, libultra/al/drvrNew] - - [0x7B750, .data, libultra/al/env] - - [0x7B890, .data, libultra/io/vi] - - [0x7B900, data, rom_data_7B900] - - [0x7B9F0, .data, libultra/io/gbpakreadid] - - [0x7BA40, .data, libultra/io/cartrominit] - - [0x7BA50, data, rom_data_7BA50] - - [0x7BA60, .data, libultra/libc/xlitob] - - [0x7BA90, .data, libultra/io/vimgr] - - [0x7BAB0, .data, libultra/io/aisetnextbuf] - - [0x7BAC0, data, rom_data_7BAC0] + - [0x7B460, lib, libultra, pimgr, .data] + - [0x7B490, lib, libultra, vimodentsclpn1, .data] + - [0x7B4E0, lib, libultra, vimodempallpn1, .data] + - [0x7B530, lib, libultra, contpfs, .data] + - [0x7B540, lib, libultra, seteventmesg, .data] + - [0x7B550, lib, libultra, random, .data] + - [0x7B560, lib, libultra, xprintf, .data] + - [0x7B5B0, lib, libultra, timerintr, .data] + - [0x7B5C0, lib, libultra, drvrnew, .data] + - [0x7B750, lib, libultra, env, .data] + - [0x7B890, lib, libultra, vi, .data] + - [0x7B890, lib, libultra, vimodepallan1, .data] + - [0x7B950, lib, libultra, vimodentsclan1, .data] + - [0x7B9A0, lib, libultra, vimodempallan1, .data] + - [0x7B9F0, lib, libultra, gbpakreadid, .data] + - [0x7BA40, lib, libultra, cartrominit, .data] + - [0x7BA50, lib, libultra, contramread, .data] + - [0x7BA60, lib, libultra, xlitob, .data] + - [0x7BA90, lib, libultra, vimgr, .data] + - [0x7BAB0, lib, libultra, aisetnextbuf, .data] # Start of .rodata - [0x7BAC0, .rodata, rsp] @@ -391,6 +400,8 @@ segments: - [0x7E560, rodata, rom_rodata_7E560] - [0x7E5D0, rodata, rom_rodata_7E5D0] - [0x7E600, rodata, rom_rodata_7E600] + + # libleo - [0x7E630, .rodata, libleo/leofunc] - [0x7E640, .rodata, libleo/leocmdex] - [0x7E6F0, rodata, rom_rodata_7E6F0] @@ -399,25 +410,28 @@ segments: - [0x7E950, .rodata, libleo/leoc2ecc] - [0x7ED70, .rodata, libleo/leomseq_tbl] - [0x7EDF0, .rodata, libleo/leotimer] - - [0x7EE10, rodata, rom_rodata_7EE10] - - [0x7EE90, .rodata, libultra/gu/sinf] - - [0x7EEE0, rodata, rom_rodata_7EEE0] - - [0x7EF30, .rodata, libultra/al/reverb] - - [0x7EF60, .rodata, libultra/gu/perspective] - - [0x7EF70, .rodata, libultra/io/devmgr] - - [0x7EF90, .rodata, libultra/libc/xprintf] - - [0x7F090, .rodata, libultra/gu/rotateRPY] - - [0x7F0A0, .rodata, libultra/gu/rotate] - - [0x7F0B0, .rodata, libultra/al/synthesizer] - - [0x7F0C0, .rodata, libultra/al/drvrNew] - - [0x7F0E0, .rodata, libultra/al/env] - - [0x7F130, .rodata, libultra/al/resample] - - [0x7F180, .rodata, libultra/gu/cosf] - - [0x7F1D0, rodata, rom_rodata_7F1D0] - - [0x7F1E0, .rodata, libultra/libc/xldtob] - - [0x7F240, .rodata, libultra/libc/llcvt] - - [0x7F250, bin, F3DEX2_data] # F3DEX2 data - - [0x7F670, bin, unk_bin_7F670] + + # libultra + - [0x7EE10, lib, libultra, setintmask, .rodata] + - [0x7EE90, lib, libultra, sinf, .rodata] + - [0x7EEE0, lib, libultra, exceptasm, .rodata] + - [0x7EF30, lib, libultra, reverb, .rodata] + - [0x7EF60, lib, libultra, perspective, .rodata] + - [0x7EF70, lib, libultra, devmgr, .rodata] + - [0x7EF90, lib, libultra, xprintf, .rodata] + - [0x7F090, lib, libultra, rotaterpy, .rodata] + - [0x7F0A0, lib, libultra, rotate, .rodata] + - [0x7F0B0, lib, libultra, synthesizer, .rodata] + - [0x7F0C0, lib, libultra, drvrnew, .rodata] + - [0x7F0E0, lib, libultra, env, .rodata] + - [0x7F130, lib, libultra, resample, .rodata] + - [0x7F180, lib, libultra, cosf, .rodata] + - [0x7F1D0, lib, libultra, libm_vals, .rodata] + - [0x7F1E0, lib, libultra, xldtob, .rodata] + - [0x7F240, lib, libultra, llcvt, .rodata] + + - [0x7F250, rodata, F3DEX2_data] # F3DEX2 data + - [0x7F670, rodata, unk_bin_7F670] - [0x7F980] # .bss @@ -431,15 +445,33 @@ segments: - {vram: 0x800A74C0, type: .bss, name: crash_screen} - {vram: 0x800A7EA0, type: .bss, name: profiler} - {vram: 0x800A8100, type: bss, name: unk_bss_2} + + # libleo - {vram: 0x80100740, type: .bss, name: libleo/driverominit} - {vram: 0x801007C0, type: bss, name: unk_bss_5} - {vram: 0x80101090, type: .bss, name: libleo/leomseq_tbl} - {vram: 0x801010D0, type: bss, name: unk_bss_6} - - {vram: 0x80103880, type: .bss, name: libultra/gu/rotate} - - {vram: 0x80103890, type: .bss, name: libultra/os/timerintr} - - {vram: 0x801038E4, type: .bss, name: libultra/io/cartrominit} - - {vram: 0x80103950, type: .bss, name: libultra/io/vimgr} - - {vram: 0x80104b70, type: .bss, name: libultra/io/conteepread} + + # ultralib + - {type: lib, vram: 0x801020D0, name: libultra, object: leointerrupt, section: .bss} + - {type: lib, vram: 0x801020E0, name: libultra, object: piacs, section: .bss} + - {type: lib, vram: 0x80102100, name: libultra, object: sptask, section: .bss} + - {type: lib, vram: 0x80102140, name: libultra, object: controller, section: .bss} + - {type: lib, vram: 0x801021D0, name: libultra, object: siacs, section: .bss} + - {type: lib, vram: 0x801021F0, name: libultra, object: initialize, section: .bss} + - {type: lib, vram: 0x80102200, name: libultra, object: gbpakinit, section: .bss} + - {type: lib, vram: 0x80102240, name: libultra, object: kdebugserver, section: .bss} + - {type: lib, vram: 0x801023F0, name: libultra, object: pfsisplug, section: .bss} + - {type: lib, vram: 0x80102430, name: libultra, object: leodiskinit, section: .bss} + - {type: lib, vram: 0x80102520, name: libultra, object: pimgr, section: .bss} + - {type: lib, vram: 0x801036F0, name: libultra, object: contpfs, section: .bss} + - {type: lib, vram: 0x801037F0, name: libultra, object: seteventmesg, section: .bss} + - {type: lib, vram: 0x80103830, name: libultra, object: rotaterpy, section: .bss} + - {type: lib, vram: 0x80103880, name: libultra, object: rotate, section: .bss} + - {type: lib, vram: 0x80103890, name: libultra, object: timerintr, section: .bss} + - {type: lib, vram: 0x801038D0, name: libultra, object: cartrominit, section: .bss} + - {type: lib, vram: 0x80103950, name: libultra, object: vimgr, section: .bss} + - {type: lib, vram: 0x80104b70, name: libultra, object: conteepread, section: .bss} - [0x7F980] - name: heap @@ -464,7 +496,7 @@ segments: - [0x89020, hasm, fragments/1/fragment1_code_asm] - [0x8D1A0, data, fragments/1/fragment1_data] - [0xA8E80, rodata, fragments/1/fragment1_rodata] - - [0xAAB60, bin, fragments/1/fragment1_relocs] + - [0xAAB60, rodatabin, fragments/1/fragment1_reloc] - name: fragment1_misc_yay0 type: code @@ -485,11 +517,11 @@ segments: start: 0x107FA0 vram: 0x87800000 subsegments: - - [0x107FA0, hasm, fragments/2/fragment2_header] + - [0x107FA0, textbin, fragments/2/fragment2_header] - [0x107FC0, c, fragments/2/fragment2] - [0x10E2D0, data, fragments/2/fragment2_data] - [0x117850, rodata, fragments/2/fragment2_rodata] - - [0x1179C0, bin, fragments/2/fragment2_relocs] + - [0x1179C0, rodatabin, fragments/2/fragment2_reloc] # model animation code - name: fragment3 @@ -498,11 +530,11 @@ segments: start: 0x118990 vram: 0x87900000 subsegments: - - [0x118990, hasm, fragments/3/fragment3_header] + - [0x118990, textbin, fragments/3/fragment3_header] - [0x1189B0, c, fragments/3/fragment3] - [0x11C730, data, fragments/3/fragment3_data] - [0x11E810, rodata, fragments/3/fragment3_rodata] - - [0x11E9D0, bin, fragments/3/fragment3_reloc] + - [0x11E9D0, rodatabin, fragments/3/fragment3_reloc] # MINIGAMES unknown code placed but not executed - name: fragment4 @@ -511,10 +543,10 @@ segments: start: 0x11F560 vram: 0x87A00000 subsegments: - - [0x11F560, hasm, fragments/4/fragment4_header] + - [0x11F560, textbin, fragments/4/fragment4_header] - [0x11F580, c, fragments/4/fragment4] - [0x120670, data, fragments/4/fragment4_data] - - [0x120860, bin, fragments/4/fragment4_reloc] + - [0x120860, rodatabin, fragments/4/fragment4_reloc] # DROWZEE MINIGAME unknown code placed but not executed, might be something about other controllers - name: fragment5 @@ -523,10 +555,10 @@ segments: start: 0x120920 vram: 0x87B00000 # unknown. we dont actually know this fragment's vaddr yet, but we need a unique vaddr so the linker doesnt complain. Might be an unused fragment, as it's very very small, and seems to only poll the controller. subsegments: - - [0x120920, hasm, fragments/5/fragment5_header] + - [0x120920, textbin, fragments/5/fragment5_header] - [0x120940, c, fragments/5/fragment5] - [0x1209E0, data, fragments/5/fragment5_data] - - [0x120A00, bin, fragments/5/fragment5_reloc] + - [0x120A00, rodatabin, fragments/5/fragment5_reloc] # magikarp minigame code - name: fragment6 @@ -535,11 +567,11 @@ segments: start: 0x120A10 vram: 0x86000000 subsegments: - - [0x120A10, hasm, fragments/6/fragment6_header] + - [0x120A10, textbin, fragments/6/fragment6_header] - [0x120A30, c, fragments/6/fragment6] - [0x123330, .data, fragments/6/fragment6] - [0x123890, .rodata, fragments/6/fragment6] - - [0x123940, bin, fragments/6/fragment6_reloc] + - [0x123940, rodatabin, fragments/6/fragment6_reloc] - name: fragment6_misc type: code @@ -556,11 +588,11 @@ segments: start: 0x1278D0 vram: 0x86100000 subsegments: - - [0x1278D0, hasm, fragments/7/fragment7_header] + - [0x1278D0, textbin, fragments/7/fragment7_header] - [0x1278F0, c, fragments/7/fragment7] - [0x12BF10, data, fragments/7/fragment7_data] - [0x12CC90, rodata, fragments/7/fragment7_rodata] - - [0x12CD50, bin, fragments/7/fragment7_reloc] + - [0x12CD50, rodatabin, fragments/7/fragment7_reloc] # rattata minigame code - name: fragment8 @@ -569,11 +601,11 @@ segments: start: 0x12DF40 vram: 0x86200000 subsegments: - - [0x12DF40, hasm, fragments/8/fragment8_header] + - [0x12DF40, textbin, fragments/8/fragment8_header] - [0x12DF60, c, fragments/8/fragment8] - [0x131800, data, fragments/8/fragment8_data] - [0x131AE0, rodata, fragments/8/fragment8_rodata] - - [0x131D70, bin, fragments/8/fragment8_reloc] + - [0x131D70, rodatabin, fragments/8/fragment8_reloc] - name: fragment9 type: code @@ -581,11 +613,11 @@ segments: start: 0x1329E0 vram: 0x86300000 subsegments: - - [0x1329E0, hasm, fragments/9/fragment9_header] + - [0x1329E0, textbin, fragments/9/fragment9_header] - [0x132A00, c, fragments/9/fragment9] - [0x133FE0, data, fragments/9/fragment9_data] - [0x1340A0, rodata, fragments/9/fragment9_rodata] - - [0x1340F0, bin, fragments/9/fragment9_reloc] + - [0x1340F0, rodatabin, fragments/9/fragment9_reloc] # drowzee minigame code - name: fragment10 @@ -594,10 +626,10 @@ segments: start: 0x134680 vram: 0x86400000 subsegments: - - [0x134680, hasm, fragments/10/fragment10_header] + - [0x134680, textbin, fragments/10/fragment10_header] - [0x1346A0, c, fragments/10/fragment10] - [0x136E40, data, fragments/10/fragment10_data] - - [0x1386F0, bin, fragments/10/fragment10_reloc] + - [0x1386F0, rodatabin, fragments/10/fragment10_reloc] # pikachu minigame code - name: fragment11 @@ -606,11 +638,11 @@ segments: start: 0x138F20 vram: 0x86500000 subsegments: - - [0x138F20, hasm, fragments/11/fragment11_header] + - [0x138F20, textbin, fragments/11/fragment11_header] - [0x138F40, c, fragments/11/fragment11] - [0x13BB40, data, fragments/11/fragment11_data] - [0x142170, rodata, fragments/11/fragment11_rodata] - - [0x142200, bin, fragments/11/fragment11_reloc] + - [0x142200, rodatabin, fragments/11/fragment11_reloc] # transfer pak error code - name: fragment12 @@ -619,11 +651,11 @@ segments: start: 0x142B10 vram: 0x86600000 subsegments: - - [0x142B10, hasm, fragments/12/fragment12_header] + - [0x142B10, textbin, fragments/12/fragment12_header] - [0x142B30, c, fragments/12/fragment12] - [0x143360, data, fragments/12/fragment12_data] - [0x143400, rodata, fragments/12/fragment12_rodata] - - [0x143450, bin, fragments/12/fragment12_reloc] + - [0x143450, rodatabin, fragments/12/fragment12_reloc] - name: fragment13 type: code @@ -631,11 +663,11 @@ segments: start: 0x143700 vram: 0x86700000 subsegments: - - [0x143700, hasm, fragments/13/fragment13_header] + - [0x143700, textbin, fragments/13/fragment13_header] - [0x143720, c, fragments/13/fragment13] - [0x143F40, data, fragments/13/fragment13_data] - [0x143FE0, rodata, fragments/13/fragment13_rodata] - - [0x144030, bin, fragments/13/fragment13_reloc] + - [0x144030, rodatabin, fragments/13/fragment13_reloc] # lickitung minigame code - name: fragment14 @@ -644,11 +676,11 @@ segments: start: 0x1442E0 vram: 0x86800000 subsegments: - - [0x1442E0, hasm, fragments/14/fragment14_header] + - [0x1442E0, textbin, fragments/14/fragment14_header] - [0x144300, c, fragments/14/fragment14] - [0x14AFB0, data, fragments/14/fragment14_data] - [0x14B660, rodata, fragments/14/fragment14_rodata] - - [0x14B7E0, bin, fragments/14/fragment14_reloc] + - [0x14B7E0, rodatabin, fragments/14/fragment14_reloc] # gallery camera code - name: fragment15 @@ -657,11 +689,11 @@ segments: start: 0x14CA50 vram: 0x86900000 subsegments: - - [0x14CA50, hasm, fragments/15/fragment15_header] + - [0x14CA50, textbin, fragments/15/fragment15_header] - [0x14CA70, c, fragments/15/fragment15] - [0x1554D0, data, fragments/15/fragment15_data] - [0x156EB0, rodata, fragments/15/fragment15_rodata] - - [0x157060, bin, fragments/15/fragment15_reloc] + - [0x157060, rodatabin, fragments/15/fragment15_reloc] # credits loader - name: fragment16 @@ -670,11 +702,11 @@ segments: start: 0x1589E0 vram: 0x86A00000 subsegments: - - [0x1589E0, hasm, fragments/16/fragment16_header] + - [0x1589E0, textbin, fragments/16/fragment16_header] - [0x158A00, c, fragments/16/fragment16] - [0x15AF80, data, fragments/16/fragment16_data] - [0x15EB20, rodata, fragments/16/fragment16_rodata] - - [0x15EB50, bin, fragments/16/fragment16_reloc] + - [0x15EB50, rodatabin, fragments/16/fragment16_reloc] # stage loader code - name: fragment17 @@ -683,11 +715,11 @@ segments: start: 0x15F990 vram: 0x86B00000 subsegments: - - [0x15F990, hasm, fragments/17/fragment17_header] + - [0x15F990, textbin, fragments/17/fragment17_header] - [0x15F9B0, c, fragments/17/fragment17] - [0x16B580, data, fragments/17/fragment17_data] - [0x16DD70, rodata, fragments/17/fragment17_rodata] - - [0x16DF60, bin, fragments/17/fragment17_reloc] + - [0x16DF60, rodatabin, fragments/17/fragment17_reloc] # ekans minigame code - name: fragment18 @@ -696,11 +728,11 @@ segments: start: 0x1708B0 vram: 0x86C00000 subsegments: - - [0x1708B0, hasm, fragments/18/fragment18_header] + - [0x1708B0, textbin, fragments/18/fragment18_header] - [0x1708D0, c, fragments/18/fragment18] - [0x1750F0, data, fragments/18/fragment18_data] - [0x17EC60, rodata, fragments/18/fragment18_rodata] - - [0x17ED30, bin, fragments/18/fragment18_reloc] + - [0x17ED30, rodatabin, fragments/18/fragment18_reloc] - name: fragment19 type: code @@ -708,11 +740,11 @@ segments: start: 0x17FB40 vram: 0x86D00000 subsegments: - - [0x17FB40, hasm, fragments/19/fragment19_header] + - [0x17FB40, textbin, fragments/19/fragment19_header] - [0x17FB60, c, fragments/19/fragment19] - [0x180070, data, fragments/19/fragment19_data] - [0x180100, rodata, fragments/19/fragment19_rodata] - - [0x180110, bin, fragments/19/fragment19_reloc] + - [0x180110, rodatabin, fragments/19/fragment19_reloc] # metapod minigame code - name: fragment20 @@ -721,11 +753,11 @@ segments: start: 0x1802B0 vram: 0x86E00000 subsegments: - - [0x1802B0, hasm, fragments/20/fragment20_header] + - [0x1802B0, textbin, fragments/20/fragment20_header] - [0x1802D0, c, fragments/20/fragment20] - [0x183260, data, fragments/20/fragment20_data] - [0x184FA0, rodata, fragments/20/fragment20_rodata] - - [0x185010, bin, fragments/20/fragment20_reloc] + - [0x185010, rodatabin, fragments/20/fragment20_reloc] # sandshrew minigame code - name: fragment21 @@ -734,11 +766,11 @@ segments: start: 0x185A10 vram: 0x86F00000 subsegments: - - [0x185A10, hasm, fragments/21/fragment21_header] + - [0x185A10, textbin, fragments/21/fragment21_header] - [0x185A30, c, fragments/21/fragment21] - [0x1880A0, data, fragments/21/fragment21_data] - [0x190B90, rodata, fragments/21/fragment21_rodata] - - [0x190C00, bin, fragments/21/fragment21_reloc] + - [0x190C00, rodatabin, fragments/21/fragment21_reloc] # pokemon lab loader - name: fragment22 @@ -747,11 +779,11 @@ segments: start: 0x191660 vram: 0x88000000 subsegments: - - [0x191660, hasm, fragments/22/fragment22_header] + - [0x191660, textbin, fragments/22/fragment22_header] - [0x191680, c, fragments/22/fragment22] - [0x193EA0, data, fragments/22/fragment22_data] - [0x1A8320, rodata, fragments/22/fragment22_rodata] - - [0x1A8350, bin, fragments/22/fragment22_reloc] + - [0x1A8350, rodatabin, fragments/22/fragment22_reloc] # pokemon lab PC loader - name: fragment23 @@ -760,11 +792,11 @@ segments: start: 0x1A8570 vram: 0x88200000 subsegments: - - [0x1A8570, hasm, fragments/23/fragment23_header] + - [0x1A8570, textbin, fragments/23/fragment23_header] - [0x1A8590, c, fragments/23/fragment23] - [0x1C0160, data, fragments/23/fragment23_data] - [0x1CD3C0, rodata, fragments/23/fragment23_rodata] - - [0x1CD500, bin, fragments/23/fragment23_reloc] + - [0x1CD500, rodatabin, fragments/23/fragment23_reloc] # pokemon lab PC: list code - name: fragment24 @@ -773,11 +805,11 @@ segments: start: 0x1CE9E0 vram: 0x88300000 subsegments: - - [0x1CE9E0, hasm, fragments/24/fragment24_header] + - [0x1CE9E0, textbin, fragments/24/fragment24_header] - [0x1CEA00, c, fragments/24/fragment24] - [0x1E5BB0, data, fragments/24/fragment24_data] - [0x1E8C40, rodata, fragments/24/fragment24_rodata] - - [0x1E8EA0, bin, fragments/24/fragment24_reloc] + - [0x1E8EA0, rodatabin, fragments/24/fragment24_reloc] # POKEMON LAB unknown code placed but not executed - name: fragment25 @@ -786,10 +818,10 @@ segments: start: 0x1EA640 vram: 0x88400000 subsegments: - - [0x1EA640, hasm, fragments/25/fragment25_header] + - [0x1EA640, textbin, fragments/25/fragment25_header] - [0x1EA660, c, fragments/25/fragment25] - [0x1EA740, data, fragments/25/fragment25_data] - - [0x1EA840, bin, fragments/25/fragment25_reloc] + - [0x1EA840, rodatabin, fragments/25/fragment25_reloc] # POKEMON LAB unknown code placed but not executed - name: fragment26 @@ -798,11 +830,11 @@ segments: start: 0x1EA860 vram: 0x88500000 subsegments: - - [0x1EA860, hasm, fragments/26/fragment26_header] + - [0x1EA860, textbin, fragments/26/fragment26_header] - [0x1EA880, c, fragments/26/fragment26] - [0x1F77E0, data, fragments/26/fragment26_data] - [0x1F7810, rodata, fragments/26/fragment26_rodata] - - [0x1F7840, bin, fragments/26/fragment26_reloc] + - [0x1F7840, rodatabin, fragments/26/fragment26_reloc] # pokemon lab PC: pokemon, item, boxes etc - name: fragment27 @@ -811,11 +843,11 @@ segments: start: 0x1F7C90 vram: 0x88600000 subsegments: - - [0x1F7C90, hasm, fragments/27/fragment27_header] + - [0x1F7C90, textbin, fragments/27/fragment27_header] - [0x1F7CB0, c, fragments/27/fragment27] - [0x1FD750, data, fragments/27/fragment27_data] - [0x214060, rodata, fragments/27/fragment27_rodata] - - [0x2141A0, bin, fragments/27/fragment27_reloc] + - [0x2141A0, rodatabin, fragments/27/fragment27_reloc] # pokemon lab: pokedex loader - name: fragment28 @@ -824,11 +856,11 @@ segments: start: 0x214900 vram: 0x88800000 subsegments: - - [0x214900, hasm, fragments/28/fragment28_header] + - [0x214900, textbin, fragments/28/fragment28_header] - [0x214920, c, fragments/28/fragment28] - [0x21CA50, data, fragments/28/fragment28_data] - [0x23AF80, rodata, fragments/28/fragment28_rodata] - - [0x23B0A0, bin, fragments/28/fragment28_reloc] + - [0x23B0A0, rodatabin, fragments/28/fragment28_reloc] # POKEMON LAB PC some text functions but not executed - name: fragment29 @@ -837,10 +869,10 @@ segments: start: 0x23C250 vram: 0x88900000 subsegments: - - [0x23C250, hasm, fragments/29/fragment29_header] + - [0x23C250, textbin, fragments/29/fragment29_header] - [0x23C270, c, fragments/29/fragment29] - [0x23D3C0, data, fragments/29/fragment29_data] - - [0x23D430, bin, fragments/29/fragment29_reloc] + - [0x23D430, rodatabin, fragments/29/fragment29_reloc] - name: fragment29_misc_1 type: code @@ -872,9 +904,9 @@ segments: start: 0x255230 vram: 0x88A00000 # unknown vram, since nothing loads this. probably 88A00000? subsegments: - - [0x255230, hasm, fragments/30/fragment30_header] + - [0x255230, textbin, fragments/30/fragment30_header] - [0x255250, c, fragments/30/fragment30] - - [0x2552B0, bin, fragments/30/fragment30_reloc] + - [0x2552B0, rodatabin, fragments/30/fragment30_reloc] # transfer pak checker - name: fragment31 @@ -883,12 +915,12 @@ segments: start: 0x2552C0 vram: 0x81000000 subsegments: - - [0x2552C0, hasm, fragments/31/fragment31_header] - - [0x2552E0, bin, fragments/31/fragment31_unk_table] # what is this? + - [0x2552C0, textbin, fragments/31/fragment31_header] + - [0x2552E0, textbin, fragments/31/fragment31_unk_table] # what is this? - [0x2554C0, c, fragments/31/fragment31] - [0x259290, data, fragments/31/fragment31_data] - [0x259480, rodata, fragments/31/fragment31_rodata] - - [0x259AA0, bin, fragments/31/fragment31_reloc] + - [0x259AA0, rodatabin, fragments/31/fragment31_reloc] # drowzee minigame stage animations - name: fragment32 @@ -897,10 +929,10 @@ segments: start: 0x25A740 vram: 0x81100000 subsegments: - - [0x25A740, hasm, fragments/32/fragment32_header] + - [0x25A740, textbin, fragments/32/fragment32_header] - [0x25A760, c, fragments/32/fragment32] - [0x25B060, data, fragments/32/fragment32_data] - - [0x25B070, bin, fragments/32/fragment32_reloc] + - [0x25B070, rodatabin, fragments/32/fragment32_reloc] # transfer pak code - name: fragment33 @@ -909,11 +941,11 @@ segments: start: 0x25B0D0 vram: 0x81300000 subsegments: - - [0x25B0D0, hasm, fragments/33/fragment33_header] + - [0x25B0D0, textbin, fragments/33/fragment33_header] - [0x25B0F0, asm, fragments/33/fragment33] - [0x25ECF0, data, fragments/33/fragment33_data] - [0x25F020, rodata, fragments/33/fragment33_rodata] - - [0x25F070, bin, fragments/33/fragment33_reloc] + - [0x25F070, rodatabin, fragments/33/fragment33_reloc] - name: fragment33_misc type: code @@ -930,11 +962,11 @@ segments: start: 0x261F70 vram: 0x81400000 subsegments: - - [0x261F70, hasm, fragments/34/fragment34_header] + - [0x261F70, textbin, fragments/34/fragment34_header] - [0x261F90, c, fragments/34/fragment34] - [0x26F9C0, data, fragments/34/fragment34_data] - [0x270570, rodata, fragments/34/fragment34_rodata] - - [0x270590, bin, fragments/34/fragment34_reloc] + - [0x270590, rodatabin, fragments/34/fragment34_reloc] # n64 logo code - name: fragment35 @@ -943,9 +975,9 @@ segments: start: 0x271260 vram: 0x82000000 subsegments: - - [0x271260, hasm, fragments/35/fragment35_header] + - [0x271260, textbin, fragments/35/fragment35_header] - [0x271280, c, fragments/35/fragment35] - - [0x2717C0, bin, fragments/35/fragment35_reloc] + - [0x2717C0, rodatabin, fragments/35/fragment35_reloc] # title screen code - name: fragment36 @@ -954,11 +986,11 @@ segments: start: 0x2717E0 vram: 0x82100000 subsegments: - - [0x2717E0, hasm, fragments/36/fragment36_header] + - [0x2717E0, textbin, fragments/36/fragment36_header] - [0x271800, c, fragments/36/fragment36] - [0x2725A0, data, fragments/36/fragment36_data] - [0x272660, rodata, fragments/36/fragment36_rodata] - - [0x272680, bin, fragments/36/fragment36_reloc] + - [0x272680, rodatabin, fragments/36/fragment36_reloc] # stadium field loader - name: fragment37 @@ -967,11 +999,11 @@ segments: start: 0x272830 vram: 0x82200000 subsegments: - - [0x272830, hasm, fragments/37/fragment37_header] + - [0x272830, textbin, fragments/37/fragment37_header] - [0x272850, c, fragments/37/fragment37] - [0x2757D0, data, fragments/37/fragment37_data] - [0x275900, rodata, fragments/37/fragment37_rodata] - - [0x275920, bin, fragments/37/fragment37_reloc] + - [0x275920, rodatabin, fragments/37/fragment37_reloc] # event battle loader - name: fragment38 @@ -980,11 +1012,11 @@ segments: start: 0x275CE0 vram: 0x82300000 subsegments: - - [0x275CE0, hasm, fragments/38/fragment38_header] + - [0x275CE0, textbin, fragments/38/fragment38_header] - [0x275D00, c, fragments/38/fragment38] - [0x27B600, data, fragments/38/fragment38_data] - [0x27B6B0, rodata, fragments/38/fragment38_rodata] - - [0x27B700, bin, fragments/38/fragment38_reloc] + - [0x27B700, rodatabin, fragments/38/fragment38_reloc] # minigames loader - name: fragment39 @@ -993,11 +1025,11 @@ segments: start: 0x27BCA0 vram: 0x82500000 subsegments: - - [0x27BCA0, hasm, fragments/39/fragment39_header] + - [0x27BCA0, textbin, fragments/39/fragment39_header] - [0x27BCC0, c, fragments/39/fragment39] - [0x281E50, data, fragments/39/fragment39_data] - [0x2846C0, rodata, fragments/39/fragment39_rodata] - - [0x284790, bin, fragments/39/fragment39_reloc] + - [0x284790, rodatabin, fragments/39/fragment39_reloc] # gym leader castle clear / pokemon gift code - name: fragment40 @@ -1006,11 +1038,11 @@ segments: start: 0x285DC0 vram: 0x83100000 subsegments: - - [0x285DC0, hasm, fragments/40/fragment40_header] + - [0x285DC0, textbin, fragments/40/fragment40_header] - [0x285DE0, c, fragments/40/fragment40] - [0x2879A0, data, fragments/40/fragment40_data] - [0x287C80, rodata, fragments/40/fragment40_rodata] - - [0x287CA0, bin, fragments/40/fragment40_reloc] + - [0x287CA0, rodatabin, fragments/40/fragment40_reloc] # pokemon trade machine loader - name: fragment41 @@ -1019,11 +1051,11 @@ segments: start: 0x287EB0 vram: 0x82F00000 subsegments: - - [0x287EB0, hasm, fragments/41/fragment41_header] + - [0x287EB0, textbin, fragments/41/fragment41_header] - [0x287ED0, c, fragments/41/fragment41] - [0x29BA20, data, fragments/41/fragment41_data] - [0x29BF80, rodata, fragments/41/fragment41_rodata] - - [0x29C2D0, bin, fragments/41/fragment41_reloc] + - [0x29C2D0, rodatabin, fragments/41/fragment41_reloc] # gallery loader - name: fragment42 @@ -1032,11 +1064,11 @@ segments: start: 0x29DD30 vram: 0x83300000 subsegments: - - [0x29DD30, hasm, fragments/42/fragment42_header] + - [0x29DD30, textbin, fragments/42/fragment42_header] - [0x29DD50, c, fragments/42/fragment42] - [0x2A0EB0, data, fragments/42/fragment42_data] - [0x2A0FE0, rodata, fragments/42/fragment42_rodata] - - [0x2A1010, bin, fragments/42/fragment42_reloc] + - [0x2A1010, rodatabin, fragments/42/fragment42_reloc] # gallery code - name: fragment43 @@ -1045,11 +1077,11 @@ segments: start: 0x2A1B30 vram: 0x83400000 subsegments: - - [0x2A1B30, hasm, fragments/43/fragment43_header] + - [0x2A1B30, textbin, fragments/43/fragment43_header] - [0x2A1B50, c, fragments/43/fragment43] - [0x2A4950, data, fragments/43/fragment43_data] - [0x2A49F0, rodata, fragments/43/fragment43_rodata] - - [0x2A4A10, bin, fragments/43/fragment43_reloc] + - [0x2A4A10, rodatabin, fragments/43/fragment43_reloc] # gallery album code - name: fragment44 @@ -1058,10 +1090,10 @@ segments: start: 0x2A4DF0 vram: 0x83500000 subsegments: - - [0x2A4DF0, hasm, fragments/44/fragment44_header] + - [0x2A4DF0, textbin, fragments/44/fragment44_header] - [0x2A4E10, c, fragments/44/fragment44] - [0x2A8C60, rodata, fragments/44/fragment44_rodata] - - [0x2A8DB0, bin, fragments/44/fragment44_reloc] + - [0x2A8DB0, rodatabin, fragments/44/fragment44_reloc] # might be print code - name: fragment45 @@ -1070,11 +1102,11 @@ segments: start: 0x2A9790 vram: 0x83600000 subsegments: - - [0x2A9790, hasm, fragments/45/fragment45_header] + - [0x2A9790, textbin, fragments/45/fragment45_header] - [0x2A97B0, c, fragments/45/fragment45] - [0x2ACA10, data, fragments/45/fragment45_data] - [0x2ACA70, rodata, fragments/45/fragment45_rodata] - - [0x2ACA80, bin, fragments/45/fragment45_reloc] + - [0x2ACA80, rodatabin, fragments/45/fragment45_reloc] # gallery enlarge code - name: fragment46 @@ -1083,10 +1115,10 @@ segments: start: 0x2AD270 vram: 0x83700000 subsegments: - - [0x2AD270, hasm, fragments/46/fragment46_header] + - [0x2AD270, textbin, fragments/46/fragment46_header] - [0x2AD290, c, fragments/46/fragment46] - [0x2AD720, data, fragments/46/fragment46_data] - - [0x2AD730, bin, fragments/46/fragment46_reloc] + - [0x2AD730, rodatabin, fragments/46/fragment46_reloc] # gallery rental pokemon loader - name: fragment47 @@ -1095,11 +1127,11 @@ segments: start: 0x2AD8F0 vram: 0x83800000 subsegments: - - [0x2AD8F0, hasm, fragments/47/fragment47_header] + - [0x2AD8F0, textbin, fragments/47/fragment47_header] - [0x2AD910, c, fragments/47/fragment47] - [0x2B25A0, data, fragments/47/fragment47_data] - [0x2B2E50, rodata, fragments/47/fragment47_rodata] - - [0x2B2F40, bin, fragments/47/fragment47_reloc] + - [0x2B2F40, rodatabin, fragments/47/fragment47_reloc] # Gallery Debugger (unused) - name: fragment48 @@ -1108,11 +1140,11 @@ segments: start: 0x2B3F70 vram: 0x83900000 # apparently not used either, but VRAM is an estimate based on the patterns around this fragment. subsegments: - - [0x2B3F70, hasm, fragments/48/fragment48_header] + - [0x2B3F70, textbin, fragments/48/fragment48_header] - [0x2B3F90, c, fragments/48/fragment48] - [0x2B45A0, data, fragments/48/fragment48_data] - [0x2B45C0, rodata, fragments/48/fragment48_rodata] - - [0x2B4620, bin, fragments/48/fragment48_reloc] + - [0x2B4620, rodatabin, fragments/48/fragment48_reloc] - name: fragment49 type: code @@ -1120,10 +1152,10 @@ segments: start: 0x2B46F0 vram: 0x83A00000 subsegments: - - [0x2B46F0, hasm, fragments/49/fragment49_header] + - [0x2B46F0, textbin, fragments/49/fragment49_header] - [0x2B4710, c, fragments/49/fragment49] - [0x2B5240, data, fragments/49/fragment49_data] - - [0x2B5260, bin, fragments/49/fragment49_reloc] + - [0x2B5260, rodatabin, fragments/49/fragment49_reloc] # hall of fame loader - name: fragment50 @@ -1132,11 +1164,11 @@ segments: start: 0x2B5350 vram: 0x82600000 subsegments: - - [0x2B5350, hasm, fragments/50/fragment50_header] + - [0x2B5350, textbin, fragments/50/fragment50_header] - [0x2B5370, c, fragments/50/fragment50] - [0x2B91D0, data, fragments/50/fragment50_data] - [0x2BC690, rodata, fragments/50/fragment50_rodata] - - [0x2BC760, bin, fragments/50/fragment50_reloc] + - [0x2BC760, rodatabin, fragments/50/fragment50_reloc] - name: fragment51 @@ -1145,9 +1177,9 @@ segments: start: 0x2BD0A0 vram: 0x82800000 # unknown vram due to being unused, but based on the patterns before hand, this is probably 82800000. subsegments: - - [0x2BD0A0, bin, fragments/51/fragment51_header] # need to leave it as a bin. Splat thinks there's a pointer + - [0x2BD0A0, textbin, fragments/51/fragment51_header] # need to leave it as a bin. Splat thinks there's a pointer - [0x2BD0C0, c, fragments/51/fragment51] - - [0x2BD120, bin, fragments/51/fragment51_reloc] + - [0x2BD120, rodatabin, fragments/51/fragment51_reloc] - name: fragment52 @@ -1156,10 +1188,10 @@ segments: start: 0x2BD130 vram: 0x82900000 # unknown vram due to being unused, but based on the patterns before hand, this is probably 82900000. subsegments: - - [0x2BD130, bin, fragments/52/fragment52_header] # need to leave it as a bin. Splat thinks there's a pointer + - [0x2BD130, textbin, fragments/52/fragment52_header] # need to leave it as a bin. Splat thinks there's a pointer - [0x2BD150, c, fragments/52/fragment52] - [0x2BD600, data, fragments/52/fragment52_data] - - [0x2BD660, bin, fragments/52/fragment52_reloc] + - [0x2BD660, rodatabin, fragments/52/fragment52_reloc] - name: fragment53 type: code @@ -1167,10 +1199,10 @@ segments: start: 0x2BD6E0 vram: 0x82A00000 subsegments: - - [0x2BD6E0, hasm, fragments/53/fragment53_header] + - [0x2BD6E0, textbin, fragments/53/fragment53_header] - [0x2BD700, c, fragments/53/fragment53] - [0x2BDA40, data, fragments/53/fragment53_data] - - [0x2BDA50, bin, fragments/53/fragment53_reloc] + - [0x2BDA50, rodatabin, fragments/53/fragment53_reloc] # RENTAL battle, rules, registration loader - name: fragment54 @@ -1179,10 +1211,10 @@ segments: start: 0x2BDAC0 vram: 0x82B00000 subsegments: - - [0x2BDAC0, bin, fragments/54/fragment54_header] # need to leave it as a bin. Splat thinks there's a pointer + - [0x2BDAC0, textbin, fragments/54/fragment54_header] # need to leave it as a bin. Splat thinks there's a pointer - [0x2BDAE0, c, fragments/54/fragment54] - [0x2BEBE0, data, fragments/54/fragment54_data] - - [0x2BEC00, bin, fragments/54/fragment54_reloc] + - [0x2BEC00, rodatabin, fragments/54/fragment54_reloc] # RENTAL rules loader @@ -1192,11 +1224,11 @@ segments: start: 0x2BED20 vram: 0x83000000 subsegments: - - [0x2BED20, hasm, fragments/55/fragment55_header] + - [0x2BED20, textbin, fragments/55/fragment55_header] - [0x2BED40, c, fragments/55/fragment55] - [0x2C26E0, data, fragments/55/fragment55_data] - [0x2C28A0, rodata, fragments/55/fragment55_rodata] - - [0x2C29A0, bin, fragments/55/fragment55_reloc] + - [0x2C29A0, rodatabin, fragments/55/fragment55_reloc] # options code - name: fragment56 @@ -1205,9 +1237,9 @@ segments: start: 0x2C3220 vram: 0x82C00000 subsegments: - - [0x2C3220, hasm, fragments/56/fragment56_header] + - [0x2C3220, textbin, fragments/56/fragment56_header] - [0x2C3240, c, fragments/56/fragment56] - - [0x2C4880, bin, fragments/56/fragment56_reloc] + - [0x2C4880, rodatabin, fragments/56/fragment56_reloc] # RENTAL registration code - name: fragment57 @@ -1216,11 +1248,11 @@ segments: start: 0x2C49D0 vram: 0x82D00000 subsegments: - - [0x2C49D0, hasm, fragments/57/fragment57_header] + - [0x2C49D0, textbin, fragments/57/fragment57_header] - [0x2C49F0, c, fragments/57/fragment57] - [0x2CB970, data, fragments/57/fragment57_data] - [0x2CE950, rodata, fragments/57/fragment57_rodata] - - [0x2CE9C0, bin, fragments/57/fragment57_reloc] + - [0x2CE9C0, rodatabin, fragments/57/fragment57_reloc] # sandshrew minigame stage animation - name: fragment58 @@ -1229,11 +1261,11 @@ segments: start: 0x2CF350 vram: 0x84000000 subsegments: - - [0x2CF350, hasm, fragments/58/fragment58_header] + - [0x2CF350, textbin, fragments/58/fragment58_header] - [0x2CF370, c, fragments/58/fragment58] - [0x2D1F30, data, fragments/58/fragment58_data] - [0x2D2000, rodata, fragments/58/fragment58_rodata] - - [0x2D2050, bin, fragments/58/fragment58_reloc] + - [0x2D2050, rodatabin, fragments/58/fragment58_reloc] # stadium loader - name: fragment59 @@ -1242,11 +1274,11 @@ segments: start: 0x2D24C0 vram: 0x84100000 subsegments: - - [0x2D24C0, hasm, fragments/59/fragment59_header] + - [0x2D24C0, textbin, fragments/59/fragment59_header] - [0x2D24E0, c, fragments/59/fragment59] - [0x2D48F0, data, fragments/59/fragment59_data] - [0x2D58F0, rodata, fragments/59/fragment59_rodata] - - [0x2D5900, bin, fragments/59/fragment59_reloc] + - [0x2D5900, rodatabin, fragments/59/fragment59_reloc] # cup code - name: fragment60 @@ -1255,11 +1287,11 @@ segments: start: 0x2D5CB0 vram: 0x82E00000 subsegments: - - [0x2D5CB0, hasm, fragments/60/fragment60_header] + - [0x2D5CB0, textbin, fragments/60/fragment60_header] - [0x2D5CD0, c, fragments/60/fragment60] - [0x2D6DC0, data, fragments/60/fragment60_data] - [0x2D7650, rodata, fragments/60/fragment60_rodata] - - [0x2D7660, bin, fragments/60/fragment60_reloc] + - [0x2D7660, rodatabin, fragments/60/fragment60_reloc] # RENTAL pokemon loader - name: fragment61 @@ -1268,11 +1300,11 @@ segments: start: 0x2D7890 vram: 0x84200000 subsegments: - - [0x2D7890, hasm, fragments/61/fragment61_header] + - [0x2D7890, textbin, fragments/61/fragment61_header] - [0x2D78B0, c, fragments/61/fragment61] - [0x2E85D0, data, fragments/61/fragment61_data] - [0x2E9120, rodata, fragments/61/fragment61_rodata] - - [0x2E93C0, bin, fragments/61/fragment61_reloc] + - [0x2E93C0, rodatabin, fragments/61/fragment61_reloc] # battle system code - name: fragment62 @@ -1281,11 +1313,11 @@ segments: start: 0x2EA8C0 vram: 0x84300000 subsegments: - - [0x2EA8C0, hasm, fragments/62/fragment62_header] + - [0x2EA8C0, textbin, fragments/62/fragment62_header] - [0x2EA8E0, c, fragments/62/fragment62] - [0x36EC10, data, fragments/62/fragment62_data] - [0x3759C0, rodata, fragments/62/fragment62_rodata] - - [0x378D00, bin, fragments/62/fragment62_reloc] + - [0x378D00, rodatabin, fragments/62/fragment62_reloc] # battle preparation flags, rules, code - name: fragment63 @@ -1294,11 +1326,11 @@ segments: start: 0x394100 vram: 0x84B00000 subsegments: - - [0x394100, hasm, fragments/63/fragment63_header] + - [0x394100, textbin, fragments/63/fragment63_header] - [0x394120, c, fragments/63/fragment63] - [0x3A3C10, data, fragments/63/fragment63_data] - [0x3AD980, rodata, fragments/63/fragment63_rodata] - - [0x3ADA10, bin, fragments/63/fragment63_reloc] + - [0x3ADA10, rodatabin, fragments/63/fragment63_reloc] # menu selector before battle code - name: fragment64 @@ -1307,11 +1339,11 @@ segments: start: 0x3AEE50 vram: 0x84800000 subsegments: - - [0x3AEE50, hasm, fragments/64/fragment64_header] + - [0x3AEE50, textbin, fragments/64/fragment64_header] - [0x3AEE70, c, fragments/64/fragment64] - [0x3B2390, data, fragments/64/fragment64_data] - [0x3B2530, rodata, fragments/64/fragment64_rodata] - - [0x3B25B0, bin, fragments/64/fragment64_reloc] + - [0x3B25B0, rodatabin, fragments/64/fragment64_reloc] # gym leader castle loader - name: fragment65 @@ -1320,11 +1352,11 @@ segments: start: 0x3B2AE0 vram: 0x84A00000 subsegments: - - [0x3B2AE0, hasm, fragments/65/fragment65_header] + - [0x3B2AE0, textbin, fragments/65/fragment65_header] - [0x3B2B00, c, fragments/65/fragment65] - [0x3B59E0, data, fragments/65/fragment65_data] - [0x3B5BE0, rodata, fragments/65/fragment65_rodata] - - [0x3B5C10, bin, fragments/65/fragment65_reloc] + - [0x3B5C10, rodatabin, fragments/65/fragment65_reloc] - name: fragment66 type: code @@ -1332,10 +1364,10 @@ segments: start: 0x3B6130 vram: 0x83200000 subsegments: - - [0x3B6130, hasm, fragments/66/fragment66_header] + - [0x3B6130, textbin, fragments/66/fragment66_header] - [0x3B6150, c, fragments/66/fragment66] - [0x3B8080, data, fragments/66/fragment66_data] - - [0x3B8140, bin, fragments/66/fragment66_reloc] + - [0x3B8140, rodatabin, fragments/66/fragment66_reloc] - name: fragment67 type: code @@ -1343,9 +1375,9 @@ segments: start: 0x3B8530 vram: 0x8F000000 subsegments: - - [0x3B8530, hasm, fragments/67/fragment67_header] + - [0x3B8530, textbin, fragments/67/fragment67_header] - [0x3B8550, c, fragments/67/fragment67] - - [0x3B8560, bin, fragments/67/fragment67_reloc] + - [0x3B8560, rodatabin, fragments/67/fragment67_reloc] # These are a bunch of seemingly unused(?) fragments which all they do is access or load fragment 67. - name: fragment68 @@ -1354,9 +1386,9 @@ segments: start: 0x3B8570 vram: 0x8F100000 # unknown vram. Another unused one? Might be 8F100000? subsegments: - - [0x3B8570, hasm, fragments/68/fragment68_header] + - [0x3B8570, textbin, fragments/68/fragment68_header] - [0x3B8590, c, fragments/68/fragment68] - - [0x3B85F0, bin, fragments/68/fragment68_reloc] + - [0x3B85F0, rodatabin, fragments/68/fragment68_reloc] - name: fragment69 type: code @@ -1364,9 +1396,9 @@ segments: start: 0x3B8600 vram: 0x8F200000 # unknown vram. Another unused one? Might be 8F200000? subsegments: - - [0x3B8600, hasm, fragments/69/fragment69_header] + - [0x3B8600, textbin, fragments/69/fragment69_header] - [0x3B8620, c, fragments/69/fragment69] - - [0x3B8680, bin, fragments/69/fragment69_reloc] + - [0x3B8680, rodatabin, fragments/69/fragment69_reloc] - name: fragment70 type: code @@ -1374,9 +1406,9 @@ segments: start: 0x3B8690 vram: 0x8F300000 # unknown vram. Another unused one? Might be 8F300000? subsegments: - - [0x3B8690, hasm, fragments/70/fragment70_header] + - [0x3B8690, textbin, fragments/70/fragment70_header] - [0x3B86B0, c, fragments/70/fragment70] - - [0x3B8710, bin, fragments/70/fragment70_reloc] + - [0x3B8710, rodatabin, fragments/70/fragment70_reloc] - name: fragment71 type: code @@ -1384,9 +1416,9 @@ segments: start: 0x3B8720 vram: 0x8F400000 # unknown vram. Another unused one? Might be 8F400000? subsegments: - - [0x3B8720, hasm, fragments/71/fragment71_header] + - [0x3B8720, textbin, fragments/71/fragment71_header] - [0x3B8740, c, fragments/71/fragment71] - - [0x3B87A0, bin, fragments/71/fragment71_reloc] + - [0x3B87A0, rodatabin, fragments/71/fragment71_reloc] - name: fragment72 type: code @@ -1394,9 +1426,9 @@ segments: start: 0x3B87B0 vram: 0x8F500000 # unknown vram. Another unused one? Might be 8F500000? subsegments: - - [0x3B87B0, hasm, fragments/72/fragment72_header] + - [0x3B87B0, textbin, fragments/72/fragment72_header] - [0x3B87D0, c, fragments/72/fragment72] - - [0x3B8830, bin, fragments/72/fragment72_reloc] + - [0x3B8830, rodatabin, fragments/72/fragment72_reloc] - name: fragment73 type: code @@ -1404,9 +1436,9 @@ segments: start: 0x3B8840 vram: 0x8F600000 # unknown vram. Another unused one? Might be 8F600000? subsegments: - - [0x3B8840, hasm, fragments/73/fragment73_header] + - [0x3B8840, textbin, fragments/73/fragment73_header] - [0x3B8860, c, fragments/73/fragment73] - - [0x3B88C0, bin, fragments/73/fragment73_reloc] + - [0x3B88C0, rodatabin, fragments/73/fragment73_reloc] - name: fragment74 type: code @@ -1414,9 +1446,9 @@ segments: start: 0x3B88D0 vram: 0x8F700000 # unknown vram. Another unused one? Might be 8F700000? subsegments: - - [0x3B88D0, hasm, fragments/74/fragment74_header] + - [0x3B88D0, textbin, fragments/74/fragment74_header] - [0x3B88F0, c, fragments/74/fragment74] - - [0x3B8950, bin, fragments/74/fragment74_reloc] + - [0x3B8950, rodatabin, fragments/74/fragment74_reloc] - name: fragment75 type: code @@ -1424,10 +1456,10 @@ segments: start: 0x3B8960 vram: 0x8FA00000 subsegments: - - [0x3B8960, hasm, fragments/75/fragment75_header] + - [0x3B8960, textbin, fragments/75/fragment75_header] - [0x3B8980, c, fragments/75/fragment75] - [0x3B9350, data, fragments/75/fragment75_data] - - [0x3B9380, bin, fragments/75/fragment75_reloc] + - [0x3B9380, rodatabin, fragments/75/fragment75_reloc] - name: fragment76 type: code @@ -1435,9 +1467,9 @@ segments: start: 0x3B9590 vram: 0x8FB00000 # unknown vram. Another unused one? Might be 8FB00000? subsegments: - - [0x3B9590, hasm, fragments/76/fragment76_header] + - [0x3B9590, textbin, fragments/76/fragment76_header] - [0x3B95B0, c, fragments/76/fragment76] - - [0x3B9610, bin, fragments/76/fragment76_reloc] + - [0x3B9610, rodatabin, fragments/76/fragment76_reloc] - name: fragment77 type: code @@ -1445,9 +1477,9 @@ segments: start: 0x3B9620 vram: 0x8FC00000 # unknown vram. Another unused one? Might be 8FC00000? subsegments: - - [0x3B9620, bin, fragments/77/fragment77_header] # need to leave it as a bin. Splat thinks there's a pointer + - [0x3B9620, textbin, fragments/77/fragment77_header] # need to leave it as a bin. Splat thinks there's a pointer - [0x3B9640, c, fragments/77/fragment77] - - [0x3B96A0, bin, fragments/77/fragment77_reloc] + - [0x3B96A0, rodatabin, fragments/77/fragment77_reloc] - [0x3B96B0, bin] - [0x3BA190, bin]