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]