diff --git a/diff.py b/diff.py
index a46541fc63..1b12f9a411 100755
--- a/diff.py
+++ b/diff.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python3
# PYTHON_ARGCOMPLETE_OK
import argparse
+import enum
import sys
from typing import (
Any,
@@ -28,6 +29,14 @@ 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__":
@@ -201,11 +210,11 @@ if __name__ == "__main__":
)
parser.add_argument(
"-s",
- "--stop-jr-ra",
- dest="stop_jrra",
+ "--stop-at-ret",
+ dest="stop_at_ret",
action="store_true",
- help="""Stop disassembling at the first 'jr ra'. Some functions have
- multiple return points, so use with care!""",
+ help="""Stop disassembling at the first return instruction.
+ Some functions have multiple return points, so use with care!""",
)
parser.add_argument(
"-i",
@@ -228,6 +237,13 @@ if __name__ == "__main__":
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",
@@ -248,21 +264,37 @@ if __name__ == "__main__":
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="threeway",
+ dest="diff_mode",
action="store_const",
- const="prev",
+ 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="threeway",
+ dest="diff_mode",
action="store_const",
- const="base",
+ const=DiffMode.THREEWAY_BASE,
help="""Show a three-way diff between target asm, current asm, and asm
when diff.py was started. Requires -w.""",
)
@@ -288,6 +320,7 @@ if __name__ == "__main__":
metavar="LINES",
dest="max_lines",
type=int,
+ default=1024,
help="The maximum length of the diff, in lines.",
)
parser.add_argument(
@@ -335,11 +368,9 @@ if __name__ == "__main__":
# (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
@@ -356,7 +387,7 @@ 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)."
+ "Run `python3 -m pip install --user colorama watchdog levenshtein cxxfilt` to install prerequisites (cxxfilt only needed with --source)."
)
try:
@@ -375,7 +406,8 @@ class ProjectSettings:
objdump_flags: List[str]
build_command: List[str]
map_format: str
- mw_build_dir: str
+ build_dir: str
+ ms_map_address_offset: int
baseimg: Optional[str]
myimg: Optional[str]
mapfile: Optional[str]
@@ -383,6 +415,8 @@ class ProjectSettings:
source_extensions: List[str]
show_line_numbers_default: bool
disassemble_all: bool
+ reg_categories: Dict[str, int]
+ expected_dir: str
@dataclass
@@ -404,21 +438,22 @@ class Config:
inlines: bool
max_function_size_lines: int
max_function_size_bytes: int
- max_function_lines_overriden: bool
# Display options
formatter: "Formatter"
- threeway: Optional[str]
+ 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_jrra: 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
@@ -444,13 +479,15 @@ def create_project_settings(settings: Dict[str, Any]) -> ProjectSettings:
),
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"),
- mw_build_dir=settings.get("mw_build_dir", "build/"),
+ ms_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", {}),
)
-DEFAULT_MAX_LINES = 1024
def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config:
arch = get_arch(project.arch_str)
@@ -481,8 +518,6 @@ def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config:
if show_line_numbers is None:
show_line_numbers = project.show_line_numbers_default
- max_lines = args.max_lines or DEFAULT_MAX_LINES
-
return Config(
arch=arch,
# Build/objdump options
@@ -492,24 +527,25 @@ def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config:
source_old_binutils=args.source_old_binutils,
diff_section=args.diff_section,
inlines=args.inlines,
- max_function_size_lines=max_lines,
- max_function_size_bytes=max_lines * 4,
- max_function_lines_overriden = args.max_lines is not None,
+ max_function_size_lines=args.max_lines,
+ max_function_size_bytes=args.max_lines * 4,
# Display options
formatter=formatter,
- threeway=args.threeway,
+ 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_jrra=args.stop_jrra,
+ 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,
)
@@ -567,6 +603,7 @@ class BasicFormat(enum.Enum):
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()
@@ -666,11 +703,19 @@ class Text:
@dataclass
-class TableMetadata:
+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):
@@ -680,7 +725,7 @@ class Formatter(abc.ABC):
...
@abc.abstractmethod
- def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str:
+ def table(self, data: TableData) -> str:
"""Format a multi-column table with metadata"""
...
@@ -688,8 +733,8 @@ class Formatter(abc.ABC):
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:]])
+ def outputline_texts(line: TableLine) -> Tuple[Text, ...]:
+ return tuple(cell[0] for cell in line.cells)
@dataclass
@@ -699,8 +744,8 @@ class PlainFormatter(Formatter):
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]
+ 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
)
@@ -713,13 +758,14 @@ class AnsiFormatter(Formatter):
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.DELAY_SLOT: Fore.LIGHTBLACK_EX,
+ BasicFormat.REGISTER_CATEGORY: Fore.LIGHTYELLOW_EX,
BasicFormat.DIFF_CHANGE: Fore.LIGHTBLUE_EX,
BasicFormat.DIFF_ADD: Fore.GREEN,
BasicFormat.DIFF_REMOVE: Fore.RED,
@@ -765,14 +811,19 @@ class AnsiFormatter(Formatter):
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
+ 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
@@ -798,7 +849,7 @@ class HtmlFormatter(Formatter):
static_assert_unreachable(f)
return f"{chunk}"
- def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str:
+ 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"
"
@@ -810,12 +861,12 @@ class HtmlFormatter(Formatter):
output = "\n"
output += " \n"
- output += table_row(meta.headers, False, "th")
+ output += table_row(data.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
+ table_row(self.outputline_texts(line), line.is_data_ref, "td")
+ for line in data.lines
)
output += " \n"
output += "
\n"
@@ -830,7 +881,7 @@ class JsonFormatter(Formatter):
# This method is unused by this formatter
return NotImplemented
- def table(self, meta: TableMetadata, rows: List[Tuple["OutputLine", ...]]) -> str:
+ def table(self, data: TableData) -> str:
def serialize_format(s: str, f: Format) -> Dict[str, Any]:
if f == BasicFormat.NONE:
return {"text": s}
@@ -848,29 +899,25 @@ class JsonFormatter(Formatter):
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"))
+ for h, name in zip(data.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["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 rows:
+ for row in data.lines:
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),
+ 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 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
@@ -939,10 +986,41 @@ def symbol_formatter(group: str, base_index: int) -> FormatFunction:
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 = ast.literal_eval(expr)
+ ret = eval_expr(expr)
if not isinstance(ret, int):
raise Exception("not an integer")
return ret
@@ -1060,7 +1138,7 @@ def preprocess_objdump_out(
out = out[out.find("\n") + 1 :]
out = out.rstrip("\n")
- if obj_data:
+ if obj_data and config.show_rodata_refs:
out = (
serialize_rodata_references(parse_elf_rodata_references(obj_data, config))
+ out
@@ -1069,8 +1147,27 @@ def preprocess_objdump_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
+ 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}.")
@@ -1082,6 +1179,12 @@ def search_map_file(
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:
@@ -1097,10 +1200,12 @@ def search_map_file(
ram = int(tokens[1], 0)
rom = int(tokens[5], 0)
ram_to_rom = rom - ram
- if line.endswith(" " + fn_name):
+ if line.endswith(" " + fn_name) or f" {fn_name} = 0x" in line:
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))
+ 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()
@@ -1112,16 +1217,14 @@ def search_map_file(
return cands[0]
elif project.map_format == "mw":
find = re.findall(
- re.compile(
- # ram elf rom
- r" \S+ \S+ (\S+) (\S+) . "
- + re.escape(fn_name)
- + r"(?: \(entry of "
- + re.escape(config.diff_section)
- + r"\))? \t"
- # object name
- + "(\S+)"
- ),
+ # 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:
@@ -1129,27 +1232,56 @@ def search_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.
+ 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
+ + project.ms_map_address_offset
+ )
+ 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
@@ -1165,6 +1297,8 @@ def parse_elf_rodata_references(
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
@@ -1238,7 +1372,7 @@ def parse_elf_rodata_references(
# Skip section_name -> section_name references
continue
sec_name = sec_names[s.sh_info].decode("latin1")
- if sec_name != ".rodata":
+ 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):
@@ -1263,7 +1397,7 @@ def parse_elf_rodata_references(
)
if st_shndx == text_section:
if s.sh_type == SHT_REL:
- if e_machine == 8 and r_type == 2: # R_MIPS_32
+ if e_machine == 8 and r_type in (R_MIPS_32, R_MIPS_GPREL32):
(r_addend,) = read("I", sec_base + r_offset)
else:
continue
@@ -1329,7 +1463,7 @@ def dump_objfile(
objfile = config.objfile
if not objfile:
- objfile, _ = search_map_file(start, project, config)
+ objfile, _ = search_map_file(start, project, config, for_binary=False)
if not objfile:
fail("Not able to find .o file for function.")
@@ -1340,8 +1474,8 @@ def dump_objfile(
if not os.path.isfile(objfile):
fail(f"Not able to find .o file for function: {objfile} is not a file.")
- refobjfile = "ver/current/expected/" + objfile
- if not os.path.isfile(refobjfile):
+ 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:
@@ -1366,7 +1500,7 @@ def dump_binary(
run_make(project.myimg, project)
start_addr = maybe_eval_int(start)
if start_addr is None:
- _, start_addr = search_map_file(start, project, config)
+ _, 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.")
if end is not None:
@@ -1395,8 +1529,13 @@ class AsmProcessor:
def __init__(self, config: Config) -> None:
self.config = config
- def process_reloc(self, row: str, prev: str) -> str:
- return prev
+ 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."""
@@ -1412,28 +1551,24 @@ class AsmProcessor:
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 process_reloc(self, row: str, prev: str) -> str:
+ 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
+ return prev, None
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:
- imm = hex(int(imm, 16))
- repl += ("" if imm.startswith("-") else "+") + imm
+ repl = row.split()[-1] + reloc_addend_from_imm(imm, before, self.config.arch)
if "R_MIPS_LO16" in row:
repl = f"%lo({repl})"
elif "R_MIPS_HI16" in row:
@@ -1456,20 +1591,57 @@ class AsmProcessorMIPS(AsmProcessor):
repl = f"%call16({repl})"
else:
assert False, f"unknown relocation type '{row}' for line '{prev}'"
- return before + repl + after
+ 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 process_reloc(self, row: str, prev: str) -> str:
+ 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 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"
@@ -1487,17 +1659,30 @@ class AsmProcessorPPC(AsmProcessor):
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
+ # 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) -> str:
+ 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]
- return before + repl + after
+ 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:
@@ -1581,6 +1766,51 @@ class AsmProcessorAArch64(AsmProcessor):
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"
+
+
@dataclass
class ArchSettings:
name: str
@@ -1705,6 +1935,76 @@ PPC_BRANCH_INSTRUCTIONS = {
"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",
+}
+
MIPS_SETTINGS = ArchSettings(
name="mips",
re_int=re.compile(r"[0-9]+"),
@@ -1717,18 +2017,26 @@ MIPS_SETTINGS = ArchSettings(
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)\([^)]*\)"),
+ 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({"jal", "j"}),
+ 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]+"),
@@ -1777,23 +2085,56 @@ PPC_SETTINGS = ArchSettings(
name="ppc",
re_int=re.compile(r"[0-9]+"),
re_comment=re.compile(r"(<.*>|//.*$)"),
- re_reg=re.compile(r"\$?\b([rf][0-9]+)\b"),
+ # 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)|[^@]*@(ha|h|lo)"),
+ 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,
+)
+
ARCH_SETTINGS = [
MIPS_SETTINGS,
MIPSEL_SETTINGS,
+ MIPSEE_SETTINGS,
ARM32_SETTINGS,
ARMEL_SETTINGS,
AARCH64_SETTINGS,
PPC_SETTINGS,
+ I686_SETTINGS,
]
@@ -1826,11 +2167,31 @@ def parse_relocated_line(line: str) -> Tuple[str, str, str]:
imm, after = after, ""
else:
imm, after = after[:ind2], after[ind2:]
- if imm == "0x0":
- imm = "0"
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
@@ -1845,6 +2206,7 @@ class Line:
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
@@ -1857,7 +2219,6 @@ class Line:
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
@@ -1866,7 +2227,6 @@ def process(dump: str, config: Config) -> List[Line]:
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]
@@ -1900,10 +2260,8 @@ def process(dump: str, config: Config) -> List[Line]:
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
- ):
+ # 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)
@@ -1923,9 +2281,14 @@ def process(dump: str, config: Config) -> List[Line]:
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())
+ # 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(
@@ -1947,7 +2310,13 @@ def process(dump: str, config: Config) -> List[Line]:
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:
@@ -1964,31 +2333,36 @@ def process(dump: str, config: Config) -> List[Line]:
# immediates.
original = row
+ symbol = None
while i < len(lines):
reloc_row = lines[i]
if re.search(arch.re_reloc, reloc_row):
- original = processor.process_reloc(reloc_row, original)
+ 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)
- 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)
@@ -1997,8 +2371,16 @@ def process(dump: str, config: Config) -> List[Line]:
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_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(
@@ -2007,6 +2389,7 @@ def process(dump: str, config: Config) -> List[Line]:
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,
@@ -2019,9 +2402,7 @@ def process(dump: str, config: Config) -> List[Line]:
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:
+ if config.stop_at_ret and processor.is_end_of_function(mnemonic, args):
break
processor.post_process(output)
@@ -2036,9 +2417,44 @@ 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 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]:
@@ -2062,15 +2478,10 @@ def diff_sequences_difflib(
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
- ):
+ if algorithm != "levenshtein":
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:
@@ -2083,8 +2494,16 @@ def diff_sequences(
seq[i] = val
return "".join(seq)
- rem1 = remap(seq1)
- rem2 = remap(seq2)
+ try:
+ rem1 = remap(seq1)
+ rem2 = remap(seq2)
+ except ValueError as e:
+ 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)
@@ -2117,69 +2536,80 @@ def diff_lines(
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
- score = 0
+ num_stack_penalties = 0
+ num_regalloc_penalties = 0
+ num_reordering_penalties = 0
+ num_insertion_penalties = 0
+ num_deletion_penalties = 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.
@@ -2188,10 +2618,6 @@ def score_diff_lines(
def diff_delete(line: str) -> None:
deletions.append(line)
-
- # if config.max_function_lines_overriden:
- # max_index = min(config.max_function_size_lines, len(lines))
- # else:
# 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.
@@ -2213,7 +2639,9 @@ def score_diff_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)
+ 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)
@@ -2226,13 +2654,17 @@ def score_diff_lines(
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
- )
+ num_insertion_penalties += ins - common
+ num_deletion_penalties += dels - common
+ num_reordering_penalties += common
- return score
+ 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)
@@ -2270,6 +2702,7 @@ def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff:
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)
@@ -2295,7 +2728,6 @@ def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff:
lines2 = trim_nops(lines2, arch)
diffed_lines = diff_lines(lines1, lines2, config.algorithm)
- max_score = len(lines1) * config.penalty_deletion
line_num_base = -1
line_num_offset = 0
@@ -2332,13 +2764,6 @@ def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff:
# 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(), ""
@@ -2380,7 +2805,17 @@ def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff:
if normalize_imms(branchless1, arch) == normalize_imms(
branchless2, arch
):
- if imm_matches_everything(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)
@@ -2405,8 +2840,19 @@ def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff:
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"
+ 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
@@ -2531,8 +2977,10 @@ def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff:
)
)
- score = score_diff_lines(diffed_lines, config)
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)
@@ -2594,29 +3042,17 @@ def compress_matching(
return ret
-def align_diffs(
- old_diff: Diff, new_diff: Diff, config: Config
-) -> Tuple[TableMetadata, List[Tuple[OutputLine, ...]]]:
- meta: TableMetadata
+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.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,
- )
+ 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"
+ 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)
@@ -2646,20 +3082,54 @@ def align_diffs(
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,
+ 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)
- return meta, diff_lines
+
+ 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(
@@ -2762,17 +3232,26 @@ class Display:
return (self.emsg, self.emsg)
my_lines = process(self.mydump, self.config)
- diff_output = do_diff(self.base_lines, my_lines, 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.threeway != "base" or not self.last_diff_output:
+ if self.config.diff_mode != DiffMode.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)
+ 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(
@@ -2890,7 +3369,10 @@ def main() -> None:
except ModuleNotFoundError as e:
fail(MISSING_PREREQUISITES.format(e.name))
- if config.threeway and not args.watch:
+ 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:
@@ -2918,8 +3400,10 @@ def main() -> None:
if args.base_asm is not None:
with open(args.base_asm) as f:
basedump = f.read()
- else:
+ elif config.diff_mode != DiffMode.SINGLE:
basedump = run_objdump(basecmd, config, project)
+ else:
+ basedump = ""
mydump = run_objdump(mycmd, config, project)
diff --git a/diff_settings.py b/diff_settings.py
index 04b9263cdc..f47a7724e6 100644
--- a/diff_settings.py
+++ b/diff_settings.py
@@ -8,4 +8,4 @@ def apply(config, args):
config['source_directories'] = ['src', f'{ver_dir}asm', 'include', f'{ver_dir}assets']
config['make_command'] = ['ninja']
config['objdump_flags'] = ['-M','reg-names=32']
- config['expected_directory'] = f'{ver_dir}/expected/'
+ config['expected_dir'] = f'{ver_dir}/expected/'
diff --git a/include/entity.h b/include/entity.h
index b2f30bb1df..c6643dab63 100644
--- a/include/entity.h
+++ b/include/entity.h
@@ -160,7 +160,7 @@ typedef struct HeartBlockContentData {
/* 0x01C */ f32 sparkleTrailRadius;
/* 0x020 */ f32 bouncePhase;
/* 0x024 */ u16 yawBufferPos;
- /* 0x024 */ s16 unk_26;
+ /* 0x026 */ s16 unk_26;
/* 0x028 */ f32 yawBuffer[10];
/* 0x050 */ f32 unk_50;
/* 0x054 */ f32 rotationRate;
diff --git a/include/functions.h b/include/functions.h
index c6373e262e..170244b1ef 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -12,8 +12,6 @@ f32 fabsf(f32 f);
f64 fabs(f64 f);
f32 cosine(s16 arg0);
-s32 strcmp(const char* str1, const char* str2);
-
void nuBoot(void);
void boot_idle(void* data);
void boot_main(void* data);
diff --git a/include/macros.h b/include/macros.h
index c5d1e99a0d..7a6df11319 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -37,7 +37,7 @@
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
-#if !defined(PERMUTER)
+#if !defined(PERMUTER) && !defined(M2CTX) && defined(OLD_GCC)
#define NOP_FIX __asm__(".set nogpopt");
#define NOP_UNFIX __asm__(".set gpopt");
#else
diff --git a/src/101b90_len_8f0.c b/src/101b90_len_8f0.c
index 56db1e8822..e33f88cfb6 100644
--- a/src/101b90_len_8f0.c
+++ b/src/101b90_len_8f0.c
@@ -4,7 +4,7 @@
#include "ld_addrs.h"
#ifdef SHIFT
-#define SPRITE_ROM_START _1943000_ROM_START + 0x10
+#define SPRITE_ROM_START (u32) _1943000_ROM_START + 0x10
#else
#define SPRITE_ROM_START 0x1943000 + 0x10
#endif
diff --git a/src/190B20.c b/src/190B20.c
index 2c6e8be85f..9f3d29d688 100644
--- a/src/190B20.c
+++ b/src/190B20.c
@@ -72,19 +72,18 @@ void create_target_list(Actor* actor, s32 arg1) {
s32 i, j;
f32 targetX, targetY, targetZ;
f32 f2, f12, f14;
- f32 f61;
u8 overlayType;
f32 overlayZoom;
s32 sp18 = FALSE;
s32 col;
s32 row;
-
s32 skip;
if (battleStatus->currentTargetListFlags & TARGET_FLAG_80000000) {
actor->targetListLength = -1;
return;
}
+
if (battleStatus->currentTargetListFlags & TARGET_FLAG_PLAYER) {
targetDataList->actorID = ACTOR_PLAYER;
targetDataList->partID = 1;
@@ -98,7 +97,7 @@ void create_target_list(Actor* actor, s32 arg1) {
targetDataList->pos.z = playerActor->homePos.z;
}
targetDataList->unk_10 = -100;
- numTargets += 1;
+ numTargets++;
targetDataList++;
}
@@ -115,7 +114,7 @@ void create_target_list(Actor* actor, s32 arg1) {
targetDataList->pos.z = partnerActor->homePos.z;
}
targetDataList->unk_10 = -50;
- numTargets += 1;
+ numTargets++;
targetDataList++;
}
diff --git a/src/325AD0.c b/src/325AD0.c
index af53fe92fe..0a6268f235 100644
--- a/src/325AD0.c
+++ b/src/325AD0.c
@@ -55,10 +55,18 @@ s32 func_E0200044(s32 max, s32 idx) {
#ifdef NON_EQUIVALENT
void func_E02000AC(s32 arg0, s32 arg1) {
s32 i, j;
+ s32 newvar;
+ s32 width = 80;
+ s32 tmp = 0;
+ s32 x, y;
+ int new_var;
+ int new_var2;
gDPSetPrimColor(gMainGfxPos++, 0, 0, 128, 128, 128, 255);
-
for (i = 0; i < 10; i++) {
+ x = arg0;
+ newvar = i * 6;
+
gDPSetTextureImage(gMainGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 80, nuGfxCfb_ptr);
gDPSetTile(gMainGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b,
(((((79)-(0)+1) * G_IM_SIZ_16b_TILE_BYTES)+7)>>3), 0,
@@ -77,37 +85,42 @@ void func_E02000AC(s32 arg0, s32 arg1) {
G_TX_RENDERTILE, 0,
G_TX_WRAP, 6, G_TX_NOLOD,
G_TX_WRAP, 7, G_TX_NOLOD);
- gDPLoadTile(gMainGfxPos++, G_TX_RENDERTILE,
- (arg0)<>3), 0x100,
+ (((((x+width-1)-(x)+1) * G_IM_SIZ_16b_TILE_BYTES)+7)>>3), 0x100,
G_TX_LOADTILE, 0,
G_TX_WRAP, 6, G_TX_NOLOD,
G_TX_WRAP, 7, G_TX_NOLOD);
gDPLoadSync(gMainGfxPos++);
gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE,
- (arg0)<>3), 0,
+ (((((x+width-1)-(x)+1) * G_IM_SIZ_16b_TILE_BYTES)+7)>>3), 0x100,
G_TX_RENDERTILE + 1, 0,
G_TX_WRAP, 6, G_TX_NOLOD,
G_TX_WRAP, 7, G_TX_NOLOD);
- gDPTextureRectangle(gMainGfxPos++, arg0 * 4, (arg1 + i * 6) * 4, (arg0 + 80) * 4, (arg1 + i * 6 + 6) * 4, 0, arg0 * 32, arg1 * 32, 0x400, 0x400);
+ gSPTextureRectangle(gMainGfxPos++, x * 4, (arg1 + newvar) * 4,
+ (x + width) * 4, (arg1 + newvar + 6) * 4, 0,
+ x * 32, (arg1 + i * 6) * 32,
+ 0x400, 0x400);
}
gDPPipeSync(gMainGfxPos++);
}
diff --git a/src/43F0.c b/src/43F0.c
index c3bcdbb34d..0c0bfb5d80 100644
--- a/src/43F0.c
+++ b/src/43F0.c
@@ -1,5 +1,6 @@
#include "common.h"
#include "nu/nusys.h"
+#include "gcc/string.h"
u16 heap_nextMallocID = 0;
diff --git a/src/a5dd0_len_114e0.c b/src/a5dd0_len_114e0.c
index 9f3f47a2d5..012f49fc6d 100644
--- a/src/a5dd0_len_114e0.c
+++ b/src/a5dd0_len_114e0.c
@@ -7,6 +7,7 @@
#include "effects.h"
#include "nu/nusys.h"
#include "model_clear_render_tasks.h"
+#include "gcc/string.h"
#if VERSION_IQUE
// TODO: remove if sections are split in iQue release
@@ -36,10 +37,7 @@ extern Addr WorldEntityHeapBase;
typedef struct Fog {
/* 0x00 */ s32 enabled;
- /* 0x04 */ s32 r;
- /* 0x08 */ s32 g;
- /* 0x0C */ s32 b;
- /* 0x10 */ s32 a;
+ /* 0x04 */ Color4i color;
/* 0x14 */ s32 startDistance;
/* 0x18 */ s32 endDistance;
} Fog; // size = 0x1C
@@ -3401,10 +3399,10 @@ void appendGfx_model(void* data) {
break;
}
gSPDisplayList((*gfxPos)++, D_8014AFC0[renderModeIdx]);
- gDPSetFogColor((*gfxPos)++, gCurrentFogSettings->r,
- gCurrentFogSettings->g,
- gCurrentFogSettings->b,
- gCurrentFogSettings->a);
+ gDPSetFogColor((*gfxPos)++, gCurrentFogSettings->color.r,
+ gCurrentFogSettings->color.g,
+ gCurrentFogSettings->color.b,
+ gCurrentFogSettings->color.a);
gSPFogPosition((*gfxPos)++, gCurrentFogSettings->startDistance, gCurrentFogSettings->endDistance);
break;
case 4:
@@ -3472,9 +3470,9 @@ void appendGfx_model(void* data) {
gDPSetRenderMode(gMainGfxPos++, GBL_c1(G_BL_CLR_BL, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA), G_RM_CLD_SURF2);
break;
}
- gDPSetFogColor((*gfxPos)++, gCurrentFogSettings->r,
- gCurrentFogSettings->g,
- gCurrentFogSettings->b,
+ gDPSetFogColor((*gfxPos)++, gCurrentFogSettings->color.r,
+ gCurrentFogSettings->color.g,
+ gCurrentFogSettings->color.b,
mdl_bgMultiplyColorA);
gDPSetBlendColor((*gfxPos)++, mdl_bgMultiplyColorR,
mdl_bgMultiplyColorG,
@@ -3546,14 +3544,14 @@ void appendGfx_model(void* data) {
}
gSPDisplayList((*gfxPos)++, D_8014AFC0[renderModeIdx]);
- fogR = (gCurrentFogSettings->r * (255 - mdl_bgMultiplyColorA) + mdl_bgMultiplyColorR * mdl_bgMultiplyColorA) / 255;
- fogG = (gCurrentFogSettings->g * (255 - mdl_bgMultiplyColorA) + mdl_bgMultiplyColorG * mdl_bgMultiplyColorA) / 255;
- fogB = (gCurrentFogSettings->b * (255 - mdl_bgMultiplyColorA) + mdl_bgMultiplyColorB * mdl_bgMultiplyColorA) / 255;
+ fogR = (gCurrentFogSettings->color.r * (255 - mdl_bgMultiplyColorA) + mdl_bgMultiplyColorR * mdl_bgMultiplyColorA) / 255;
+ fogG = (gCurrentFogSettings->color.g * (255 - mdl_bgMultiplyColorA) + mdl_bgMultiplyColorG * mdl_bgMultiplyColorA) / 255;
+ fogB = (gCurrentFogSettings->color.b * (255 - mdl_bgMultiplyColorA) + mdl_bgMultiplyColorB * mdl_bgMultiplyColorA) / 255;
fogMin = (gCurrentFogSettings->startDistance * (255 - mdl_bgMultiplyColorA) + 900 * mdl_bgMultiplyColorA) / 255;
fogMax = (gCurrentFogSettings->endDistance * (255 - mdl_bgMultiplyColorA) + 1000 * mdl_bgMultiplyColorA) / 255;
- gDPSetFogColor(gMainGfxPos++, fogR, fogG, fogB, gCurrentFogSettings->a);
+ gDPSetFogColor(gMainGfxPos++, fogR, fogG, fogB, gCurrentFogSettings->color.a);
gSPFogPosition((*gfxPos)++, fogMin, fogMax);
break;
case 10:
@@ -4043,12 +4041,12 @@ void clear_model_data(void) {
}
*gBackgroundFogModePtr = FOG_MODE_0;
- gCurrentFogSettings->r = 10;
- gCurrentFogSettings->g = 10;
- gCurrentFogSettings->b = 10;
+ gCurrentFogSettings->color.r = 10;
+ gCurrentFogSettings->color.g = 10;
+ gCurrentFogSettings->color.b = 10;
gCurrentFogSettings->startDistance = 950;
gCurrentFogSettings->enabled = FALSE;
- gCurrentFogSettings->a = 0;
+ gCurrentFogSettings->color.a = 0;
gCurrentFogSettings->endDistance = 1000;
for (i = 0; i < ARRAY_COUNT(texPannerAuxV); i++) {
@@ -5381,10 +5379,10 @@ void set_world_fog_dist(s32 start, s32 end) {
}
void set_world_fog_color(s32 r, s32 g, s32 b, s32 a) {
- gCurrentFogSettings->r = r;
- gCurrentFogSettings->g = g;
- gCurrentFogSettings->b = b;
- gCurrentFogSettings->a = a;
+ gCurrentFogSettings->color.r = r;
+ gCurrentFogSettings->color.g = g;
+ gCurrentFogSettings->color.b = b;
+ gCurrentFogSettings->color.a = a;
}
s32 is_world_fog_enabled(void) {
@@ -5397,10 +5395,10 @@ void get_world_fog_distance(s32* start, s32* end) {
}
void get_world_fog_color(s32* r, s32* g, s32* b, s32* a) {
- *r = gCurrentFogSettings->r;
- *g = gCurrentFogSettings->g;
- *b = gCurrentFogSettings->b;
- *a = gCurrentFogSettings->a;
+ *r = gCurrentFogSettings->color.r;
+ *g = gCurrentFogSettings->color.g;
+ *b = gCurrentFogSettings->color.b;
+ *a = gCurrentFogSettings->color.a;
}
void set_tex_panner(Model* model, s32 texPannerID) {
@@ -5682,7 +5680,7 @@ Gfx* mdl_get_copied_gfx(s32 copyIndex) {
Gfx* gfxCopy = mlvc->gfxCopy[selector];
mlvc->selector++;
- if (mlvc->selector >= 2) {
+ if (mlvc->selector > ARRAY_COUNT(mlvc->gfxCopy) - 1) {
mlvc->selector = 0;
}
@@ -6277,7 +6275,7 @@ void execute_render_tasks(void) {
}
mdl_renderTaskQueueIdx++;
- if (mdl_renderTaskQueueIdx > 2) {
+ if (mdl_renderTaskQueueIdx > ARRAY_COUNT(mdl_renderTaskLists) - 1) {
mdl_renderTaskQueueIdx = 0;
}
mdl_renderTaskCount = 0;
diff --git a/src/audio/2e230_len_2190.c b/src/audio/2e230_len_2190.c
index 567c28a4ec..48cd14d4ab 100644
--- a/src/audio/2e230_len_2190.c
+++ b/src/audio/2e230_len_2190.c
@@ -9,7 +9,7 @@ extern f32 AlTuneScaling[];
#ifdef SHIFT
-#define SBN_ROM_OFFSET SBN_ROM_START
+#define SBN_ROM_OFFSET (s32) SBN_ROM_START
#elif VERSION_JP
#define SBN_ROM_OFFSET 0xFC0000
#else
diff --git a/src/common/MakeSun.inc.c b/src/common/MakeSun.inc.c
index d8c79bacf5..f7b9439113 100644
--- a/src/common/MakeSun.inc.c
+++ b/src/common/MakeSun.inc.c
@@ -1,5 +1,6 @@
#include "common.h"
#include "effects.h"
+#include "gcc/string.h"
char* N(RightSunMaps)[] = {
"flo_03",
diff --git a/src/crash_screen.c b/src/crash_screen.c
index 4e83054e74..54ef052b7b 100644
--- a/src/crash_screen.c
+++ b/src/crash_screen.c
@@ -2,6 +2,7 @@
#include "stdlib/stdarg.h"
#include "PR/os_internal_thread.h"
#include "libc/xstdio.h"
+#include "gcc/string.h"
typedef struct {
/* 0x000 */ OSThread thread;
diff --git a/src/dc470_len_14c0.c b/src/dc470_len_14c0.c
index a4c540f969..434c0b4455 100644
--- a/src/dc470_len_14c0.c
+++ b/src/dc470_len_14c0.c
@@ -1,5 +1,6 @@
#include "common.h"
#include "model.h"
+#include "gcc/string.h"
char gCloudyFlowerFieldsBg[] = "fla_bg";
char gSunnyFlowerFieldsBg[] = "flb_bg";
diff --git a/src/effects/gfx/chapter_change.c b/src/effects/gfx/chapter_change.c
index c46a3448b9..ce0c4f38cf 100644
--- a/src/effects/gfx/chapter_change.c
+++ b/src/effects/gfx/chapter_change.c
@@ -5,7 +5,6 @@
#include "effects/gfx/D_09002080_3EDEE0.png.inc.c"
#include "effects/gfx/D_09002580_3EE3E0.png.inc.c"
#include "effects/gfx/world/text_end_of.png.inc.c"
-#include "effects/gfx/D_090032A0_3EF100.png.inc.c"
#include "effects/gfx/world/exclamation_point.png.inc.c"
#include "effects/gfx/world/ch1.png.inc.c"
#include "effects/gfx/world/ch2.png.inc.c"
@@ -30,7 +29,15 @@
#include "effects/gfx/D_0900C1B0_3F8010.gfx.inc.c"
#include "effects/gfx/D_0900C1F8_3F8058.gfx.inc.c"
#include "effects/gfx/D_0900C240_3F80A0.gfx.inc.c"
-#include "effects/gfx/D_0900C328_3F8188.gfx.inc.c"
+
+// TODO allow splat to output the reference to halfway into the texture
+//#include "effects/gfx/D_0900C328_3F8188.gfx.inc.c"
+Gfx D_0900C328_3F8188[] = {
+ gsDPSetTextureLUT(G_TT_NONE),
+ gsDPLoadTextureTile(&D_09002A80_3EE8E0[0x820], G_IM_FMT_IA, G_IM_SIZ_8b, 104, 0, 0, 0, 103, 19, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 7, 6, G_TX_NOLOD, G_TX_NOLOD),
+ gsSPEndDisplayList(),
+};
+
#include "effects/gfx/D_0900C370_3F81D0.gfx.inc.c"
#include "effects/gfx/D_0900C458_3F82B8.gfx.inc.c"
#include "effects/gfx/D_0900C540_3F83A0.gfx.inc.c"
diff --git a/src/fio.c b/src/fio.c
index dac155862d..152cadecc2 100644
--- a/src/fio.c
+++ b/src/fio.c
@@ -1,5 +1,6 @@
#include "fio.h"
#include "PR/os_flash.h"
+#include "gcc/string.h"
extern SaveData D_8009A6B0;
extern s32 logicalSaveInfo[4][2];
diff --git a/src/main.c b/src/main.c
index 9ffa45bc66..e1120cd957 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,8 +21,6 @@ extern s32 D_80073E10[];
extern u16* D_8009A680;
#ifdef SHIFT
-void create_audio_system(void);
-void load_engine_data(void);
#define shim_create_audio_system_obfuscated create_audio_system
#define shim_load_engine_data_obfuscated load_engine_data
#endif
diff --git a/src/npc.c b/src/npc.c
index e29698e871..023fe810a6 100644
--- a/src/npc.c
+++ b/src/npc.c
@@ -446,17 +446,22 @@ void npc_do_other_npc_collision(Npc* npc) {
// float regalloc
#ifdef NON_MATCHING
s32 npc_do_player_collision(Npc* npc) {
+ f32 sp10;
PlayerStatus* playerStatus = &gPlayerStatus;
f32 xDiff, zDiff;
+ f32 xDiff2, zDiff2;
f32 npcColliderX, npcColliderZ;
f32 playerX, playerZ;
- f32 tempX, tempZ;
- f32 temp_f0;
- f32 temp_f22_2;
- f32 temp_f24;
+ f32 theta;
+ f32 dist;
f32 temp_f24_2;
- f32 temp_f28;
+ f32 targetYaw;
+ f32 new_var;
+ f32 xSub;
+ f32 zSub;
+ f32 collRad, collDiam;
+ int new_var2;
if (npc->flags & NPC_FLAG_IGNORE_PLAYER_COLLISION) {
return FALSE;
@@ -480,55 +485,55 @@ s32 npc_do_player_collision(Npc* npc) {
playerX = playerStatus->position.x;
playerZ = playerStatus->position.z;
- tempX = npc->pos.x;
- tempZ = npc->pos.z;
+ xDiff = playerX - npc->pos.x;
+ zDiff = playerZ - npc->pos.z;
- xDiff = playerX - tempX;
- zDiff = playerZ - tempZ;
-
- temp_f22_2 = (npc->collisionRadius / 2) + (f32)(playerStatus->colliderDiameter / 2);
- if (temp_f22_2 < sqrtf(SQ(xDiff) + SQ(zDiff))) {
+ sp10 = (npc->collisionRadius / 2) + (f32)(playerStatus->colliderDiameter / 2);
+ npcColliderZ = zDiff;
+ temp_f24_2 = xDiff;
+ dist = sqrtf(SQ(temp_f24_2) + SQ(npcColliderZ));
+ if (sp10 < dist) {
return FALSE;
}
playerStatus->animFlags |= 0x8000;
- //playerX = playerStatus->position.x;
npcColliderX = npc->colliderPos.x;
npcColliderZ = npc->colliderPos.z;
- tempX = playerX - npcColliderX;
- tempZ = playerZ - npcColliderZ;
+ zSub = sp10;
+ xDiff = playerX - npcColliderX;
+ zDiff = playerZ - npcColliderZ;
- //temp_f24 = sqrtf(SQ(tempX) + SQ(tempZ));
- xDiff = tempZ;
- temp_f24 = sqrtf((tempX * tempX) + (xDiff * xDiff));
+ dist = xSub = sqrtf(SQ(xDiff) + SQ(zDiff));
- temp_f0 = atan2(playerX, playerZ, npcColliderX, npcColliderZ);
- temp_f28 = playerStatus->targetYaw;
- temp_f24_2 = temp_f22_2 - temp_f24;
- temp_f24 = temp_f24_2 * sin_rad(DEG_TO_RAD(temp_f0));
- playerZ = -temp_f24_2 * cos_rad(DEG_TO_RAD(temp_f0));
+ theta = atan2(playerX, playerZ, npcColliderX, npcColliderZ);
+ targetYaw = playerStatus->targetYaw;
+
+ temp_f24_2 = zSub - dist;
+
+ xSub = temp_f24_2 * sin_rad(DEG_TO_RAD(theta));
+ zSub = -temp_f24_2 * cos_rad(DEG_TO_RAD(theta));
if (playerStatus->animFlags & PA_FLAG_RIDING_PARTNER) {
- if (fabsf(get_clamped_angle_diff(temp_f0, temp_f28)) < 45.0f) {
- playerStatus->position.x -= temp_f24;
- playerStatus->position.z -= playerZ;
- wPartnerNpc->pos.x -= temp_f24;
- wPartnerNpc->pos.z -= playerZ;
+ if (fabsf(get_clamped_angle_diff(theta, targetYaw)) < 45.0f) {
+ playerStatus->position.x -= xSub;
+ playerStatus->position.z -= zSub;
+ wPartnerNpc->pos.x -= xSub;
+ wPartnerNpc->pos.z -= zSub;
} else {
- playerStatus->position.x -= temp_f24 * 0.5f;
- playerStatus->position.z -= playerZ * 0.5f;
- wPartnerNpc->pos.x -= temp_f24 * 0.5f;
- wPartnerNpc->pos.z -= playerZ * 0.5f;
+ playerStatus->position.x -= xSub * 0.5f;
+ playerStatus->position.z -= zSub * 0.5f;
+ wPartnerNpc->pos.x -= xSub * 0.5f;
+ wPartnerNpc->pos.z -= zSub * 0.5f;
}
} else {
if (playerStatus->flags & (PS_FLAG_JUMPING | PS_FLAG_FALLING)) {
- playerStatus->position.x -= temp_f24 * 0.4f;
- playerStatus->position.z -= playerZ * 0.4f;
- } else if (fabsf(get_clamped_angle_diff(temp_f0, temp_f28)) < 45.0f) {
- playerStatus->position.x -= temp_f24;
- playerStatus->position.z -= playerZ;
+ playerStatus->position.x -= xSub * 0.4f;
+ playerStatus->position.z -= zSub * 0.4f;
+ } else if (fabsf(get_clamped_angle_diff(theta, targetYaw)) < 45.0f) {
+ playerStatus->position.x -= xSub;
+ playerStatus->position.z -= zSub;
} else {
- playerStatus->position.x -= temp_f24 * 0.5f;
- playerStatus->position.z -= playerZ * 0.5f;
+ playerStatus->position.x -= xSub * 0.5f;
+ playerStatus->position.z -= zSub * 0.5f;
}
}
npc->pos.x = npc->colliderPos.x;
@@ -546,7 +551,7 @@ void npc_try_apply_gravity(Npc* npc) {
f32 x, y, z, testLength;
f32 length;
s32 hitID;
-
+
if (!(npc->flags & NPC_FLAG_GRAVITY)) {
return;
}
@@ -586,7 +591,7 @@ s32 npc_try_snap_to_ground(Npc* npc, f32 velocity) {
f32 x, y, z, testLength;
f32 length;
s32 hitID;
-
+
if (npc->flags & (NPC_FLAG_GRAVITY | NPC_FLAG_8)) {
return FALSE;
}
diff --git a/src/sprite.c b/src/sprite.c
index dac7f79ec6..6a7124e86a 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -1269,7 +1269,7 @@ s32 func_802DE8DC(s32 spriteIdx, s32 compListIdx, s32* outX, s32* outY, s32* out
u32* spriteData;
if (sprite->componentList == NULL) {
- return;
+ return; // bug: does not return a value
}
animID = sprite->currentAnimID;
@@ -1297,7 +1297,7 @@ s32 func_802DE8DC(s32 spriteIdx, s32 compListIdx, s32* outX, s32* outY, s32* out
}
}
} else {
- return;
+ return; // bug: does not return a value
}
return -1;
}
diff --git a/src/de740_len_23f0.c b/src/sprite_shading.c
similarity index 88%
rename from src/de740_len_23f0.c
rename to src/sprite_shading.c
index 84fc7bf66e..9c2da83ad7 100644
--- a/src/de740_len_23f0.c
+++ b/src/sprite_shading.c
@@ -272,14 +272,6 @@ void create_shading_palette(Matrix4f mtx, s32 uls, s32 ult, s32 lrs, s32 lrt, s3
}
}
-extern int ENVIRONMENT;
-extern int SHADE;
-extern int COMBINED;
-extern int COMBINED_ALPHA;
-extern int TEXEL0_ALPHA;
-
-// float regalloc
-#ifdef NON_MATCHING
void appendGfx_shading_palette(
Matrix4f mtx,
s32 uls, s32 ult, s32 lrs, s32 lrt,
@@ -290,20 +282,20 @@ void appendGfx_shading_palette(
s32 ambientPower, s32 renderMode)
{
Camera* camera = &gCameras[gCurrentCameraID];
- f32 temp_f0;
- f32 temp_f1;
- f32 temp_f2;
- f32 var_f26;
- f32 temp_f28 = 0;
- f32 temp_f6_2;
+ f32 mtx01;
+ f32 mtx11;
+ f32 mtx21;
+ f32 offsetXComp;
+ f32 offsetYComp = 0;
+ f32 apMag;
f32 var_f12;
+ f32 var_f12_2;
f32 var_f20;
- f32 var_f30;
- f32 var_f26_2;
+ f32 facingDir;
f32 ex, ey, ez;
- float new_var3;
-
- f32 a1, a2;
+ f32 offsetX, offsetY;
+ f32 pm02, pm12, pm22;
+ f32 t1;
var_f12 = SQ(shadowX) + SQ(shadowY) + SQ(shadowZ);
@@ -315,15 +307,16 @@ void appendGfx_shading_palette(
}
shadowX *= var_f12;
shadowY *= var_f12;
+ pm02 = var_f12; // TODO required to match
shadowZ *= var_f12;
- if ((-mtx[0][2] * camera->perspectiveMatrix[0][2]) + (mtx[2][2] * camera->perspectiveMatrix[2][2]) < 0.0f) {
- var_f30 = 1.0f;
+ if (((-mtx[0][2] * camera->perspectiveMatrix[0][2]) + (mtx[2][2] * camera->perspectiveMatrix[2][2])) < 0.0f) {
+ facingDir = 1.0f;
} else {
- var_f30 = -1.0f;
+ facingDir = -1.0f;
}
- if (var_f30 < 0.0f) {
+ if (facingDir < 0.0f) {
ex = mtx[0][2];
ey = mtx[1][2];
ez = -mtx[2][2];
@@ -333,34 +326,41 @@ void appendGfx_shading_palette(
ez = mtx[2][2];
}
- a1 = ((ex * shadowX) + (ey * shadowY)) + (ez * shadowZ);
- new_var3 = a1;
- temp_f2 = camera->perspectiveMatrix[2][2];
- var_f12 = camera->perspectiveMatrix[0][2];
+ pm02 = camera->perspectiveMatrix[0][2];
+ pm12 = camera->perspectiveMatrix[1][2];
+ pm22 = camera->perspectiveMatrix[2][2];
- var_f26 = var_f12;
- a1 = shadowX * -temp_f2;
- temp_f6_2 = a1 + (var_f26 * shadowZ) ;
- if (new_var3 > 0.0f) {
- var_f26 = ambientPower * temp_f6_2;
+ t1 = (ex * shadowX) + (ey * shadowY) + (ez * shadowZ);
+ apMag = (shadowX * -pm22) + (shadowZ * pm02);
+
+ if (t1 > 0.0f) {
+ offsetXComp = ambientPower * apMag;
+ } else if (ambientPower > 1.0f) {
+ offsetXComp = ambientPower * apMag;
} else {
- temp_f2 = ambientPower;
- var_f26 = temp_f2 * temp_f6_2;
- }
+ // TODO grossness required to match
+ // a temp s16 for ambientPower works as well as the explicit casting in both places
+ offsetX = -1.0f;
+ offsetY = (s16) ambientPower > offsetX;
+ if ((s16) ambientPower > offsetX) {
+ offsetXComp = ambientPower * apMag;
+ } else {
+ offsetXComp = ambientPower * apMag;
+ }
+ }
var_f20 = SQ(shadowX) + SQ(shadowZ);
if (var_f20 != 0.0f) {
var_f20 = sqrtf(var_f20);
}
- temp_f0 = -mtx[0][1];
- temp_f1 = mtx[1][1];
- temp_f2 = mtx[2][1];
- var_f12 = SQ(temp_f0) + SQ(temp_f2);
- if (var_f12 != 0.0f) {
- var_f12 = sqrtf(var_f12);
+ mtx01 = -mtx[0][1];
+ mtx11 = mtx[1][1];
+ mtx21 = mtx[2][1];
+ var_f12_2 = SQ(mtx01) + SQ(mtx21);
+ if (var_f12_2 != 0.0f) {
+ var_f12_2 = sqrtf(var_f12_2);
}
-
- temp_f28 = -((var_f20 * var_f12) + (shadowY * temp_f1)) * ambientPower;
+ offsetYComp = -((var_f20 * var_f12_2) + (shadowY * mtx11)) * ambientPower;
if (shadowR > 255) {
shadowR = 255;
@@ -426,20 +426,17 @@ void appendGfx_shading_palette(
COMBINED, 0, 0, 0, COMBINED);
}
- var_f26_2 = var_f26;
- var_f26_2 *= var_f30;
+ offsetX = offsetXComp * facingDir;
+ offsetY = offsetYComp;
gDPSetTileSize(
gMainGfxPos++,
0,
- ((uls + 0x100) << 2) + (s32)var_f26_2,
- ((ult + 0x100) << 2) + (s32)temp_f28,
- ((lrs + 0x100 - 1) << 2) + (s32)var_f26_2,
- ((lrt + 0x100 - 1) << 2) + (s32)temp_f28
+ ((uls + 0x100) << 2) + (s32)offsetX,
+ ((ult + 0x100) << 2) + (s32)offsetY,
+ ((lrs + 0x100 - 1) << 2) + (s32)offsetX,
+ ((lrt + 0x100 - 1) << 2) + (s32)offsetY
);
}
-#else
-INCLUDE_ASM(s32, "de740_len_23f0", appendGfx_shading_palette);
-#endif
void func_801491E4(Matrix4f mtx, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 alpha) {
gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, alpha);
diff --git a/src/world/area_mac/mac_02/npc/tayce_t.inc.c b/src/world/area_mac/mac_02/npc/tayce_t.inc.c
index e75936885b..6caa374839 100644
--- a/src/world/area_mac/mac_02/npc/tayce_t.inc.c
+++ b/src/world/area_mac/mac_02/npc/tayce_t.inc.c
@@ -1,3 +1,5 @@
+#include "gcc/string.h"
+
// enum mapping itemIDs -> index in single recipe arrays and column/rows in double recipe matrix
enum CookingIngredientID {
iRSH = 0, // ITEM_MUSHROOM
@@ -256,35 +258,35 @@ s8 SingleRecipesWithCookbook[] = {
s8 DoubleRecipesMatrix[] = {
/* iRSH iSSH iUSH iLSH iVSH iFFL iCOC iLIM iLEM iHSY iMSY iJAM iAPP iRBY iBBY iYBY iGMN iKLF iDRP iDRF iSLF iMIX iEGG iMEL iSTK iPOT iDSH iBUB iBMP */
-/* iRSH */ rXXX, rHOT, rSHS, rSHS, rHOT, rHOT, rXXX, rXXX, rXXX, rHSH, rMSH, rJSH, rXXX, rXXX, rXXX, rXXX, rVSH, rVSH, rBLN, rVSH, rVSH, rSHC, rBLN, rXXX, rXXX, rBLN, rFRS, rXXX, rXXX,
-/* iSSH */ -1, rXXX, rSHS, rSHS, rHOT, rBLN, rXXX, rXXX, rXXX, rHSU, rMSU, rJSU, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rBLN, rVSH, rLSH, rSHC, rBLN, rXXX, rXXX, rBLN, rHOT, rXXX, rXXX,
-/* iUSH */ -1, -1, rXXX, rSHS, rSHS, rYUM, rXXX, rXXX, rXXX, rHUL, rMUL, rJUL, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rYUM, rVSH, rLSH, rSWS, rYUM, rXXX, rXXX, rYUM, rSHS, rXXX, rXXX,
-/* iLSH */ -1, -1, -1, rXXX, rXXX, rBLN, rXXX, rXXX, rXXX, rHSU, rMSU, rJSU, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rBLN, rVSH, rLSH, rSWS, rBLN, rXXX, rXXX, rBLN, rSHS, rXXX, rXXX,
-/* iVSH */ -1, -1, -1, -1, rXXX, rBLN, rXXX, rXXX, rXXX, rHSU, rMSU, rJSU, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rBLN, rTHR, rDZD, rELP, rBLN, rXXX, rXXX, rBLN, rHOT, rXXX, rXXX,
-/* iFFL */ -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rBLN, rXXX, rXXX, rXXX, rXXX, rFIP, rEGM, rXXX, rXXX, rFZF, rFRS, rXXX, rXXX,
-/* iCOC */ -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rTTN, rSOD, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rBLN, rXXX, rXXX, rCOP, rXXX, rSOD, rXXX, rBLN, rXXX, rXXX, rXXX,
-/* iLIM */ -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rTTN, rSOD, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rXXX, rXXX, rXXX, rLIC, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iLEM */ -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rTTN, rSOD, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rXXX, rXXX, rXXX, rLEC, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iHSY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rSSH, rTTN, rTTN, rTTN, rTTN, rXXX, rSOD, rXXX, rXXX, rXXX, rHNC, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iMSY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rXXX, rXXX, rXXX, rKCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iJAM */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSSH, rSSH, rSSH, rSSH, rXXX, rSOD, rXXX, rXXX, rXXX, rJLP, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iAPP */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rSOD, rSOD, rXXX, rXXX, rXXX, rXXX, rXXX, rPIE, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iRBY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rSOD, rXXX, rBLN, rBLN, rXXX, rSLS, rBCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iBBY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rXXX, rBLN, rBLN, rXXX, rSLS, rBCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iYBY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rBLN, rBLN, rXXX, rSLS, rBCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iGMN */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rBLN, rBLN, rXXX, rBLN, rBCK, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iKLF */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rKOO, rXXX, rXXX, rKCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iDRP */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rYUM, rBLN, rXXX, rBLN, rXXX, rXXX, rBLN, rXXX, rXXX, rXXX,
-/* iDRF */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rFFL, rXXX, rXXX, rXXX, rXXX, rYUM, rXXX, rXXX, rXXX,
-/* iSLF */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSTR, rBEG, rSSH, rDZD, rYUM, rXXX, rXXX, rXXX,
-/* iMIX */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rBCK, rYCK, rKCK, rBLN, rXXX, rXXX, rXXX,
-/* iEGG */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rBEG, rBLN, rXXX, rXXX, rXXX,
-/* iMEL */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iSTK */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX, rXXX,
-/* iPOT */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX,
-/* iDSH */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX,
-/* iBUB */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX,
-/* iBMP */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX,
+/* iRSH */ rXXX, rHOT, rSHS, rSHS, rHOT, rHOT, rXXX, rXXX, rXXX, rHSH, rMSH, rJSH, rXXX, rXXX, rXXX, rXXX, rVSH, rVSH, rBLN, rVSH, rVSH, rSHC, rBLN, rXXX, rXXX, rBLN, rFRS, rXXX, rXXX,
+/* iSSH */ -1, rXXX, rSHS, rSHS, rHOT, rBLN, rXXX, rXXX, rXXX, rHSU, rMSU, rJSU, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rBLN, rVSH, rLSH, rSHC, rBLN, rXXX, rXXX, rBLN, rHOT, rXXX, rXXX,
+/* iUSH */ -1, -1, rXXX, rSHS, rSHS, rYUM, rXXX, rXXX, rXXX, rHUL, rMUL, rJUL, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rYUM, rVSH, rLSH, rSWS, rYUM, rXXX, rXXX, rYUM, rSHS, rXXX, rXXX,
+/* iLSH */ -1, -1, -1, rXXX, rXXX, rBLN, rXXX, rXXX, rXXX, rHSU, rMSU, rJSU, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rBLN, rVSH, rLSH, rSWS, rBLN, rXXX, rXXX, rBLN, rSHS, rXXX, rXXX,
+/* iVSH */ -1, -1, -1, -1, rXXX, rBLN, rXXX, rXXX, rXXX, rHSU, rMSU, rJSU, rXXX, rXXX, rXXX, rXXX, rLSH, rLSH, rBLN, rTHR, rDZD, rELP, rBLN, rXXX, rXXX, rBLN, rHOT, rXXX, rXXX,
+/* iFFL */ -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rBLN, rXXX, rXXX, rXXX, rXXX, rFIP, rEGM, rXXX, rXXX, rFZF, rFRS, rXXX, rXXX,
+/* iCOC */ -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rTTN, rSOD, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rBLN, rXXX, rXXX, rCOP, rXXX, rSOD, rXXX, rBLN, rXXX, rXXX, rXXX,
+/* iLIM */ -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rTTN, rSOD, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rXXX, rXXX, rXXX, rLIC, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iLEM */ -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rTTN, rSOD, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rXXX, rXXX, rXXX, rLEC, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iHSY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rSSH, rTTN, rTTN, rTTN, rTTN, rXXX, rSOD, rXXX, rXXX, rXXX, rHNC, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iMSY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSSH, rSOD, rSOD, rSOD, rSOD, rXXX, rSOD, rXXX, rXXX, rXXX, rKCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iJAM */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSSH, rSSH, rSSH, rSSH, rXXX, rSOD, rXXX, rXXX, rXXX, rJLP, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iAPP */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rSOD, rSOD, rXXX, rXXX, rXXX, rXXX, rXXX, rPIE, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iRBY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rSOD, rXXX, rBLN, rBLN, rXXX, rSLS, rBCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iBBY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSOD, rXXX, rBLN, rBLN, rXXX, rSLS, rBCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iYBY */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rBLN, rBLN, rXXX, rSLS, rBCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iGMN */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rBLN, rBLN, rXXX, rBLN, rBCK, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iKLF */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rKOO, rXXX, rXXX, rKCK, rXXX, rSSH, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iDRP */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rYUM, rBLN, rXXX, rBLN, rXXX, rXXX, rBLN, rXXX, rXXX, rXXX,
+/* iDRF */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rFFL, rXXX, rXXX, rXXX, rXXX, rYUM, rXXX, rXXX, rXXX,
+/* iSLF */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rSTR, rBEG, rSSH, rDZD, rYUM, rXXX, rXXX, rXXX,
+/* iMIX */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rBCK, rYCK, rKCK, rBLN, rXXX, rXXX, rXXX,
+/* iEGG */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rBEG, rBLN, rXXX, rXXX, rXXX,
+/* iMEL */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iSTK */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX, rXXX,
+/* iPOT */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX, rXXX,
+/* iDSH */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX, rXXX,
+/* iBUB */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX, rXXX,
+/* iBMP */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, rXXX,
};
typedef struct ExtraCookingPair {
@@ -342,12 +344,12 @@ API_CALLABLE(N(GetCookResultForSingleRecipe)) {
s32 resultItemID;
s32 resultQuality;
s32 i;
-
+
outVarItemID = *args++;
outVarQuality = *args++;
inputItem = evt_get_variable(script, *args++);
hasCookbook = evt_get_variable(script, *args++);
-
+
if (inputItem == ITEM_MYSTERY) {
if (rand_int(1000) < 500) {
resultItemID = ITEM_MISTAKE;
@@ -495,7 +497,7 @@ const s32 CookableDiscoveredFlags[] = {
GF_MAC02_DiscoveredRecipe_18, GF_MAC02_DiscoveredRecipe_19, GF_MAC02_DiscoveredRecipe_1A, GF_MAC02_DiscoveredRecipe_1B, GF_MAC02_DiscoveredRecipe_1C, GF_MAC02_DiscoveredRecipe_1D, GF_MAC02_DiscoveredRecipe_1E, GF_MAC02_DiscoveredRecipe_1F,
GF_MAC02_DiscoveredRecipe_20, GF_MAC02_DiscoveredRecipe_21, GF_MAC02_DiscoveredRecipe_22, GF_MAC02_DiscoveredRecipe_23, GF_MAC02_DiscoveredRecipe_24, GF_MAC02_DiscoveredRecipe_25, GF_MAC02_DiscoveredRecipe_26, GF_MAC02_DiscoveredRecipe_27,
GF_MAC02_DiscoveredRecipe_28, GF_MAC02_DiscoveredRecipe_29, GF_MAC02_DiscoveredRecipe_2A, GF_MAC02_DiscoveredRecipe_2B, GF_MAC02_DiscoveredRecipe_2C, GF_MAC02_DiscoveredRecipe_2D, GF_MAC02_DiscoveredRecipe_2E, GF_MAC02_DiscoveredRecipe_2F,
- GF_MAC02_DiscoveredRecipe_30, GF_MAC02_DiscoveredRecipe_31, GF_MAC02_DiscoveredRecipe_32, GF_MAC02_DiscoveredRecipe_33
+ GF_MAC02_DiscoveredRecipe_30, GF_MAC02_DiscoveredRecipe_31, GF_MAC02_DiscoveredRecipe_32, GF_MAC02_DiscoveredRecipe_33
};
API_CALLABLE(N(SetRecipeDiscovered)) {
@@ -610,7 +612,7 @@ EvtScript N(EVS_TayceT_FryingPanAndCake) = {
s32 N(ItemList_Cookbook)[] = {
ITEM_COOKBOOK,
- ITEM_NONE
+ ITEM_NONE
};
EvtScript N(EVS_TayceT_RequestCookbook) = {
diff --git a/src/world/world.c b/src/world/world.c
index 88db9be1e7..807e50ce2b 100644
--- a/src/world/world.c
+++ b/src/world/world.c
@@ -6,6 +6,7 @@
#include "rumble.h"
#include "sprite.h"
#include "model.h"
+#include "gcc/string.h"
s32 WorldReverbModeMapping[] = { 0, 1, 2, 3 };
diff --git a/tools/update_symbol_addrs.py b/tools/update_symbol_addrs.py
index 9c0b862cbd..2e7fba9b1f 100755
--- a/tools/update_symbol_addrs.py
+++ b/tools/update_symbol_addrs.py
@@ -81,24 +81,29 @@ def read_symbol_addrs():
if "_ROM_START" in line or "_ROM_END" in line:
continue
- main, ext = line.rstrip().split(";")
- opt = ext.split("//")[-1].strip().split(" ")
+ main_split = line.rstrip().split(";")
+ main = main_split[0]
dead = False
+ opts = []
type = ""
rom = -1
- for thing in list(opt):
- if thing.strip() == "":
- opt.remove(thing)
- if "type:" in thing:
- type = thing.split(":")[1]
- opt.remove(thing)
- elif "rom:" in thing:
- rom = int(thing.split(":")[1], 16)
- opt.remove(thing)
- elif "dead:" in thing:
- dead = True
+ if len(main_split) > 1:
+ ext = main_split[1]
+ opts = ext.split("//")[-1].strip().split(" ")
+
+ for opt in list(opts):
+ if opt.strip() == "":
+ opts.remove(opt)
+ if "type:" in opt:
+ type = opt.split(":")[1]
+ opts.remove(opt)
+ elif "rom:" in opt:
+ rom = int(opt.split(":")[1], 16)
+ opts.remove(opt)
+ elif "dead:" in opt:
+ dead = True
eqsplit = main.split(" = ")
if len(eqsplit) != 2:
@@ -108,9 +113,9 @@ def read_symbol_addrs():
name, addr = main.split(" = ")
if not dead:
- symbol_addrs.append([name, int(addr, 0), type, rom, opt])
+ symbol_addrs.append([name, int(addr, 0), type, rom, opts])
else:
- dead_symbols.append([name, int(addr, 0), type, rom, opt])
+ dead_symbols.append([name, int(addr, 0), type, rom, opts])
def read_elf():
try:
diff --git a/ver/ique/asm/nonmatchings/de740_len_23f0/appendGfx_shading_palette.s b/ver/ique/asm/nonmatchings/de740_len_23f0/appendGfx_shading_palette.s
deleted file mode 100644
index 214cc57713..0000000000
--- a/ver/ique/asm/nonmatchings/de740_len_23f0/appendGfx_shading_palette.s
+++ /dev/null
@@ -1,547 +0,0 @@
-.set noat /* allow manual use of $at */
-.set noreorder /* don't insert nops after branches */
-
-/* Generated by spimdisasm 1.11.1 */
-
-glabel appendGfx_shading_palette
-/* DE028 80147148 27BDFF90 */ addiu $sp, $sp, -0x70
-/* DE02C 8014714C F7B60048 */ sdc1 $f22, 0x48($sp)
-/* DE030 80147150 C7B60088 */ lwc1 $f22, 0x88($sp)
-/* DE034 80147154 F7B80050 */ sdc1 $f24, 0x50($sp)
-/* DE038 80147158 C7B8008C */ lwc1 $f24, 0x8C($sp)
-/* DE03C 8014715C F7B40040 */ sdc1 $f20, 0x40($sp)
-/* DE040 80147160 C7B40090 */ lwc1 $f20, 0x90($sp)
-/* DE044 80147164 AFB30024 */ sw $s3, 0x24($sp)
-/* DE048 80147168 8FB30094 */ lw $s3, 0x94($sp)
-/* DE04C 8014716C AFB20020 */ sw $s2, 0x20($sp)
-/* DE050 80147170 8FB20098 */ lw $s2, 0x98($sp)
-/* DE054 80147174 AFB40028 */ sw $s4, 0x28($sp)
-/* DE058 80147178 8FB4009C */ lw $s4, 0x9C($sp)
-/* DE05C 8014717C AFB60030 */ sw $s6, 0x30($sp)
-/* DE060 80147180 8FB600A0 */ lw $s6, 0xA0($sp)
-/* DE064 80147184 AFB5002C */ sw $s5, 0x2C($sp)
-/* DE068 80147188 8FB500A4 */ lw $s5, 0xA4($sp)
-/* DE06C 8014718C AFB00018 */ sw $s0, 0x18($sp)
-/* DE070 80147190 8FB000AC */ lw $s0, 0xAC($sp)
-/* DE074 80147194 AFB1001C */ sw $s1, 0x1C($sp)
-/* DE078 80147198 0080882D */ daddu $s1, $a0, $zero
-/* DE07C 8014719C F7BC0060 */ sdc1 $f28, 0x60($sp)
-/* DE080 801471A0 4480E000 */ mtc1 $zero, $f28
-/* DE084 801471A4 3C038007 */ lui $v1, %hi(gCurrentCameraID)
-/* DE088 801471A8 8C636070 */ lw $v1, %lo(gCurrentCameraID)($v1)
-/* DE08C 801471AC 3C04800B */ lui $a0, %hi(gCameras)
-/* DE090 801471B0 248407D0 */ addiu $a0, $a0, %lo(gCameras)
-/* DE094 801471B4 AFBF003C */ sw $ra, 0x3C($sp)
-/* DE098 801471B8 4616B002 */ mul.s $f0, $f22, $f22
-/* DE09C 801471BC 00000000 */ nop
-/* DE0A0 801471C0 AFBE0038 */ sw $fp, 0x38($sp)
-/* DE0A4 801471C4 AFB70034 */ sw $s7, 0x34($sp)
-/* DE0A8 801471C8 F7BE0068 */ sdc1 $f30, 0x68($sp)
-/* DE0AC 801471CC F7BA0058 */ sdc1 $f26, 0x58($sp)
-/* DE0B0 801471D0 4618C082 */ mul.s $f2, $f24, $f24
-/* DE0B4 801471D4 00000000 */ nop
-/* DE0B8 801471D8 AFA50074 */ sw $a1, 0x74($sp)
-/* DE0BC 801471DC AFA60078 */ sw $a2, 0x78($sp)
-/* DE0C0 801471E0 AFA7007C */ sw $a3, 0x7C($sp)
-/* DE0C4 801471E4 00031080 */ sll $v0, $v1, 2
-/* DE0C8 801471E8 4614A102 */ mul.s $f4, $f20, $f20
-/* DE0CC 801471EC 00000000 */ nop
-/* DE0D0 801471F0 00431021 */ addu $v0, $v0, $v1
-/* DE0D4 801471F4 00021080 */ sll $v0, $v0, 2
-/* DE0D8 801471F8 00431023 */ subu $v0, $v0, $v1
-/* DE0DC 801471FC 000218C0 */ sll $v1, $v0, 3
-/* DE0E0 80147200 46020000 */ add.s $f0, $f0, $f2
-/* DE0E4 80147204 00431021 */ addu $v0, $v0, $v1
-/* DE0E8 80147208 000210C0 */ sll $v0, $v0, 3
-/* DE0EC 8014720C 46040300 */ add.s $f12, $f0, $f4
-/* DE0F0 80147210 3C013FF0 */ lui $at, (0x3FF00000 >> 16)
-/* DE0F4 80147214 44811800 */ mtc1 $at, $f3
-/* DE0F8 80147218 44801000 */ mtc1 $zero, $f2
-/* DE0FC 8014721C 46006021 */ cvt.d.s $f0, $f12
-/* DE100 80147220 4622003C */ c.lt.d $f0, $f2
-/* DE104 80147224 00000000 */ nop
-/* DE108 80147228 45000008 */ bc1f .LIQUE_8014724C
-/* DE10C 8014722C 0044F021 */ addu $fp, $v0, $a0
-/* DE110 80147230 44900000 */ mtc1 $s0, $f0
-/* DE114 80147234 00000000 */ nop
-/* DE118 80147238 46800020 */ cvt.s.w $f0, $f0
-/* DE11C 8014723C 460C0002 */ mul.s $f0, $f0, $f12
-/* DE120 80147240 00000000 */ nop
-/* DE124 80147244 4600028D */ trunc.w.s $f10, $f0
-/* DE128 80147248 44105000 */ mfc1 $s0, $f10
-.LIQUE_8014724C:
-/* DE12C 8014724C 461C6032 */ c.eq.s $f12, $f28
-/* DE130 80147250 00000000 */ nop
-/* DE134 80147254 4501000D */ bc1t .LIQUE_8014728C
-/* DE138 80147258 00000000 */ nop
-/* DE13C 8014725C 46006084 */ sqrt.s $f2, $f12
-/* DE140 80147260 46021032 */ c.eq.s $f2, $f2
-/* DE144 80147264 00000000 */ nop
-/* DE148 80147268 45010004 */ bc1t .LIQUE_8014727C
-/* DE14C 8014726C 00000000 */ nop
-/* DE150 80147270 0C0183A0 */ jal sqrtf
-/* DE154 80147274 00000000 */ nop
-/* DE158 80147278 46000086 */ mov.s $f2, $f0
-.LIQUE_8014727C:
-/* DE15C 8014727C 3C013F80 */ lui $at, (0x3F800000 >> 16)
-/* DE160 80147280 44810000 */ mtc1 $at, $f0
-/* DE164 80147284 00000000 */ nop
-/* DE168 80147288 46020303 */ div.s $f12, $f0, $f2
-.LIQUE_8014728C:
-/* DE16C 8014728C 460CB582 */ mul.s $f22, $f22, $f12
-/* DE170 80147290 00000000 */ nop
-/* DE174 80147294 460CC602 */ mul.s $f24, $f24, $f12
-/* DE178 80147298 00000000 */ nop
-/* DE17C 8014729C 460CA502 */ mul.s $f20, $f20, $f12
-/* DE180 801472A0 00000000 */ nop
-/* DE184 801472A4 C6260008 */ lwc1 $f6, 0x8($s1)
-/* DE188 801472A8 C7C200DC */ lwc1 $f2, 0xDC($fp)
-/* DE18C 801472AC 46003107 */ neg.s $f4, $f6
-/* DE190 801472B0 46022082 */ mul.s $f2, $f4, $f2
-/* DE194 801472B4 00000000 */ nop
-/* DE198 801472B8 C6280028 */ lwc1 $f8, 0x28($s1)
-/* DE19C 801472BC C7C000FC */ lwc1 $f0, 0xFC($fp)
-/* DE1A0 801472C0 46004002 */ mul.s $f0, $f8, $f0
-/* DE1A4 801472C4 00000000 */ nop
-/* DE1A8 801472C8 46001080 */ add.s $f2, $f2, $f0
-/* DE1AC 801472CC 44800000 */ mtc1 $zero, $f0
-/* DE1B0 801472D0 3C01BF80 */ lui $at, (0xBF800000 >> 16)
-/* DE1B4 801472D4 4481F000 */ mtc1 $at, $f30
-/* DE1B8 801472D8 4600103C */ c.lt.s $f2, $f0
-/* DE1BC 801472DC 00000000 */ nop
-/* DE1C0 801472E0 45000004 */ bc1f .LIQUE_801472F4
-/* DE1C4 801472E4 00000000 */ nop
-/* DE1C8 801472E8 3C013F80 */ lui $at, (0x3F800000 >> 16)
-/* DE1CC 801472EC 4481F000 */ mtc1 $at, $f30
-/* DE1D0 801472F0 00000000 */ nop
-.LIQUE_801472F4:
-/* DE1D4 801472F4 4600F03C */ c.lt.s $f30, $f0
-/* DE1D8 801472F8 00000000 */ nop
-/* DE1DC 801472FC 45000004 */ bc1f .LIQUE_80147310
-/* DE1E0 80147300 46003086 */ mov.s $f2, $f6
-/* DE1E4 80147304 C6200018 */ lwc1 $f0, 0x18($s1)
-/* DE1E8 80147308 08051CC6 */ j .LIQUE_80147318
-/* DE1EC 8014730C 46004207 */ neg.s $f8, $f8
-.LIQUE_80147310:
-/* DE1F0 80147310 46002086 */ mov.s $f2, $f4
-/* DE1F4 80147314 C6200018 */ lwc1 $f0, 0x18($s1)
-.LIQUE_80147318:
-/* DE1F8 80147318 46161102 */ mul.s $f4, $f2, $f22
-/* DE1FC 8014731C 00000000 */ nop
-/* DE200 80147320 46180002 */ mul.s $f0, $f0, $f24
-/* DE204 80147324 00000000 */ nop
-/* DE208 80147328 46144202 */ mul.s $f8, $f8, $f20
-/* DE20C 8014732C 00000000 */ nop
-/* DE210 80147330 C7C200FC */ lwc1 $f2, 0xFC($fp)
-/* DE214 80147334 46001087 */ neg.s $f2, $f2
-/* DE218 80147338 4602B082 */ mul.s $f2, $f22, $f2
-/* DE21C 8014733C 00000000 */ nop
-/* DE220 80147340 C7C600DC */ lwc1 $f6, 0xDC($fp)
-/* DE224 80147344 4606A182 */ mul.s $f6, $f20, $f6
-/* DE228 80147348 00000000 */ nop
-/* DE22C 8014734C 46002100 */ add.s $f4, $f4, $f0
-/* DE230 80147350 46082100 */ add.s $f4, $f4, $f8
-/* DE234 80147354 44800000 */ mtc1 $zero, $f0
-/* DE238 80147358 00000000 */ nop
-/* DE23C 8014735C 4604003C */ c.lt.s $f0, $f4
-/* DE240 80147360 00000000 */ nop
-/* DE244 80147364 45000007 */ bc1f .LIQUE_80147384
-/* DE248 80147368 46061180 */ add.s $f6, $f2, $f6
-/* DE24C 8014736C 44900000 */ mtc1 $s0, $f0
-/* DE250 80147370 00000000 */ nop
-/* DE254 80147374 46800020 */ cvt.s.w $f0, $f0
-/* DE258 80147378 46060682 */ mul.s $f26, $f0, $f6
-/* DE25C 8014737C 08051CE6 */ j .LIQUE_80147398
-/* DE260 80147380 00000000 */ nop
-.LIQUE_80147384:
-/* DE264 80147384 44901000 */ mtc1 $s0, $f2
-/* DE268 80147388 00000000 */ nop
-/* DE26C 8014738C 468010A0 */ cvt.s.w $f2, $f2
-/* DE270 80147390 46061682 */ mul.s $f26, $f2, $f6
-/* DE274 80147394 00000000 */ nop
-.LIQUE_80147398:
-/* DE278 80147398 4616B002 */ mul.s $f0, $f22, $f22
-/* DE27C 8014739C 00000000 */ nop
-/* DE280 801473A0 4614A082 */ mul.s $f2, $f20, $f20
-/* DE284 801473A4 00000000 */ nop
-/* DE288 801473A8 46020500 */ add.s $f20, $f0, $f2
-/* DE28C 801473AC 44800000 */ mtc1 $zero, $f0
-/* DE290 801473B0 00000000 */ nop
-/* DE294 801473B4 4600A032 */ c.eq.s $f20, $f0
-/* DE298 801473B8 00000000 */ nop
-/* DE29C 801473BC 45010009 */ bc1t .LIQUE_801473E4
-/* DE2A0 801473C0 00000000 */ nop
-/* DE2A4 801473C4 4600A004 */ sqrt.s $f0, $f20
-/* DE2A8 801473C8 46000032 */ c.eq.s $f0, $f0
-/* DE2AC 801473CC 00000000 */ nop
-/* DE2B0 801473D0 45030004 */ bc1tl .LIQUE_801473E4
-/* DE2B4 801473D4 46000506 */ mov.s $f20, $f0
-/* DE2B8 801473D8 0C0183A0 */ jal sqrtf
-/* DE2BC 801473DC 4600A306 */ mov.s $f12, $f20
-/* DE2C0 801473E0 46000506 */ mov.s $f20, $f0
-.LIQUE_801473E4:
-/* DE2C4 801473E4 C6200004 */ lwc1 $f0, 0x4($s1)
-/* DE2C8 801473E8 46000007 */ neg.s $f0, $f0
-/* DE2CC 801473EC 46000002 */ mul.s $f0, $f0, $f0
-/* DE2D0 801473F0 00000000 */ nop
-/* DE2D4 801473F4 C6220024 */ lwc1 $f2, 0x24($s1)
-/* DE2D8 801473F8 46021082 */ mul.s $f2, $f2, $f2
-/* DE2DC 801473FC 00000000 */ nop
-/* DE2E0 80147400 46020300 */ add.s $f12, $f0, $f2
-/* DE2E4 80147404 44800000 */ mtc1 $zero, $f0
-/* DE2E8 80147408 C6360014 */ lwc1 $f22, 0x14($s1)
-/* DE2EC 8014740C 46006032 */ c.eq.s $f12, $f0
-/* DE2F0 80147410 00000000 */ nop
-/* DE2F4 80147414 45010009 */ bc1t .LIQUE_8014743C
-/* DE2F8 80147418 00000000 */ nop
-/* DE2FC 8014741C 46006004 */ sqrt.s $f0, $f12
-/* DE300 80147420 46000032 */ c.eq.s $f0, $f0
-/* DE304 80147424 00000000 */ nop
-/* DE308 80147428 45030004 */ bc1tl .LIQUE_8014743C
-/* DE30C 8014742C 46000306 */ mov.s $f12, $f0
-/* DE310 80147430 0C0183A0 */ jal sqrtf
-/* DE314 80147434 00000000 */ nop
-/* DE318 80147438 46000306 */ mov.s $f12, $f0
-.LIQUE_8014743C:
-/* DE31C 8014743C 460CA002 */ mul.s $f0, $f20, $f12
-/* DE320 80147440 00000000 */ nop
-/* DE324 80147444 4616C082 */ mul.s $f2, $f24, $f22
-/* DE328 80147448 00000000 */ nop
-/* DE32C 8014744C 46020000 */ add.s $f0, $f0, $f2
-/* DE330 80147450 2A620100 */ slti $v0, $s3, 0x100
-/* DE334 80147454 44901000 */ mtc1 $s0, $f2
-/* DE338 80147458 00000000 */ nop
-/* DE33C 8014745C 468010A0 */ cvt.s.w $f2, $f2
-/* DE340 80147460 46000007 */ neg.s $f0, $f0
-/* DE344 80147464 46020702 */ mul.s $f28, $f0, $f2
-/* DE348 80147468 00000000 */ nop
-/* DE34C 8014746C 50400001 */ beql $v0, $zero, .LIQUE_80147474
-/* DE350 80147470 241300FF */ addiu $s3, $zero, 0xFF
-.LIQUE_80147474:
-/* DE354 80147474 2A420100 */ slti $v0, $s2, 0x100
-/* DE358 80147478 50400001 */ beql $v0, $zero, .LIQUE_80147480
-/* DE35C 8014747C 241200FF */ addiu $s2, $zero, 0xFF
-.LIQUE_80147480:
-/* DE360 80147480 2A820100 */ slti $v0, $s4, 0x100
-/* DE364 80147484 50400001 */ beql $v0, $zero, .LIQUE_8014748C
-/* DE368 80147488 241400FF */ addiu $s4, $zero, 0xFF
-.LIQUE_8014748C:
-/* DE36C 8014748C 2AC20100 */ slti $v0, $s6, 0x100
-/* DE370 80147490 50400001 */ beql $v0, $zero, .LIQUE_80147498
-/* DE374 80147494 241600FF */ addiu $s6, $zero, 0xFF
-.LIQUE_80147498:
-/* DE378 80147498 2AA20100 */ slti $v0, $s5, 0x100
-/* DE37C 8014749C 50400001 */ beql $v0, $zero, .LIQUE_801474A4
-/* DE380 801474A0 241500FF */ addiu $s5, $zero, 0xFF
-.LIQUE_801474A4:
-/* DE384 801474A4 8FAF00A8 */ lw $t7, 0xA8($sp)
-/* DE388 801474A8 29E20100 */ slti $v0, $t7, 0x100
-/* DE38C 801474AC 14400003 */ bnez $v0, .LIQUE_801474BC
-/* DE390 801474B0 3C07FC21 */ lui $a3, (0xFC21FE07 >> 16)
-/* DE394 801474B4 240F00FF */ addiu $t7, $zero, 0xFF
-/* DE398 801474B8 AFAF00A8 */ sw $t7, 0xA8($sp)
-.LIQUE_801474BC:
-/* DE39C 801474BC 34E7FE07 */ ori $a3, $a3, (0xFC21FE07 & 0xFFFF)
-/* DE3A0 801474C0 3C06F167 */ lui $a2, (0xF167F27F >> 16)
-/* DE3A4 801474C4 34C6F27F */ ori $a2, $a2, (0xF167F27F & 0xFFFF)
-/* DE3A8 801474C8 3C0DFF10 */ lui $t5, (0xFF10013F >> 16)
-/* DE3AC 801474CC 35AD013F */ ori $t5, $t5, (0xFF10013F & 0xFFFF)
-/* DE3B0 801474D0 3C080004 */ lui $t0, (0x40004 >> 16)
-/* DE3B4 801474D4 35080004 */ ori $t0, $t0, (0x40004 & 0xFFFF)
-/* DE3B8 801474D8 3C0FE300 */ lui $t7, (0xE3000A11 >> 16)
-/* DE3BC 801474DC 35EF0A11 */ ori $t7, $t7, (0xE3000A11 & 0xFFFF)
-/* DE3C0 801474E0 AFAF0010 */ sw $t7, 0x10($sp)
-/* DE3C4 801474E4 3C0FE200 */ lui $t7, (0xE200001C >> 16)
-/* DE3C8 801474E8 35EF001C */ ori $t7, $t7, (0xE200001C & 0xFFFF)
-/* DE3CC 801474EC 3C090F0A */ lui $t1, (0xF0A4000 >> 16)
-/* DE3D0 801474F0 35294000 */ ori $t1, $t1, (0xF0A4000 & 0xFFFF)
-/* DE3D4 801474F4 3C0BFC34 */ lui $t3, (0xFC347E68 >> 16)
-/* DE3D8 801474F8 356B7E68 */ ori $t3, $t3, (0xFC347E68 & 0xFFFF)
-/* DE3DC 801474FC 3C0A55FE */ lui $t2, (0x55FEFD7E >> 16)
-/* DE3E0 80147500 354AFD7E */ ori $t2, $t2, (0x55FEFD7E & 0xFFFF)
-/* DE3E4 80147504 3C0CE404 */ lui $t4, (0xE4040004 >> 16)
-/* DE3E8 80147508 358C0004 */ ori $t4, $t4, (0xE4040004 & 0xFFFF)
-/* DE3EC 8014750C 3C0E1000 */ lui $t6, (0x10000400 >> 16)
-/* DE3F0 80147510 3C17800A */ lui $s7, %hi(gMainGfxPos)
-/* DE3F4 80147514 26F79244 */ addiu $s7, $s7, %lo(gMainGfxPos)
-/* DE3F8 80147518 35CE0400 */ ori $t6, $t6, (0x10000400 & 0xFFFF)
-/* DE3FC 8014751C 3C05FA00 */ lui $a1, (0xFA000000 >> 16)
-/* DE400 80147520 00131E00 */ sll $v1, $s3, 24
-/* DE404 80147524 324200FF */ andi $v0, $s2, 0xFF
-/* DE408 80147528 00021400 */ sll $v0, $v0, 16
-/* DE40C 8014752C 00621825 */ or $v1, $v1, $v0
-/* DE410 80147530 328200FF */ andi $v0, $s4, 0xFF
-/* DE414 80147534 00021200 */ sll $v0, $v0, 8
-/* DE418 80147538 00621825 */ or $v1, $v1, $v0
-/* DE41C 8014753C 3C138016 */ lui $s3, %hi(D_80159880)
-/* DE420 80147540 2673BC00 */ addiu $s3, $s3, %lo(D_80159880)
-/* DE424 80147544 3C12ED00 */ lui $s2, (0xED000000 >> 16)
-/* DE428 80147548 AFAF0014 */ sw $t7, 0x14($sp)
-/* DE42C 8014754C 8EF00000 */ lw $s0, 0x0($s7)
-/* DE430 80147550 3C14FB00 */ lui $s4, (0xFB000000 >> 16)
-/* DE434 80147554 0200202D */ daddu $a0, $s0, $zero
-/* DE438 80147558 26100008 */ addiu $s0, $s0, 0x8
-/* DE43C 8014755C AEF00000 */ sw $s0, 0x0($s7)
-/* DE440 80147560 AC850000 */ sw $a1, 0x0($a0)
-/* DE444 80147564 8FAF0084 */ lw $t7, 0x84($sp)
-/* DE448 80147568 3C11E700 */ lui $s1, (0xE7000000 >> 16)
-/* DE44C 8014756C 31E200FF */ andi $v0, $t7, 0xFF
-/* DE450 80147570 00621825 */ or $v1, $v1, $v0
-/* DE454 80147574 26020008 */ addiu $v0, $s0, 0x8
-/* DE458 80147578 AC830004 */ sw $v1, 0x4($a0)
-/* DE45C 8014757C AEE20000 */ sw $v0, 0x0($s7)
-/* DE460 80147580 26020010 */ addiu $v0, $s0, 0x10
-/* DE464 80147584 AE070000 */ sw $a3, 0x0($s0)
-/* DE468 80147588 AE060004 */ sw $a2, 0x4($s0)
-/* DE46C 8014758C AEE20000 */ sw $v0, 0x0($s7)
-/* DE470 80147590 26020018 */ addiu $v0, $s0, 0x18
-/* DE474 80147594 AE0D0008 */ sw $t5, 0x8($s0)
-/* DE478 80147598 AE13000C */ sw $s3, 0xC($s0)
-/* DE47C 8014759C AEE20000 */ sw $v0, 0x0($s7)
-/* DE480 801475A0 26020020 */ addiu $v0, $s0, 0x20
-/* DE484 801475A4 AE120010 */ sw $s2, 0x10($s0)
-/* DE488 801475A8 AE080014 */ sw $t0, 0x14($s0)
-/* DE48C 801475AC AEE20000 */ sw $v0, 0x0($s7)
-/* DE490 801475B0 8FAF0010 */ lw $t7, 0x10($sp)
-/* DE494 801475B4 24020CF0 */ addiu $v0, $zero, 0xCF0
-/* DE498 801475B8 AE02001C */ sw $v0, 0x1C($s0)
-/* DE49C 801475BC 26020028 */ addiu $v0, $s0, 0x28
-/* DE4A0 801475C0 AE0F0018 */ sw $t7, 0x18($s0)
-/* DE4A4 801475C4 AEE20000 */ sw $v0, 0x0($s7)
-/* DE4A8 801475C8 8FAF0014 */ lw $t7, 0x14($sp)
-/* DE4AC 801475CC 26020030 */ addiu $v0, $s0, 0x30
-/* DE4B0 801475D0 AE090024 */ sw $t1, 0x24($s0)
-/* DE4B4 801475D4 AE0F0020 */ sw $t7, 0x20($s0)
-/* DE4B8 801475D8 AEE20000 */ sw $v0, 0x0($s7)
-/* DE4BC 801475DC 26020038 */ addiu $v0, $s0, 0x38
-/* DE4C0 801475E0 AE03002C */ sw $v1, 0x2C($s0)
-/* DE4C4 801475E4 00161E00 */ sll $v1, $s6, 24
-/* DE4C8 801475E8 AE050028 */ sw $a1, 0x28($s0)
-/* DE4CC 801475EC AEE20000 */ sw $v0, 0x0($s7)
-/* DE4D0 801475F0 32A200FF */ andi $v0, $s5, 0xFF
-/* DE4D4 801475F4 00021400 */ sll $v0, $v0, 16
-/* DE4D8 801475F8 AE140030 */ sw $s4, 0x30($s0)
-/* DE4DC 801475FC 8FAF00A8 */ lw $t7, 0xA8($sp)
-/* DE4E0 80147600 00621825 */ or $v1, $v1, $v0
-/* DE4E4 80147604 31E200FF */ andi $v0, $t7, 0xFF
-/* DE4E8 80147608 00021200 */ sll $v0, $v0, 8
-/* DE4EC 8014760C 00621825 */ or $v1, $v1, $v0
-/* DE4F0 80147610 26020040 */ addiu $v0, $s0, 0x40
-/* DE4F4 80147614 AE030034 */ sw $v1, 0x34($s0)
-/* DE4F8 80147618 AEE20000 */ sw $v0, 0x0($s7)
-/* DE4FC 8014761C 26020048 */ addiu $v0, $s0, 0x48
-/* DE500 80147620 AE0B0038 */ sw $t3, 0x38($s0)
-/* DE504 80147624 AE0A003C */ sw $t2, 0x3C($s0)
-/* DE508 80147628 AEE20000 */ sw $v0, 0x0($s7)
-/* DE50C 8014762C 3C020200 */ lui $v0, (0x2000000 >> 16)
-/* DE510 80147630 AE020044 */ sw $v0, 0x44($s0)
-/* DE514 80147634 26020050 */ addiu $v0, $s0, 0x50
-/* DE518 80147638 AE0C0040 */ sw $t4, 0x40($s0)
-/* DE51C 8014763C AEE20000 */ sw $v0, 0x0($s7)
-/* DE520 80147640 3C02E100 */ lui $v0, (0xE1000000 >> 16)
-/* DE524 80147644 AE020048 */ sw $v0, 0x48($s0)
-/* DE528 80147648 26020058 */ addiu $v0, $s0, 0x58
-/* DE52C 8014764C AE00004C */ sw $zero, 0x4C($s0)
-/* DE530 80147650 AEE20000 */ sw $v0, 0x0($s7)
-/* DE534 80147654 3C02F100 */ lui $v0, (0xF1000000 >> 16)
-/* DE538 80147658 AE020050 */ sw $v0, 0x50($s0)
-/* DE53C 8014765C 26020060 */ addiu $v0, $s0, 0x60
-/* DE540 80147660 AE0E0054 */ sw $t6, 0x54($s0)
-/* DE544 80147664 AEE20000 */ sw $v0, 0x0($s7)
-/* DE548 80147668 3C04800A */ lui $a0, %hi(nuGfxCfb_ptr)
-/* DE54C 8014766C 8C849224 */ lw $a0, %lo(nuGfxCfb_ptr)($a0)
-/* DE550 80147670 26020068 */ addiu $v0, $s0, 0x68
-/* DE554 80147674 AE110058 */ sw $s1, 0x58($s0)
-/* DE558 80147678 AE00005C */ sw $zero, 0x5C($s0)
-/* DE55C 8014767C AEE20000 */ sw $v0, 0x0($s7)
-/* DE560 80147680 0C01836C */ jal osVirtualToPhysical
-/* DE564 80147684 AE0D0060 */ sw $t5, 0x60($s0)
-/* DE568 80147688 3C06F500 */ lui $a2, (0xF5000110 >> 16)
-/* DE56C 8014768C 34C60110 */ ori $a2, $a2, (0xF5000110 & 0xFFFF)
-/* DE570 80147690 3C070703 */ lui $a3, (0x703C000 >> 16)
-/* DE574 80147694 34E7C000 */ ori $a3, $a3, (0x703C000 & 0xFFFF)
-/* DE578 80147698 3C080018 */ lui $t0, (0x18AC30 >> 16)
-/* DE57C 8014769C 8EEA0000 */ lw $t2, 0x0($s7)
-/* DE580 801476A0 3C014080 */ lui $at, (0x40800000 >> 16)
-/* DE584 801476A4 44812000 */ mtc1 $at, $f4
-/* DE588 801476A8 3508AC30 */ ori $t0, $t0, (0x18AC30 & 0xFFFF)
-/* DE58C 801476AC AE020064 */ sw $v0, 0x64($s0)
-/* DE590 801476B0 0140282D */ daddu $a1, $t2, $zero
-/* DE594 801476B4 254A0008 */ addiu $t2, $t2, 0x8
-/* DE598 801476B8 25420008 */ addiu $v0, $t2, 0x8
-/* DE59C 801476BC AEEA0000 */ sw $t2, 0x0($s7)
-/* DE5A0 801476C0 AEE20000 */ sw $v0, 0x0($s7)
-/* DE5A4 801476C4 25420010 */ addiu $v0, $t2, 0x10
-/* DE5A8 801476C8 AEE20000 */ sw $v0, 0x0($s7)
-/* DE5AC 801476CC 25420018 */ addiu $v0, $t2, 0x18
-/* DE5B0 801476D0 AEE20000 */ sw $v0, 0x0($s7)
-/* DE5B4 801476D4 87C2000E */ lh $v0, 0xE($fp)
-/* DE5B8 801476D8 87C30010 */ lh $v1, 0x10($fp)
-/* DE5BC 801476DC 44821000 */ mtc1 $v0, $f2
-/* DE5C0 801476E0 00000000 */ nop
-/* DE5C4 801476E4 468010A0 */ cvt.s.w $f2, $f2
-/* DE5C8 801476E8 46041082 */ mul.s $f2, $f2, $f4
-/* DE5CC 801476EC 00000000 */ nop
-/* DE5D0 801476F0 25420020 */ addiu $v0, $t2, 0x20
-/* DE5D4 801476F4 44830000 */ mtc1 $v1, $f0
-/* DE5D8 801476F8 00000000 */ nop
-/* DE5DC 801476FC 46800020 */ cvt.s.w $f0, $f0
-/* DE5E0 80147700 AEE20000 */ sw $v0, 0x0($s7)
-/* DE5E4 80147704 25420028 */ addiu $v0, $t2, 0x28
-/* DE5E8 80147708 46040002 */ mul.s $f0, $f0, $f4
-/* DE5EC 8014770C 00000000 */ nop
-/* DE5F0 80147710 AEE20000 */ sw $v0, 0x0($s7)
-/* DE5F4 80147714 4600128D */ trunc.w.s $f10, $f2
-/* DE5F8 80147718 44035000 */ mfc1 $v1, $f10
-/* DE5FC 8014771C 00000000 */ nop
-/* DE600 80147720 30630FFF */ andi $v1, $v1, 0xFFF
-/* DE604 80147724 00031B00 */ sll $v1, $v1, 12
-/* DE608 80147728 4600028D */ trunc.w.s $f10, $f0
-/* DE60C 8014772C 44025000 */ mfc1 $v0, $f10
-/* DE610 80147730 00000000 */ nop
-/* DE614 80147734 30420FFF */ andi $v0, $v0, 0xFFF
-/* DE618 80147738 00521025 */ or $v0, $v0, $s2
-/* DE61C 8014773C 00621825 */ or $v1, $v1, $v0
-/* DE620 80147740 ACA30000 */ sw $v1, 0x0($a1)
-/* DE624 80147744 87C3000E */ lh $v1, 0xE($fp)
-/* DE628 80147748 87C4000A */ lh $a0, 0xA($fp)
-/* DE62C 8014774C 25420030 */ addiu $v0, $t2, 0x30
-/* DE630 80147750 AEE20000 */ sw $v0, 0x0($s7)
-/* DE634 80147754 87C20010 */ lh $v0, 0x10($fp)
-/* DE638 80147758 00641821 */ addu $v1, $v1, $a0
-/* DE63C 8014775C 44831000 */ mtc1 $v1, $f2
-/* DE640 80147760 00000000 */ nop
-/* DE644 80147764 468010A0 */ cvt.s.w $f2, $f2
-/* DE648 80147768 25440038 */ addiu $a0, $t2, 0x38
-/* DE64C 8014776C 87C3000C */ lh $v1, 0xC($fp)
-/* DE650 80147770 46041082 */ mul.s $f2, $f2, $f4
-/* DE654 80147774 00000000 */ nop
-/* DE658 80147778 AEE40000 */ sw $a0, 0x0($s7)
-/* DE65C 8014777C 00431021 */ addu $v0, $v0, $v1
-/* DE660 80147780 44820000 */ mtc1 $v0, $f0
-/* DE664 80147784 00000000 */ nop
-/* DE668 80147788 46800020 */ cvt.s.w $f0, $f0
-/* DE66C 8014778C 25420040 */ addiu $v0, $t2, 0x40
-/* DE670 80147790 46040002 */ mul.s $f0, $f0, $f4
-/* DE674 80147794 00000000 */ nop
-/* DE678 80147798 AEE20000 */ sw $v0, 0x0($s7)
-/* DE67C 8014779C 4600128D */ trunc.w.s $f10, $f2
-/* DE680 801477A0 44025000 */ mfc1 $v0, $f10
-/* DE684 801477A4 00000000 */ nop
-/* DE688 801477A8 30420FFF */ andi $v0, $v0, 0xFFF
-/* DE68C 801477AC 00021300 */ sll $v0, $v0, 12
-/* DE690 801477B0 4600028D */ trunc.w.s $f10, $f0
-/* DE694 801477B4 44035000 */ mfc1 $v1, $f10
-/* DE698 801477B8 00000000 */ nop
-/* DE69C 801477BC 30630FFF */ andi $v1, $v1, 0xFFF
-/* DE6A0 801477C0 00431025 */ or $v0, $v0, $v1
-/* DE6A4 801477C4 ACA20004 */ sw $v0, 0x4($a1)
-/* DE6A8 801477C8 3C02FD10 */ lui $v0, (0xFD100000 >> 16)
-/* DE6AC 801477CC AD420000 */ sw $v0, 0x0($t2)
-/* DE6B0 801477D0 3C02E800 */ lui $v0, (0xE8000000 >> 16)
-/* DE6B4 801477D4 AD420008 */ sw $v0, 0x8($t2)
-/* DE6B8 801477D8 3C020700 */ lui $v0, (0x7000000 >> 16)
-/* DE6BC 801477DC AD420014 */ sw $v0, 0x14($t2)
-/* DE6C0 801477E0 3C02E600 */ lui $v0, (0xE6000000 >> 16)
-/* DE6C4 801477E4 AD420018 */ sw $v0, 0x18($t2)
-/* DE6C8 801477E8 3C02F000 */ lui $v0, (0xF0000000 >> 16)
-/* DE6CC 801477EC AD530004 */ sw $s3, 0x4($t2)
-/* DE6D0 801477F0 AD40000C */ sw $zero, 0xC($t2)
-/* DE6D4 801477F4 AD460010 */ sw $a2, 0x10($t2)
-/* DE6D8 801477F8 AD40001C */ sw $zero, 0x1C($t2)
-/* DE6DC 801477FC AD420020 */ sw $v0, 0x20($t2)
-/* DE6E0 80147800 AD470024 */ sw $a3, 0x24($t2)
-/* DE6E4 80147804 AD510028 */ sw $s1, 0x28($t2)
-/* DE6E8 80147808 AD40002C */ sw $zero, 0x2C($t2)
-/* DE6EC 8014780C 8FAF0010 */ lw $t7, 0x10($sp)
-/* DE6F0 80147810 3C096464 */ lui $t1, (0x646464FF >> 16)
-/* DE6F4 80147814 AD4F0030 */ sw $t7, 0x30($t2)
-/* DE6F8 80147818 AD480034 */ sw $t0, 0x34($t2)
-/* DE6FC 8014781C 8FAF0014 */ lw $t7, 0x14($sp)
-/* DE700 80147820 352964FF */ ori $t1, $t1, (0x646464FF & 0xFFFF)
-/* DE704 80147824 AD4F0038 */ sw $t7, 0x38($t2)
-/* DE708 80147828 8FA200B0 */ lw $v0, 0xB0($sp)
-/* DE70C 8014782C 3C030C08 */ lui $v1, (0xC080000 >> 16)
-/* DE710 80147830 00431025 */ or $v0, $v0, $v1
-/* DE714 80147834 AD42003C */ sw $v0, 0x3C($t2)
-/* DE718 80147838 25420048 */ addiu $v0, $t2, 0x48
-/* DE71C 8014783C AEE20000 */ sw $v0, 0x0($s7)
-/* DE720 80147840 AD540040 */ sw $s4, 0x40($t2)
-/* DE724 80147844 AD490044 */ sw $t1, 0x44($t2)
-/* DE728 80147848 8FAF0084 */ lw $t7, 0x84($sp)
-/* DE72C 8014784C 240200FF */ addiu $v0, $zero, 0xFF
-/* DE730 80147850 15E20005 */ bne $t7, $v0, .LIQUE_80147868
-/* DE734 80147854 3C04FC11 */ lui $a0, (0xFC117E80 >> 16)
-/* DE738 80147858 34847E80 */ ori $a0, $a0, (0xFC117E80 & 0xFFFF)
-/* DE73C 8014785C 3C03F5FF */ lui $v1, (0xF5FFF438 >> 16)
-/* DE740 80147860 08051E1D */ j .LIQUE_80147874
-/* DE744 80147864 3463F438 */ ori $v1, $v1, (0xF5FFF438 & 0xFFFF)
-.LIQUE_80147868:
-/* DE748 80147868 34843480 */ ori $a0, $a0, (0xFC113480 & 0xFFFF)
-/* DE74C 8014786C 3C03F5FF */ lui $v1, (0xF5FFFE38 >> 16)
-/* DE750 80147870 3463FE38 */ ori $v1, $v1, (0xF5FFFE38 & 0xFFFF)
-.LIQUE_80147874:
-/* DE754 80147874 25420050 */ addiu $v0, $t2, 0x50
-/* DE758 80147878 AEE20000 */ sw $v0, 0x0($s7)
-/* DE75C 8014787C AD440048 */ sw $a0, 0x48($t2)
-/* DE760 80147880 AD43004C */ sw $v1, 0x4C($t2)
-/* DE764 80147884 3C03800A */ lui $v1, %hi(gMainGfxPos)
-/* DE768 80147888 24639244 */ addiu $v1, $v1, %lo(gMainGfxPos)
-/* DE76C 8014788C 8C620000 */ lw $v0, 0x0($v1)
-/* DE770 80147890 461ED002 */ mul.s $f0, $f26, $f30
-/* DE774 80147894 00000000 */ nop
-/* DE778 80147898 0040382D */ daddu $a3, $v0, $zero
-/* DE77C 8014789C 24420008 */ addiu $v0, $v0, 0x8
-/* DE780 801478A0 AC620000 */ sw $v0, 0x0($v1)
-/* DE784 801478A4 8FAF0074 */ lw $t7, 0x74($sp)
-/* DE788 801478A8 3C04F200 */ lui $a0, (0xF2000000 >> 16)
-/* DE78C 801478AC 25E30100 */ addiu $v1, $t7, 0x100
-/* DE790 801478B0 00031880 */ sll $v1, $v1, 2
-/* DE794 801478B4 4600028D */ trunc.w.s $f10, $f0
-/* DE798 801478B8 44055000 */ mfc1 $a1, $f10
-/* DE79C 801478BC 00000000 */ nop
-/* DE7A0 801478C0 00651821 */ addu $v1, $v1, $a1
-/* DE7A4 801478C4 30630FFF */ andi $v1, $v1, 0xFFF
-/* DE7A8 801478C8 8FAF0078 */ lw $t7, 0x78($sp)
-/* DE7AC 801478CC 00031B00 */ sll $v1, $v1, 12
-/* DE7B0 801478D0 25E20100 */ addiu $v0, $t7, 0x100
-/* DE7B4 801478D4 00021080 */ sll $v0, $v0, 2
-/* DE7B8 801478D8 4600E28D */ trunc.w.s $f10, $f28
-/* DE7BC 801478DC 44065000 */ mfc1 $a2, $f10
-/* DE7C0 801478E0 00000000 */ nop
-/* DE7C4 801478E4 00461021 */ addu $v0, $v0, $a2
-/* DE7C8 801478E8 30420FFF */ andi $v0, $v0, 0xFFF
-/* DE7CC 801478EC 00441025 */ or $v0, $v0, $a0
-/* DE7D0 801478F0 00621825 */ or $v1, $v1, $v0
-/* DE7D4 801478F4 ACE30000 */ sw $v1, 0x0($a3)
-/* DE7D8 801478F8 8FAF007C */ lw $t7, 0x7C($sp)
-/* DE7DC 801478FC 8FA20080 */ lw $v0, 0x80($sp)
-/* DE7E0 80147900 25E300FF */ addiu $v1, $t7, 0xFF
-/* DE7E4 80147904 00031880 */ sll $v1, $v1, 2
-/* DE7E8 80147908 00651821 */ addu $v1, $v1, $a1
-/* DE7EC 8014790C 30630FFF */ andi $v1, $v1, 0xFFF
-/* DE7F0 80147910 00031B00 */ sll $v1, $v1, 12
-/* DE7F4 80147914 244200FF */ addiu $v0, $v0, 0xFF
-/* DE7F8 80147918 00021080 */ sll $v0, $v0, 2
-/* DE7FC 8014791C 00461021 */ addu $v0, $v0, $a2
-/* DE800 80147920 30420FFF */ andi $v0, $v0, 0xFFF
-/* DE804 80147924 00621825 */ or $v1, $v1, $v0
-/* DE808 80147928 ACE30004 */ sw $v1, 0x4($a3)
-/* DE80C 8014792C 8FBF003C */ lw $ra, 0x3C($sp)
-/* DE810 80147930 8FBE0038 */ lw $fp, 0x38($sp)
-/* DE814 80147934 8FB70034 */ lw $s7, 0x34($sp)
-/* DE818 80147938 8FB60030 */ lw $s6, 0x30($sp)
-/* DE81C 8014793C 8FB5002C */ lw $s5, 0x2C($sp)
-/* DE820 80147940 8FB40028 */ lw $s4, 0x28($sp)
-/* DE824 80147944 8FB30024 */ lw $s3, 0x24($sp)
-/* DE828 80147948 8FB20020 */ lw $s2, 0x20($sp)
-/* DE82C 8014794C 8FB1001C */ lw $s1, 0x1C($sp)
-/* DE830 80147950 8FB00018 */ lw $s0, 0x18($sp)
-/* DE834 80147954 D7BE0068 */ ldc1 $f30, 0x68($sp)
-/* DE838 80147958 D7BC0060 */ ldc1 $f28, 0x60($sp)
-/* DE83C 8014795C D7BA0058 */ ldc1 $f26, 0x58($sp)
-/* DE840 80147960 D7B80050 */ ldc1 $f24, 0x50($sp)
-/* DE844 80147964 D7B60048 */ ldc1 $f22, 0x48($sp)
-/* DE848 80147968 D7B40040 */ ldc1 $f20, 0x40($sp)
-/* DE84C 8014796C 03E00008 */ jr $ra
-/* DE850 80147970 27BD0070 */ addiu $sp, $sp, 0x70
diff --git a/ver/ique/splat-shift.yaml b/ver/ique/splat-shift.yaml
new file mode 100644
index 0000000000..bdc2c9fec4
--- /dev/null
+++ b/ver/ique/splat-shift.yaml
@@ -0,0 +1,2 @@
+options:
+ ld_use_follows: True
diff --git a/ver/ique/splat.yaml b/ver/ique/splat.yaml
index 2d5e9451fd..ac283bef25 100644
--- a/ver/ique/splat.yaml
+++ b/ver/ique/splat.yaml
@@ -416,7 +416,7 @@ segments:
- [0xDB3E0, c, dc470_len_14c0]
- [0xDC8A0, c, audio/ambience]
- [0xDCA60, c, windows]
- - [0xDD6B0, c, de740_len_23f0]
+ - [0xDD6B0, c, sprite_shading]
- [0xDE8C0, c, audio/sfx]
- [0xDFAA0, c, audio/e0b30_len_b80]
- [0xE0620, .data, a5dd0_len_114e0]
diff --git a/ver/pal/splat-shift.yaml b/ver/pal/splat-shift.yaml
new file mode 100644
index 0000000000..bdc2c9fec4
--- /dev/null
+++ b/ver/pal/splat-shift.yaml
@@ -0,0 +1,2 @@
+options:
+ ld_use_follows: True
diff --git a/ver/pal/splat.yaml b/ver/pal/splat.yaml
index b47468ad1d..4b38a8eabe 100644
--- a/ver/pal/splat.yaml
+++ b/ver/pal/splat.yaml
@@ -3734,8 +3734,7 @@ segments:
- [0x41B450, ia8, D_09001B80_3ED9E0, 128, 10]
- [0x41B950, ia8, D_09002080_3EDEE0, 128, 10]
- [0x41BE50, ia8, D_09002580_3EE3E0, 128, 10]
- - [0x41C350, ia8, world/text_end_of, 104, 20]
- - [0x41CB70, ia8, D_090032A0_3EF100, 104, 20]
+ - [0x41C350, ia8, world/text_end_of, 104, 40]
- [0x41D390, ia8, world/exclamation_point, 16, 40]
- [0x41D610, ia8, world/ch1, 64, 64]
- [0x41E610, ia8, world/ch2, 64, 64]
diff --git a/ver/pal/symbol_addrs.txt b/ver/pal/symbol_addrs.txt
index 8fc5153491..c6dca82ccd 100644
--- a/ver/pal/symbol_addrs.txt
+++ b/ver/pal/symbol_addrs.txt
@@ -1388,8 +1388,7 @@ D_09001680_3ED4E0 = 0x9001680; // rom:0x41AF50
D_09001B80_3ED9E0 = 0x9001B80; // rom:0x41B450
D_09002080_3EDEE0 = 0x9002080; // rom:0x41B950
D_09002580_3EE3E0 = 0x9002580; // rom:0x41BE50
-D_09002A80_3EE8E0 = 0x9002A80; // rom:0x41C350
-D_090032A0_3EF100 = 0x90032A0; // rom:0x41CB70
+D_09002A80_3EE8E0 = 0x9002A80; // rom:0x41C350 size:0x1040
D_09003AC0_3EF920 = 0x9003AC0; // rom:0x41D390
D_09003D40_3EFBA0 = 0x9003D40; // rom:0x41D610
D_09004D40_3F0BA0 = 0x9004D40; // rom:0x41E610
diff --git a/ver/us/asm/nonmatchings/de740_len_23f0/appendGfx_shading_palette.s b/ver/us/asm/nonmatchings/de740_len_23f0/appendGfx_shading_palette.s
deleted file mode 100644
index 4020f06048..0000000000
--- a/ver/us/asm/nonmatchings/de740_len_23f0/appendGfx_shading_palette.s
+++ /dev/null
@@ -1,545 +0,0 @@
-.set noat # allow manual use of $at
-.set noreorder # don't insert nops after branches
-
-glabel appendGfx_shading_palette
-/* DF0B8 801489B8 27BDFF90 */ addiu $sp, $sp, -0x70
-/* DF0BC 801489BC F7B60048 */ sdc1 $f22, 0x48($sp)
-/* DF0C0 801489C0 C7B60088 */ lwc1 $f22, 0x88($sp)
-/* DF0C4 801489C4 F7B80050 */ sdc1 $f24, 0x50($sp)
-/* DF0C8 801489C8 C7B8008C */ lwc1 $f24, 0x8c($sp)
-/* DF0CC 801489CC F7B40040 */ sdc1 $f20, 0x40($sp)
-/* DF0D0 801489D0 C7B40090 */ lwc1 $f20, 0x90($sp)
-/* DF0D4 801489D4 AFB30024 */ sw $s3, 0x24($sp)
-/* DF0D8 801489D8 8FB30094 */ lw $s3, 0x94($sp)
-/* DF0DC 801489DC AFB20020 */ sw $s2, 0x20($sp)
-/* DF0E0 801489E0 8FB20098 */ lw $s2, 0x98($sp)
-/* DF0E4 801489E4 AFB40028 */ sw $s4, 0x28($sp)
-/* DF0E8 801489E8 8FB4009C */ lw $s4, 0x9c($sp)
-/* DF0EC 801489EC AFB60030 */ sw $s6, 0x30($sp)
-/* DF0F0 801489F0 8FB600A0 */ lw $s6, 0xa0($sp)
-/* DF0F4 801489F4 AFB5002C */ sw $s5, 0x2c($sp)
-/* DF0F8 801489F8 8FB500A4 */ lw $s5, 0xa4($sp)
-/* DF0FC 801489FC AFB00018 */ sw $s0, 0x18($sp)
-/* DF100 80148A00 8FB000AC */ lw $s0, 0xac($sp)
-/* DF104 80148A04 AFB1001C */ sw $s1, 0x1c($sp)
-/* DF108 80148A08 0080882D */ daddu $s1, $a0, $zero
-/* DF10C 80148A0C F7BC0060 */ sdc1 $f28, 0x60($sp)
-/* DF110 80148A10 4480E000 */ mtc1 $zero, $f28
-/* DF114 80148A14 3C038007 */ lui $v1, %hi(gCurrentCameraID)
-/* DF118 80148A18 8C637410 */ lw $v1, %lo(gCurrentCameraID)($v1)
-/* DF11C 80148A1C 3C04800B */ lui $a0, %hi(gCameras)
-/* DF120 80148A20 24841D80 */ addiu $a0, $a0, %lo(gCameras)
-/* DF124 80148A24 AFBF003C */ sw $ra, 0x3c($sp)
-/* DF128 80148A28 4616B002 */ mul.s $f0, $f22, $f22
-/* DF12C 80148A2C 00000000 */ nop
-/* DF130 80148A30 AFBE0038 */ sw $fp, 0x38($sp)
-/* DF134 80148A34 AFB70034 */ sw $s7, 0x34($sp)
-/* DF138 80148A38 F7BE0068 */ sdc1 $f30, 0x68($sp)
-/* DF13C 80148A3C F7BA0058 */ sdc1 $f26, 0x58($sp)
-/* DF140 80148A40 4618C082 */ mul.s $f2, $f24, $f24
-/* DF144 80148A44 00000000 */ nop
-/* DF148 80148A48 AFA50074 */ sw $a1, 0x74($sp)
-/* DF14C 80148A4C AFA60078 */ sw $a2, 0x78($sp)
-/* DF150 80148A50 AFA7007C */ sw $a3, 0x7c($sp)
-/* DF154 80148A54 00031080 */ sll $v0, $v1, 2
-/* DF158 80148A58 4614A102 */ mul.s $f4, $f20, $f20
-/* DF15C 80148A5C 00000000 */ nop
-/* DF160 80148A60 00431021 */ addu $v0, $v0, $v1
-/* DF164 80148A64 00021080 */ sll $v0, $v0, 2
-/* DF168 80148A68 00431023 */ subu $v0, $v0, $v1
-/* DF16C 80148A6C 000218C0 */ sll $v1, $v0, 3
-/* DF170 80148A70 46020000 */ add.s $f0, $f0, $f2
-/* DF174 80148A74 00431021 */ addu $v0, $v0, $v1
-/* DF178 80148A78 000210C0 */ sll $v0, $v0, 3
-/* DF17C 80148A7C 46040300 */ add.s $f12, $f0, $f4
-/* DF180 80148A80 3C013FF0 */ lui $at, 0x3ff0
-/* DF184 80148A84 44811800 */ mtc1 $at, $f3
-/* DF188 80148A88 44801000 */ mtc1 $zero, $f2
-/* DF18C 80148A8C 46006021 */ cvt.d.s $f0, $f12
-/* DF190 80148A90 4622003C */ c.lt.d $f0, $f2
-/* DF194 80148A94 00000000 */ nop
-/* DF198 80148A98 45000008 */ bc1f .L80148ABC
-/* DF19C 80148A9C 0044F021 */ addu $fp, $v0, $a0
-/* DF1A0 80148AA0 44900000 */ mtc1 $s0, $f0
-/* DF1A4 80148AA4 00000000 */ nop
-/* DF1A8 80148AA8 46800020 */ cvt.s.w $f0, $f0
-/* DF1AC 80148AAC 460C0002 */ mul.s $f0, $f0, $f12
-/* DF1B0 80148AB0 00000000 */ nop
-/* DF1B4 80148AB4 4600028D */ trunc.w.s $f10, $f0
-/* DF1B8 80148AB8 44105000 */ mfc1 $s0, $f10
-.L80148ABC:
-/* DF1BC 80148ABC 461C6032 */ c.eq.s $f12, $f28
-/* DF1C0 80148AC0 00000000 */ nop
-/* DF1C4 80148AC4 4501000D */ bc1t .L80148AFC
-/* DF1C8 80148AC8 00000000 */ nop
-/* DF1CC 80148ACC 46006084 */ sqrt.s $f2, $f12
-/* DF1D0 80148AD0 46021032 */ c.eq.s $f2, $f2
-/* DF1D4 80148AD4 00000000 */ nop
-/* DF1D8 80148AD8 45010004 */ bc1t .L80148AEC
-/* DF1DC 80148ADC 00000000 */ nop
-/* DF1E0 80148AE0 0C0187BC */ jal sqrtf
-/* DF1E4 80148AE4 00000000 */ nop
-/* DF1E8 80148AE8 46000086 */ mov.s $f2, $f0
-.L80148AEC:
-/* DF1EC 80148AEC 3C013F80 */ lui $at, 0x3f80
-/* DF1F0 80148AF0 44810000 */ mtc1 $at, $f0
-/* DF1F4 80148AF4 00000000 */ nop
-/* DF1F8 80148AF8 46020303 */ div.s $f12, $f0, $f2
-.L80148AFC:
-/* DF1FC 80148AFC 460CB582 */ mul.s $f22, $f22, $f12
-/* DF200 80148B00 00000000 */ nop
-/* DF204 80148B04 460CC602 */ mul.s $f24, $f24, $f12
-/* DF208 80148B08 00000000 */ nop
-/* DF20C 80148B0C 460CA502 */ mul.s $f20, $f20, $f12
-/* DF210 80148B10 00000000 */ nop
-/* DF214 80148B14 C6260008 */ lwc1 $f6, 8($s1)
-/* DF218 80148B18 C7C200DC */ lwc1 $f2, 0xdc($fp)
-/* DF21C 80148B1C 46003107 */ neg.s $f4, $f6
-/* DF220 80148B20 46022082 */ mul.s $f2, $f4, $f2
-/* DF224 80148B24 00000000 */ nop
-/* DF228 80148B28 C6280028 */ lwc1 $f8, 0x28($s1)
-/* DF22C 80148B2C C7C000FC */ lwc1 $f0, 0xfc($fp)
-/* DF230 80148B30 46004002 */ mul.s $f0, $f8, $f0
-/* DF234 80148B34 00000000 */ nop
-/* DF238 80148B38 46001080 */ add.s $f2, $f2, $f0
-/* DF23C 80148B3C 44800000 */ mtc1 $zero, $f0
-/* DF240 80148B40 3C01BF80 */ lui $at, 0xbf80
-/* DF244 80148B44 4481F000 */ mtc1 $at, $f30
-/* DF248 80148B48 4600103C */ c.lt.s $f2, $f0
-/* DF24C 80148B4C 00000000 */ nop
-/* DF250 80148B50 45000004 */ bc1f .L80148B64
-/* DF254 80148B54 00000000 */ nop
-/* DF258 80148B58 3C013F80 */ lui $at, 0x3f80
-/* DF25C 80148B5C 4481F000 */ mtc1 $at, $f30
-/* DF260 80148B60 00000000 */ nop
-.L80148B64:
-/* DF264 80148B64 4600F03C */ c.lt.s $f30, $f0
-/* DF268 80148B68 00000000 */ nop
-/* DF26C 80148B6C 45000004 */ bc1f .L80148B80
-/* DF270 80148B70 46003086 */ mov.s $f2, $f6
-/* DF274 80148B74 C6200018 */ lwc1 $f0, 0x18($s1)
-/* DF278 80148B78 080522E2 */ j .L80148B88
-/* DF27C 80148B7C 46004207 */ neg.s $f8, $f8
-.L80148B80:
-/* DF280 80148B80 46002086 */ mov.s $f2, $f4
-/* DF284 80148B84 C6200018 */ lwc1 $f0, 0x18($s1)
-.L80148B88:
-/* DF288 80148B88 46161102 */ mul.s $f4, $f2, $f22
-/* DF28C 80148B8C 00000000 */ nop
-/* DF290 80148B90 46180002 */ mul.s $f0, $f0, $f24
-/* DF294 80148B94 00000000 */ nop
-/* DF298 80148B98 46144202 */ mul.s $f8, $f8, $f20
-/* DF29C 80148B9C 00000000 */ nop
-/* DF2A0 80148BA0 C7C200FC */ lwc1 $f2, 0xfc($fp)
-/* DF2A4 80148BA4 46001087 */ neg.s $f2, $f2
-/* DF2A8 80148BA8 4602B082 */ mul.s $f2, $f22, $f2
-/* DF2AC 80148BAC 00000000 */ nop
-/* DF2B0 80148BB0 C7C600DC */ lwc1 $f6, 0xdc($fp)
-/* DF2B4 80148BB4 4606A182 */ mul.s $f6, $f20, $f6
-/* DF2B8 80148BB8 00000000 */ nop
-/* DF2BC 80148BBC 46002100 */ add.s $f4, $f4, $f0
-/* DF2C0 80148BC0 46082100 */ add.s $f4, $f4, $f8
-/* DF2C4 80148BC4 44800000 */ mtc1 $zero, $f0
-/* DF2C8 80148BC8 00000000 */ nop
-/* DF2CC 80148BCC 4604003C */ c.lt.s $f0, $f4
-/* DF2D0 80148BD0 00000000 */ nop
-/* DF2D4 80148BD4 45000007 */ bc1f .L80148BF4
-/* DF2D8 80148BD8 46061180 */ add.s $f6, $f2, $f6
-/* DF2DC 80148BDC 44900000 */ mtc1 $s0, $f0
-/* DF2E0 80148BE0 00000000 */ nop
-/* DF2E4 80148BE4 46800020 */ cvt.s.w $f0, $f0
-/* DF2E8 80148BE8 46060682 */ mul.s $f26, $f0, $f6
-/* DF2EC 80148BEC 08052302 */ j .L80148C08
-/* DF2F0 80148BF0 00000000 */ nop
-.L80148BF4:
-/* DF2F4 80148BF4 44901000 */ mtc1 $s0, $f2
-/* DF2F8 80148BF8 00000000 */ nop
-/* DF2FC 80148BFC 468010A0 */ cvt.s.w $f2, $f2
-/* DF300 80148C00 46061682 */ mul.s $f26, $f2, $f6
-/* DF304 80148C04 00000000 */ nop
-.L80148C08:
-/* DF308 80148C08 4616B002 */ mul.s $f0, $f22, $f22
-/* DF30C 80148C0C 00000000 */ nop
-/* DF310 80148C10 4614A082 */ mul.s $f2, $f20, $f20
-/* DF314 80148C14 00000000 */ nop
-/* DF318 80148C18 46020500 */ add.s $f20, $f0, $f2
-/* DF31C 80148C1C 44800000 */ mtc1 $zero, $f0
-/* DF320 80148C20 00000000 */ nop
-/* DF324 80148C24 4600A032 */ c.eq.s $f20, $f0
-/* DF328 80148C28 00000000 */ nop
-/* DF32C 80148C2C 45010009 */ bc1t .L80148C54
-/* DF330 80148C30 00000000 */ nop
-/* DF334 80148C34 4600A004 */ sqrt.s $f0, $f20
-/* DF338 80148C38 46000032 */ c.eq.s $f0, $f0
-/* DF33C 80148C3C 00000000 */ nop
-/* DF340 80148C40 45030004 */ bc1tl .L80148C54
-/* DF344 80148C44 46000506 */ mov.s $f20, $f0
-/* DF348 80148C48 0C0187BC */ jal sqrtf
-/* DF34C 80148C4C 4600A306 */ mov.s $f12, $f20
-/* DF350 80148C50 46000506 */ mov.s $f20, $f0
-.L80148C54:
-/* DF354 80148C54 C6200004 */ lwc1 $f0, 4($s1)
-/* DF358 80148C58 46000007 */ neg.s $f0, $f0
-/* DF35C 80148C5C 46000002 */ mul.s $f0, $f0, $f0
-/* DF360 80148C60 00000000 */ nop
-/* DF364 80148C64 C6220024 */ lwc1 $f2, 0x24($s1)
-/* DF368 80148C68 46021082 */ mul.s $f2, $f2, $f2
-/* DF36C 80148C6C 00000000 */ nop
-/* DF370 80148C70 46020300 */ add.s $f12, $f0, $f2
-/* DF374 80148C74 44800000 */ mtc1 $zero, $f0
-/* DF378 80148C78 C6360014 */ lwc1 $f22, 0x14($s1)
-/* DF37C 80148C7C 46006032 */ c.eq.s $f12, $f0
-/* DF380 80148C80 00000000 */ nop
-/* DF384 80148C84 45010009 */ bc1t .L80148CAC
-/* DF388 80148C88 00000000 */ nop
-/* DF38C 80148C8C 46006004 */ sqrt.s $f0, $f12
-/* DF390 80148C90 46000032 */ c.eq.s $f0, $f0
-/* DF394 80148C94 00000000 */ nop
-/* DF398 80148C98 45030004 */ bc1tl .L80148CAC
-/* DF39C 80148C9C 46000306 */ mov.s $f12, $f0
-/* DF3A0 80148CA0 0C0187BC */ jal sqrtf
-/* DF3A4 80148CA4 00000000 */ nop
-/* DF3A8 80148CA8 46000306 */ mov.s $f12, $f0
-.L80148CAC:
-/* DF3AC 80148CAC 460CA002 */ mul.s $f0, $f20, $f12
-/* DF3B0 80148CB0 00000000 */ nop
-/* DF3B4 80148CB4 4616C082 */ mul.s $f2, $f24, $f22
-/* DF3B8 80148CB8 00000000 */ nop
-/* DF3BC 80148CBC 46020000 */ add.s $f0, $f0, $f2
-/* DF3C0 80148CC0 2A620100 */ slti $v0, $s3, 0x100
-/* DF3C4 80148CC4 44901000 */ mtc1 $s0, $f2
-/* DF3C8 80148CC8 00000000 */ nop
-/* DF3CC 80148CCC 468010A0 */ cvt.s.w $f2, $f2
-/* DF3D0 80148CD0 46000007 */ neg.s $f0, $f0
-/* DF3D4 80148CD4 46020702 */ mul.s $f28, $f0, $f2
-/* DF3D8 80148CD8 00000000 */ nop
-/* DF3DC 80148CDC 50400001 */ beql $v0, $zero, .L80148CE4
-/* DF3E0 80148CE0 241300FF */ addiu $s3, $zero, 0xff
-.L80148CE4:
-/* DF3E4 80148CE4 2A420100 */ slti $v0, $s2, 0x100
-/* DF3E8 80148CE8 50400001 */ beql $v0, $zero, .L80148CF0
-/* DF3EC 80148CEC 241200FF */ addiu $s2, $zero, 0xff
-.L80148CF0:
-/* DF3F0 80148CF0 2A820100 */ slti $v0, $s4, 0x100
-/* DF3F4 80148CF4 50400001 */ beql $v0, $zero, .L80148CFC
-/* DF3F8 80148CF8 241400FF */ addiu $s4, $zero, 0xff
-.L80148CFC:
-/* DF3FC 80148CFC 2AC20100 */ slti $v0, $s6, 0x100
-/* DF400 80148D00 50400001 */ beql $v0, $zero, .L80148D08
-/* DF404 80148D04 241600FF */ addiu $s6, $zero, 0xff
-.L80148D08:
-/* DF408 80148D08 2AA20100 */ slti $v0, $s5, 0x100
-/* DF40C 80148D0C 50400001 */ beql $v0, $zero, .L80148D14
-/* DF410 80148D10 241500FF */ addiu $s5, $zero, 0xff
-.L80148D14:
-/* DF414 80148D14 8FAF00A8 */ lw $t7, 0xa8($sp)
-/* DF418 80148D18 29E20100 */ slti $v0, $t7, 0x100
-/* DF41C 80148D1C 14400003 */ bnez $v0, .L80148D2C
-/* DF420 80148D20 3C07FC21 */ lui $a3, 0xfc21
-/* DF424 80148D24 240F00FF */ addiu $t7, $zero, 0xff
-/* DF428 80148D28 AFAF00A8 */ sw $t7, 0xa8($sp)
-.L80148D2C:
-/* DF42C 80148D2C 34E7FE07 */ ori $a3, $a3, 0xfe07
-/* DF430 80148D30 3C06F167 */ lui $a2, 0xf167
-/* DF434 80148D34 34C6F27F */ ori $a2, $a2, 0xf27f
-/* DF438 80148D38 3C0DFF10 */ lui $t5, 0xff10
-/* DF43C 80148D3C 35AD013F */ ori $t5, $t5, 0x13f
-/* DF440 80148D40 3C080004 */ lui $t0, 4
-/* DF444 80148D44 35080004 */ ori $t0, $t0, 4
-/* DF448 80148D48 3C0FE300 */ lui $t7, 0xe300
-/* DF44C 80148D4C 35EF0A11 */ ori $t7, $t7, 0xa11
-/* DF450 80148D50 AFAF0010 */ sw $t7, 0x10($sp)
-/* DF454 80148D54 3C0FE200 */ lui $t7, 0xe200
-/* DF458 80148D58 35EF001C */ ori $t7, $t7, 0x1c
-/* DF45C 80148D5C 3C090F0A */ lui $t1, 0xf0a
-/* DF460 80148D60 35294000 */ ori $t1, $t1, 0x4000
-/* DF464 80148D64 3C0BFC34 */ lui $t3, 0xfc34
-/* DF468 80148D68 356B7E68 */ ori $t3, $t3, 0x7e68
-/* DF46C 80148D6C 3C0A55FE */ lui $t2, 0x55fe
-/* DF470 80148D70 354AFD7E */ ori $t2, $t2, 0xfd7e
-/* DF474 80148D74 3C0CE404 */ lui $t4, 0xe404
-/* DF478 80148D78 358C0004 */ ori $t4, $t4, 4
-/* DF47C 80148D7C 3C0E1000 */ lui $t6, 0x1000
-/* DF480 80148D80 3C17800A */ lui $s7, %hi(gMainGfxPos)
-/* DF484 80148D84 26F7A66C */ addiu $s7, $s7, %lo(gMainGfxPos)
-/* DF488 80148D88 35CE0400 */ ori $t6, $t6, 0x400
-/* DF48C 80148D8C 3C05FA00 */ lui $a1, 0xfa00
-/* DF490 80148D90 00131E00 */ sll $v1, $s3, 0x18
-/* DF494 80148D94 324200FF */ andi $v0, $s2, 0xff
-/* DF498 80148D98 00021400 */ sll $v0, $v0, 0x10
-/* DF49C 80148D9C 00621825 */ or $v1, $v1, $v0
-/* DF4A0 80148DA0 328200FF */ andi $v0, $s4, 0xff
-/* DF4A4 80148DA4 00021200 */ sll $v0, $v0, 8
-/* DF4A8 80148DA8 00621825 */ or $v1, $v1, $v0
-/* DF4AC 80148DAC 3C138016 */ lui $s3, %hi(D_80159880)
-/* DF4B0 80148DB0 26739880 */ addiu $s3, $s3, %lo(D_80159880)
-/* DF4B4 80148DB4 3C12ED00 */ lui $s2, 0xed00
-/* DF4B8 80148DB8 AFAF0014 */ sw $t7, 0x14($sp)
-/* DF4BC 80148DBC 8EF00000 */ lw $s0, ($s7)
-/* DF4C0 80148DC0 3C14FB00 */ lui $s4, 0xfb00
-/* DF4C4 80148DC4 0200202D */ daddu $a0, $s0, $zero
-/* DF4C8 80148DC8 26100008 */ addiu $s0, $s0, 8
-/* DF4CC 80148DCC AEF00000 */ sw $s0, ($s7)
-/* DF4D0 80148DD0 AC850000 */ sw $a1, ($a0)
-/* DF4D4 80148DD4 8FAF0084 */ lw $t7, 0x84($sp)
-/* DF4D8 80148DD8 3C11E700 */ lui $s1, 0xe700
-/* DF4DC 80148DDC 31E200FF */ andi $v0, $t7, 0xff
-/* DF4E0 80148DE0 00621825 */ or $v1, $v1, $v0
-/* DF4E4 80148DE4 26020008 */ addiu $v0, $s0, 8
-/* DF4E8 80148DE8 AC830004 */ sw $v1, 4($a0)
-/* DF4EC 80148DEC AEE20000 */ sw $v0, ($s7)
-/* DF4F0 80148DF0 26020010 */ addiu $v0, $s0, 0x10
-/* DF4F4 80148DF4 AE070000 */ sw $a3, ($s0)
-/* DF4F8 80148DF8 AE060004 */ sw $a2, 4($s0)
-/* DF4FC 80148DFC AEE20000 */ sw $v0, ($s7)
-/* DF500 80148E00 26020018 */ addiu $v0, $s0, 0x18
-/* DF504 80148E04 AE0D0008 */ sw $t5, 8($s0)
-/* DF508 80148E08 AE13000C */ sw $s3, 0xc($s0)
-/* DF50C 80148E0C AEE20000 */ sw $v0, ($s7)
-/* DF510 80148E10 26020020 */ addiu $v0, $s0, 0x20
-/* DF514 80148E14 AE120010 */ sw $s2, 0x10($s0)
-/* DF518 80148E18 AE080014 */ sw $t0, 0x14($s0)
-/* DF51C 80148E1C AEE20000 */ sw $v0, ($s7)
-/* DF520 80148E20 8FAF0010 */ lw $t7, 0x10($sp)
-/* DF524 80148E24 24020CF0 */ addiu $v0, $zero, 0xcf0
-/* DF528 80148E28 AE02001C */ sw $v0, 0x1c($s0)
-/* DF52C 80148E2C 26020028 */ addiu $v0, $s0, 0x28
-/* DF530 80148E30 AE0F0018 */ sw $t7, 0x18($s0)
-/* DF534 80148E34 AEE20000 */ sw $v0, ($s7)
-/* DF538 80148E38 8FAF0014 */ lw $t7, 0x14($sp)
-/* DF53C 80148E3C 26020030 */ addiu $v0, $s0, 0x30
-/* DF540 80148E40 AE090024 */ sw $t1, 0x24($s0)
-/* DF544 80148E44 AE0F0020 */ sw $t7, 0x20($s0)
-/* DF548 80148E48 AEE20000 */ sw $v0, ($s7)
-/* DF54C 80148E4C 26020038 */ addiu $v0, $s0, 0x38
-/* DF550 80148E50 AE03002C */ sw $v1, 0x2c($s0)
-/* DF554 80148E54 00161E00 */ sll $v1, $s6, 0x18
-/* DF558 80148E58 AE050028 */ sw $a1, 0x28($s0)
-/* DF55C 80148E5C AEE20000 */ sw $v0, ($s7)
-/* DF560 80148E60 32A200FF */ andi $v0, $s5, 0xff
-/* DF564 80148E64 00021400 */ sll $v0, $v0, 0x10
-/* DF568 80148E68 AE140030 */ sw $s4, 0x30($s0)
-/* DF56C 80148E6C 8FAF00A8 */ lw $t7, 0xa8($sp)
-/* DF570 80148E70 00621825 */ or $v1, $v1, $v0
-/* DF574 80148E74 31E200FF */ andi $v0, $t7, 0xff
-/* DF578 80148E78 00021200 */ sll $v0, $v0, 8
-/* DF57C 80148E7C 00621825 */ or $v1, $v1, $v0
-/* DF580 80148E80 26020040 */ addiu $v0, $s0, 0x40
-/* DF584 80148E84 AE030034 */ sw $v1, 0x34($s0)
-/* DF588 80148E88 AEE20000 */ sw $v0, ($s7)
-/* DF58C 80148E8C 26020048 */ addiu $v0, $s0, 0x48
-/* DF590 80148E90 AE0B0038 */ sw $t3, 0x38($s0)
-/* DF594 80148E94 AE0A003C */ sw $t2, 0x3c($s0)
-/* DF598 80148E98 AEE20000 */ sw $v0, ($s7)
-/* DF59C 80148E9C 3C020200 */ lui $v0, 0x200
-/* DF5A0 80148EA0 AE020044 */ sw $v0, 0x44($s0)
-/* DF5A4 80148EA4 26020050 */ addiu $v0, $s0, 0x50
-/* DF5A8 80148EA8 AE0C0040 */ sw $t4, 0x40($s0)
-/* DF5AC 80148EAC AEE20000 */ sw $v0, ($s7)
-/* DF5B0 80148EB0 3C02E100 */ lui $v0, 0xe100
-/* DF5B4 80148EB4 AE020048 */ sw $v0, 0x48($s0)
-/* DF5B8 80148EB8 26020058 */ addiu $v0, $s0, 0x58
-/* DF5BC 80148EBC AE00004C */ sw $zero, 0x4c($s0)
-/* DF5C0 80148EC0 AEE20000 */ sw $v0, ($s7)
-/* DF5C4 80148EC4 3C02F100 */ lui $v0, 0xf100
-/* DF5C8 80148EC8 AE020050 */ sw $v0, 0x50($s0)
-/* DF5CC 80148ECC 26020060 */ addiu $v0, $s0, 0x60
-/* DF5D0 80148ED0 AE0E0054 */ sw $t6, 0x54($s0)
-/* DF5D4 80148ED4 AEE20000 */ sw $v0, ($s7)
-/* DF5D8 80148ED8 3C04800A */ lui $a0, %hi(nuGfxCfb_ptr)
-/* DF5DC 80148EDC 8C84A64C */ lw $a0, %lo(nuGfxCfb_ptr)($a0)
-/* DF5E0 80148EE0 26020068 */ addiu $v0, $s0, 0x68
-/* DF5E4 80148EE4 AE110058 */ sw $s1, 0x58($s0)
-/* DF5E8 80148EE8 AE00005C */ sw $zero, 0x5c($s0)
-/* DF5EC 80148EEC AEE20000 */ sw $v0, ($s7)
-/* DF5F0 80148EF0 0C0187A4 */ jal osVirtualToPhysical
-/* DF5F4 80148EF4 AE0D0060 */ sw $t5, 0x60($s0)
-/* DF5F8 80148EF8 3C06F500 */ lui $a2, 0xf500
-/* DF5FC 80148EFC 34C60110 */ ori $a2, $a2, 0x110
-/* DF600 80148F00 3C070703 */ lui $a3, 0x703
-/* DF604 80148F04 34E7C000 */ ori $a3, $a3, 0xc000
-/* DF608 80148F08 3C080018 */ lui $t0, 0x18
-/* DF60C 80148F0C 8EEA0000 */ lw $t2, ($s7)
-/* DF610 80148F10 3C014080 */ lui $at, 0x4080
-/* DF614 80148F14 44812000 */ mtc1 $at, $f4
-/* DF618 80148F18 3508AC30 */ ori $t0, $t0, 0xac30
-/* DF61C 80148F1C AE020064 */ sw $v0, 0x64($s0)
-/* DF620 80148F20 0140282D */ daddu $a1, $t2, $zero
-/* DF624 80148F24 254A0008 */ addiu $t2, $t2, 8
-/* DF628 80148F28 25420008 */ addiu $v0, $t2, 8
-/* DF62C 80148F2C AEEA0000 */ sw $t2, ($s7)
-/* DF630 80148F30 AEE20000 */ sw $v0, ($s7)
-/* DF634 80148F34 25420010 */ addiu $v0, $t2, 0x10
-/* DF638 80148F38 AEE20000 */ sw $v0, ($s7)
-/* DF63C 80148F3C 25420018 */ addiu $v0, $t2, 0x18
-/* DF640 80148F40 AEE20000 */ sw $v0, ($s7)
-/* DF644 80148F44 87C2000E */ lh $v0, 0xe($fp)
-/* DF648 80148F48 87C30010 */ lh $v1, 0x10($fp)
-/* DF64C 80148F4C 44821000 */ mtc1 $v0, $f2
-/* DF650 80148F50 00000000 */ nop
-/* DF654 80148F54 468010A0 */ cvt.s.w $f2, $f2
-/* DF658 80148F58 46041082 */ mul.s $f2, $f2, $f4
-/* DF65C 80148F5C 00000000 */ nop
-/* DF660 80148F60 25420020 */ addiu $v0, $t2, 0x20
-/* DF664 80148F64 44830000 */ mtc1 $v1, $f0
-/* DF668 80148F68 00000000 */ nop
-/* DF66C 80148F6C 46800020 */ cvt.s.w $f0, $f0
-/* DF670 80148F70 AEE20000 */ sw $v0, ($s7)
-/* DF674 80148F74 25420028 */ addiu $v0, $t2, 0x28
-/* DF678 80148F78 46040002 */ mul.s $f0, $f0, $f4
-/* DF67C 80148F7C 00000000 */ nop
-/* DF680 80148F80 AEE20000 */ sw $v0, ($s7)
-/* DF684 80148F84 4600128D */ trunc.w.s $f10, $f2
-/* DF688 80148F88 44035000 */ mfc1 $v1, $f10
-/* DF68C 80148F8C 00000000 */ nop
-/* DF690 80148F90 30630FFF */ andi $v1, $v1, 0xfff
-/* DF694 80148F94 00031B00 */ sll $v1, $v1, 0xc
-/* DF698 80148F98 4600028D */ trunc.w.s $f10, $f0
-/* DF69C 80148F9C 44025000 */ mfc1 $v0, $f10
-/* DF6A0 80148FA0 00000000 */ nop
-/* DF6A4 80148FA4 30420FFF */ andi $v0, $v0, 0xfff
-/* DF6A8 80148FA8 00521025 */ or $v0, $v0, $s2
-/* DF6AC 80148FAC 00621825 */ or $v1, $v1, $v0
-/* DF6B0 80148FB0 ACA30000 */ sw $v1, ($a1)
-/* DF6B4 80148FB4 87C3000E */ lh $v1, 0xe($fp)
-/* DF6B8 80148FB8 87C4000A */ lh $a0, 0xa($fp)
-/* DF6BC 80148FBC 25420030 */ addiu $v0, $t2, 0x30
-/* DF6C0 80148FC0 AEE20000 */ sw $v0, ($s7)
-/* DF6C4 80148FC4 87C20010 */ lh $v0, 0x10($fp)
-/* DF6C8 80148FC8 00641821 */ addu $v1, $v1, $a0
-/* DF6CC 80148FCC 44831000 */ mtc1 $v1, $f2
-/* DF6D0 80148FD0 00000000 */ nop
-/* DF6D4 80148FD4 468010A0 */ cvt.s.w $f2, $f2
-/* DF6D8 80148FD8 25440038 */ addiu $a0, $t2, 0x38
-/* DF6DC 80148FDC 87C3000C */ lh $v1, 0xc($fp)
-/* DF6E0 80148FE0 46041082 */ mul.s $f2, $f2, $f4
-/* DF6E4 80148FE4 00000000 */ nop
-/* DF6E8 80148FE8 AEE40000 */ sw $a0, ($s7)
-/* DF6EC 80148FEC 00431021 */ addu $v0, $v0, $v1
-/* DF6F0 80148FF0 44820000 */ mtc1 $v0, $f0
-/* DF6F4 80148FF4 00000000 */ nop
-/* DF6F8 80148FF8 46800020 */ cvt.s.w $f0, $f0
-/* DF6FC 80148FFC 25420040 */ addiu $v0, $t2, 0x40
-/* DF700 80149000 46040002 */ mul.s $f0, $f0, $f4
-/* DF704 80149004 00000000 */ nop
-/* DF708 80149008 AEE20000 */ sw $v0, ($s7)
-/* DF70C 8014900C 4600128D */ trunc.w.s $f10, $f2
-/* DF710 80149010 44025000 */ mfc1 $v0, $f10
-/* DF714 80149014 00000000 */ nop
-/* DF718 80149018 30420FFF */ andi $v0, $v0, 0xfff
-/* DF71C 8014901C 00021300 */ sll $v0, $v0, 0xc
-/* DF720 80149020 4600028D */ trunc.w.s $f10, $f0
-/* DF724 80149024 44035000 */ mfc1 $v1, $f10
-/* DF728 80149028 00000000 */ nop
-/* DF72C 8014902C 30630FFF */ andi $v1, $v1, 0xfff
-/* DF730 80149030 00431025 */ or $v0, $v0, $v1
-/* DF734 80149034 ACA20004 */ sw $v0, 4($a1)
-/* DF738 80149038 3C02FD10 */ lui $v0, 0xfd10
-/* DF73C 8014903C AD420000 */ sw $v0, ($t2)
-/* DF740 80149040 3C02E800 */ lui $v0, 0xe800
-/* DF744 80149044 AD420008 */ sw $v0, 8($t2)
-/* DF748 80149048 3C020700 */ lui $v0, 0x700
-/* DF74C 8014904C AD420014 */ sw $v0, 0x14($t2)
-/* DF750 80149050 3C02E600 */ lui $v0, 0xe600
-/* DF754 80149054 AD420018 */ sw $v0, 0x18($t2)
-/* DF758 80149058 3C02F000 */ lui $v0, 0xf000
-/* DF75C 8014905C AD530004 */ sw $s3, 4($t2)
-/* DF760 80149060 AD40000C */ sw $zero, 0xc($t2)
-/* DF764 80149064 AD460010 */ sw $a2, 0x10($t2)
-/* DF768 80149068 AD40001C */ sw $zero, 0x1c($t2)
-/* DF76C 8014906C AD420020 */ sw $v0, 0x20($t2)
-/* DF770 80149070 AD470024 */ sw $a3, 0x24($t2)
-/* DF774 80149074 AD510028 */ sw $s1, 0x28($t2)
-/* DF778 80149078 AD40002C */ sw $zero, 0x2c($t2)
-/* DF77C 8014907C 8FAF0010 */ lw $t7, 0x10($sp)
-/* DF780 80149080 3C096464 */ lui $t1, 0x6464
-/* DF784 80149084 AD4F0030 */ sw $t7, 0x30($t2)
-/* DF788 80149088 AD480034 */ sw $t0, 0x34($t2)
-/* DF78C 8014908C 8FAF0014 */ lw $t7, 0x14($sp)
-/* DF790 80149090 352964FF */ ori $t1, $t1, 0x64ff
-/* DF794 80149094 AD4F0038 */ sw $t7, 0x38($t2)
-/* DF798 80149098 8FA200B0 */ lw $v0, 0xb0($sp)
-/* DF79C 8014909C 3C030C08 */ lui $v1, 0xc08
-/* DF7A0 801490A0 00431025 */ or $v0, $v0, $v1
-/* DF7A4 801490A4 AD42003C */ sw $v0, 0x3c($t2)
-/* DF7A8 801490A8 25420048 */ addiu $v0, $t2, 0x48
-/* DF7AC 801490AC AEE20000 */ sw $v0, ($s7)
-/* DF7B0 801490B0 AD540040 */ sw $s4, 0x40($t2)
-/* DF7B4 801490B4 AD490044 */ sw $t1, 0x44($t2)
-/* DF7B8 801490B8 8FAF0084 */ lw $t7, 0x84($sp)
-/* DF7BC 801490BC 240200FF */ addiu $v0, $zero, 0xff
-/* DF7C0 801490C0 15E20005 */ bne $t7, $v0, .L801490D8
-/* DF7C4 801490C4 3C04FC11 */ lui $a0, 0xfc11
-/* DF7C8 801490C8 34847E80 */ ori $a0, $a0, 0x7e80
-/* DF7CC 801490CC 3C03F5FF */ lui $v1, 0xf5ff
-/* DF7D0 801490D0 08052439 */ j .L801490E4
-/* DF7D4 801490D4 3463F438 */ ori $v1, $v1, 0xf438
-.L801490D8:
-/* DF7D8 801490D8 34843480 */ ori $a0, $a0, 0x3480
-/* DF7DC 801490DC 3C03F5FF */ lui $v1, 0xf5ff
-/* DF7E0 801490E0 3463FE38 */ ori $v1, $v1, 0xfe38
-.L801490E4:
-/* DF7E4 801490E4 25420050 */ addiu $v0, $t2, 0x50
-/* DF7E8 801490E8 AEE20000 */ sw $v0, ($s7)
-/* DF7EC 801490EC AD440048 */ sw $a0, 0x48($t2)
-/* DF7F0 801490F0 AD43004C */ sw $v1, 0x4c($t2)
-/* DF7F4 801490F4 3C03800A */ lui $v1, %hi(gMainGfxPos)
-/* DF7F8 801490F8 2463A66C */ addiu $v1, $v1, %lo(gMainGfxPos)
-/* DF7FC 801490FC 8C620000 */ lw $v0, ($v1)
-/* DF800 80149100 461ED002 */ mul.s $f0, $f26, $f30
-/* DF804 80149104 00000000 */ nop
-/* DF808 80149108 0040382D */ daddu $a3, $v0, $zero
-/* DF80C 8014910C 24420008 */ addiu $v0, $v0, 8
-/* DF810 80149110 AC620000 */ sw $v0, ($v1)
-/* DF814 80149114 8FAF0074 */ lw $t7, 0x74($sp)
-/* DF818 80149118 3C04F200 */ lui $a0, 0xf200
-/* DF81C 8014911C 25E30100 */ addiu $v1, $t7, 0x100
-/* DF820 80149120 00031880 */ sll $v1, $v1, 2
-/* DF824 80149124 4600028D */ trunc.w.s $f10, $f0
-/* DF828 80149128 44055000 */ mfc1 $a1, $f10
-/* DF82C 8014912C 00000000 */ nop
-/* DF830 80149130 00651821 */ addu $v1, $v1, $a1
-/* DF834 80149134 30630FFF */ andi $v1, $v1, 0xfff
-/* DF838 80149138 8FAF0078 */ lw $t7, 0x78($sp)
-/* DF83C 8014913C 00031B00 */ sll $v1, $v1, 0xc
-/* DF840 80149140 25E20100 */ addiu $v0, $t7, 0x100
-/* DF844 80149144 00021080 */ sll $v0, $v0, 2
-/* DF848 80149148 4600E28D */ trunc.w.s $f10, $f28
-/* DF84C 8014914C 44065000 */ mfc1 $a2, $f10
-/* DF850 80149150 00000000 */ nop
-/* DF854 80149154 00461021 */ addu $v0, $v0, $a2
-/* DF858 80149158 30420FFF */ andi $v0, $v0, 0xfff
-/* DF85C 8014915C 00441025 */ or $v0, $v0, $a0
-/* DF860 80149160 00621825 */ or $v1, $v1, $v0
-/* DF864 80149164 ACE30000 */ sw $v1, ($a3)
-/* DF868 80149168 8FAF007C */ lw $t7, 0x7c($sp)
-/* DF86C 8014916C 8FA20080 */ lw $v0, 0x80($sp)
-/* DF870 80149170 25E300FF */ addiu $v1, $t7, 0xff
-/* DF874 80149174 00031880 */ sll $v1, $v1, 2
-/* DF878 80149178 00651821 */ addu $v1, $v1, $a1
-/* DF87C 8014917C 30630FFF */ andi $v1, $v1, 0xfff
-/* DF880 80149180 00031B00 */ sll $v1, $v1, 0xc
-/* DF884 80149184 244200FF */ addiu $v0, $v0, 0xff
-/* DF888 80149188 00021080 */ sll $v0, $v0, 2
-/* DF88C 8014918C 00461021 */ addu $v0, $v0, $a2
-/* DF890 80149190 30420FFF */ andi $v0, $v0, 0xfff
-/* DF894 80149194 00621825 */ or $v1, $v1, $v0
-/* DF898 80149198 ACE30004 */ sw $v1, 4($a3)
-/* DF89C 8014919C 8FBF003C */ lw $ra, 0x3c($sp)
-/* DF8A0 801491A0 8FBE0038 */ lw $fp, 0x38($sp)
-/* DF8A4 801491A4 8FB70034 */ lw $s7, 0x34($sp)
-/* DF8A8 801491A8 8FB60030 */ lw $s6, 0x30($sp)
-/* DF8AC 801491AC 8FB5002C */ lw $s5, 0x2c($sp)
-/* DF8B0 801491B0 8FB40028 */ lw $s4, 0x28($sp)
-/* DF8B4 801491B4 8FB30024 */ lw $s3, 0x24($sp)
-/* DF8B8 801491B8 8FB20020 */ lw $s2, 0x20($sp)
-/* DF8BC 801491BC 8FB1001C */ lw $s1, 0x1c($sp)
-/* DF8C0 801491C0 8FB00018 */ lw $s0, 0x18($sp)
-/* DF8C4 801491C4 D7BE0068 */ ldc1 $f30, 0x68($sp)
-/* DF8C8 801491C8 D7BC0060 */ ldc1 $f28, 0x60($sp)
-/* DF8CC 801491CC D7BA0058 */ ldc1 $f26, 0x58($sp)
-/* DF8D0 801491D0 D7B80050 */ ldc1 $f24, 0x50($sp)
-/* DF8D4 801491D4 D7B60048 */ ldc1 $f22, 0x48($sp)
-/* DF8D8 801491D8 D7B40040 */ ldc1 $f20, 0x40($sp)
-/* DF8DC 801491DC 03E00008 */ jr $ra
-/* DF8E0 801491E0 27BD0070 */ addiu $sp, $sp, 0x70
diff --git a/ver/us/splat.yaml b/ver/us/splat.yaml
index cc295018e4..938959a1f9 100644
--- a/ver/us/splat.yaml
+++ b/ver/us/splat.yaml
@@ -839,7 +839,7 @@ segments:
- [0xDC470, c, dc470_len_14c0]
- [0xDD930, c, audio/ambience]
- [0xDDAF0, c, windows]
- - [0xDE740, c, de740_len_23f0]
+ - [0xDE740, c, sprite_shading]
- [0xDF950, c, audio/sfx]
- [0xE0B30, c, audio/e0b30_len_b80]
- [0xE16B0, .data, a5dd0_len_114e0]
@@ -6333,8 +6333,7 @@ segments:
- [0x3ED9E0, ia8, D_09001B80_3ED9E0, 128, 10]
- [0x3EDEE0, ia8, D_09002080_3EDEE0, 128, 10]
- [0x3EE3E0, ia8, D_09002580_3EE3E0, 128, 10]
- - [0x3EE8E0, ia8, world/text_end_of, 104, 20]
- - [0x3EF100, ia8, D_090032A0_3EF100, 104, 20]
+ - [0x3EE8E0, ia8, world/text_end_of, 104, 40]
- [0x3EF920, ia8, world/exclamation_point, 16, 40]
- [0x3EFBA0, ia8, world/ch1, 64, 64]
- [0x3F0BA0, ia8, world/ch2, 64, 64]