Compare commits

...

64 Commits

Author SHA1 Message Date
03a578c1bb Update test snapshots for new cwextab 2025-11-18 22:29:42 -07:00
d09ef8e207 Version v3.4.1 2025-11-18 22:22:43 -07:00
63552a58ae Move copy button to first header row 2025-11-18 22:22:02 -07:00
827f4a42bd Upgrade all dependencies (incl. egui) 2025-11-18 22:21:46 -07:00
Franco M
b2dcecc5d8 Copy button (#271)
* Update diff.rs

* Fixes

* More fixes

* More fixes...

* Cargo fmt

* fmt

* Trim extra

* cargo +nightly fmt

* Update 'Copy ASM' button text to include emoji
2025-11-18 22:00:20 -07:00
Dávid Balatoni
67b237eab6 Adjust symbol name matching logic for GCC (#278)
* Adjust symbol name matching logic for GCC

* Turn $ and . into a list

* Fix borrow issue
2025-11-18 21:55:55 -07:00
Aetias
66da80ff69 arm: Fix .word not on 4-byte boundary (#282) 2025-11-18 21:55:40 -07:00
0a85f540f2 Version v3.4.0 2025-11-12 12:22:01 -07:00
Anghelo Carvajal
d79b5b1233 Update gnuv2_demangle to 0.4 (#280) 2025-11-09 11:53:02 -07:00
Anghelo Carvajal
8f5519cb6a Update gnuv2_demangle to version 0.3 (#275) 2025-10-12 21:19:07 -06:00
Aetias
19ec08be9a Update unarm to 2.0 (#274)
* Migrate to unarm 2.0

* Update unarm to proper 2.0 release

* Deduplicate formatters for opaque instruction parts in ARM

* Add option to enable VFPv2 for ARM

* Update unarm to 2.0.1

* Fix read order for big-endian Thumb code

* Skip leading space in ARM instruction params

* Update ARM tests

* arm.rs: Use `alloc::borrow::Cow`
2025-10-12 21:13:29 -06:00
2ad0898efa Version v3.3.1 2025-10-08 21:47:36 -06:00
Ethan Lafrenais
03f2bcb8b1 R_MIPS_GPREL32 Support (#270)
* R_MIPS_GPREL32 Support

* cargo fmt

* Add name for R_MIPS_GPREL32 relocation
2025-10-08 20:34:35 -06:00
BR-
781071761a show symbol size in symbol list (#268)
* show symbol size in symbol list

* configs for show symbol size

* move symbol size config to config-schema
2025-10-08 20:32:07 -06:00
572afa8551 Support IDO .mdebug for line numbers (#264)
* Support IDO .mdebug for line numbers

Resolves #179

* Fix wasm build && cargo clippy --fix

* Resolve review comment
2025-09-25 10:00:40 -06:00
90e81fad7e Improve ARM function size inference
This allows 2-byte padding to be trimmed in ARM functions.

Resolves #253
2025-09-25 00:26:43 -06:00
7a8efb4c88 Version v3.3.0 2025-09-23 13:09:57 -06:00
56dac46280 Support overriding diff options in project config (& for individual units) (#263)
* Support loading diff options from project config

* Support per-unit option overrides
2025-09-23 12:11:40 -06:00
1866158092 Add 'None' demangler option 2025-09-22 23:31:57 -06:00
Anghelo Carvajal
fe8e7029f6 Arch-independent demangling and add gnuv2_demangle for old g++ projects (#262) 2025-09-22 17:24:29 -06:00
Ethan Roseman
e2c70342c9 Standardize the values for invalid and data opcodes (#261)
* Standardize the value for an invalid opcode
>
> This makes it so that all arches share the same value for an invalid opcode, so platform-specific logic isn't needed for checking whether instructions are valid.
Also updated dependencies

* OPCODE_DATA too
2025-09-13 12:33:06 -06:00
Anghelo Carvajal
e6035b00df [MIPS] Add support for the other ABIs supported by rabbitizer (#259)
* [MIPS] Add support for the other abis supported by rabbitizer

* update test
2025-09-10 09:01:08 -06:00
97bcfe23d4 Update test snapshots 2025-09-08 22:40:51 -06:00
d684b622b5 Version v3.2.1 2025-09-08 22:37:02 -06:00
c698750068 Use dim color for address column in asm view 2025-09-08 22:32:52 -06:00
iFarbod
a06d3455ae Ignore extern differences in relocations (#258) 2025-09-08 21:41:53 -06:00
fbdaa89cc0 Refactor data diffing & expose WASM API (#256)
* Refactor data diffing & expose WASM API

* Update test snapshots
2025-09-07 18:59:46 -06:00
f7cb494a62 Version v3.1.1 2025-09-07 11:32:43 -06:00
iFarbod
7cc6ed2b43 Add support for x86 indirect tables (#251)
* Add support for x86 indirect tables

Closes #239

* Fix formatting issues in x86.rs

* Add x86 indirect table test
2025-09-07 11:28:23 -06:00
Toms
532b684682 Implement automatic symbol pairing for MSVC generated static functions (#255) 2025-09-07 11:28:01 -06:00
LagoLunatic
fb1d434bbc Version v3.1.0 2025-09-03 21:44:03 -04:00
LagoLunatic
23009bf9a3 Implement diffing individual data symbols (#244)
* Implement diffing individual data symbols

* Remove unused code for diffing sections

* Data diff view: Make rows show offset within the symbol, not within the section

* Remove SelectedSymbol enum as it only has a single variant now

* Create fake data section symbols to allow diffing entire sections again

* Fix text sections not having their size zeroed out

* Update test snapshots

* Clean up code for inferring section symbol size

* Fix bug where PPC pool references weren't ignoring section symbols

* Update comment

* Always add unique section symbols for data sections

* Update test snapshots

* Remove unnecessary clone in format! call

* Auto-start mapping for unpaired data symbols
2025-09-02 19:37:17 -06:00
Anghelo Carvajal
6fb4bb8855 [MIPS] Fix symbols being filtered out from target side of diff if target object contains .NON_MATCHING markers (#250)
* Fix filtering out symbols from the target side that have a symbol with the same name and a `.NON_MATCHING` suffix.

- Target side: Show all the symbols except the `.NON_MATCHING` ones.
- Base side: Ignore all the `.NON_MATCHING` symbols and also ignore the ones with the same name without the suffix

* fmt

* comment

* tests

* fmt tests

* maybe this could fix wasm?

* Fix wasm?

* fmt

* Move `DiffSide` to `diff` mod

* Update the stuff the advisories CI told me to
2025-09-02 19:13:29 -06:00
a138dfa907 Gracefully handle OOB in symbol_context/symbol_hover
Resolves decomp.me#1576
2025-09-02 19:11:07 -06:00
rjkiv
0b95613768 Hide certain symbols for X360 COFFs (#248)
* hide except_data symbols

* hide unwinds by default

* move COFF filters to obj/read.rs

* cargo fmt read.rs

* clippy moment

* clippy pls
2025-08-31 16:45:21 -06:00
5d4b33a500 Update README.md & config.schema.json 2025-08-30 23:56:46 -06:00
LagoLunatic
f2a591356e Improve automatic symbol pairing for nameless literals (#247)
* Improve automatic symbol pairing for nameless literals

* Fix data reloc diffing when the reloc points to an in-function static symbol

* Only pair up literals that match perfectly

* Clippy

* Do two separate passes when pairing up literals

* Fix partially-matching literal pairups not working right

* Remove duplicate $ splitting code

* Implement $ splitting for section names too

* Minor cleanup
2025-08-30 23:07:43 -06:00
8d24ec6373 Detect x86 instruction size differences
Check raw code length when instructions have same disassembly
but different encodings. Marks as OpMismatch to indicate
encoding difference.

Fixes #242
Fixes #233
2025-08-30 22:57:39 -06:00
58430d947b ci: Remove quotes from CARGO_ZIGBUILD_ZIG_PATH 2025-08-30 15:49:14 -06:00
1533125f9d Resolve objdiff-wasm clippy warnings 2025-08-30 15:02:10 -06:00
5654060dc8 ci: Use uv tool instead of venv 2025-08-30 15:02:10 -06:00
84079c3934 objdiff-wasm build improvements 2025-08-30 15:02:10 -06:00
LagoLunatic
48804dc2e3 Merge pull request #245 from LagoLunatic/subi
PPC pooled data references: Add support for `subi`, `addis`, and `subis` instructions
2025-08-23 18:05:47 -04:00
LagoLunatic
8cfa8b7dab Update default watch patterns to include more extensions (#246) 2025-08-23 15:37:34 -06:00
LagoLunatic
93a4d7e55d PPC pooled data references: Add support for subi, addis, and subis instructions 2025-08-23 16:37:57 -04:00
iFarbod
7c424a7966 Ignore switchD_ labels generated by Ghidra (#241)
Seeing how commonly used boricj's delinker extension is, it makes sense for this one to be included by default, before #238 is considered and worked on.
2025-08-19 10:23:07 -06:00
678210d58a Change file watcher log message to debug 2025-08-15 16:38:06 -06:00
4302821615 Fix Windows build 2025-08-15 16:31:33 -06:00
c4b4244b59 Version v3.0.0 2025-08-15 16:27:27 -06:00
52c138bf06 Add "ignore_patterns" option to config
This allows explicitly ignoring changes to certain
files or directories, even if the changed file ends
up matching `watch_patterns`. The default value,
`build/**/*` will ensure that changes in the build
directory will not trigger a duplicate rebuild.

Resolves #143
Resolves #215
2025-08-15 16:24:26 -06:00
813c8aa539 Add "Diff fill color" option to Appearance
Allows configuring the background color of
lines with a diff.

Resolves #230
2025-08-15 15:43:23 -06:00
0f0aaab795 Fix WSL path handling
Resolves #170
2025-08-15 15:34:58 -06:00
b21892be31 Add CLI args to objdiff-gui (incl. --project-dir/-p)
Resolves #41
Resolves #211
2025-08-15 15:25:55 -06:00
247d6da94b Restore extab diff view 2025-08-15 15:06:16 -06:00
bd95faa9c3 Remove objdiff-cli diff JSON output mode
This has been unimplemented since v3.0.0-alpha.1,
and I don't currently have plans to bring it back.
If you need it for something, please open an issue!
2025-08-15 14:57:34 -06:00
2c57e4960f Add ARM logic for inferred function size padding
Resolves #237
2025-08-15 14:48:26 -06:00
cff4be2979 Update gimli, object
Resolves #228
2025-08-15 14:47:06 -06:00
LagoLunatic
e1da90943c Version v3.0.0-beta.14 2025-08-13 01:45:05 -04:00
LagoLunatic
b5713db333 Update dependencies 2025-08-13 01:42:34 -04:00
LagoLunatic
4c3f5e9836 Merge pull request #236 from LagoLunatic/symbol-ctx
Fix context menu not appearing when right clicking the function name in the function diff view
2025-08-11 17:28:26 -04:00
LagoLunatic
e9ce02feb0 Disable double tooltip for elided function name in function diff view 2025-08-08 20:36:48 -04:00
LagoLunatic
9a378d85ed Fix context menu on function name in function diff view 2025-08-08 20:35:16 -04:00
LagoLunatic
c8ff45f2c8 Merge pull request #234 from LagoLunatic/no-diff-data
Fix data section not showing when there is no section on the other side
2025-08-08 20:32:28 -04:00
LagoLunatic
34e4513c69 Fix data section not showing when there is no section on the other side 2025-08-06 16:09:18 -04:00
97 changed files with 21870 additions and 3481 deletions

View File

@@ -36,9 +36,9 @@ jobs:
- name: Cache Rust workspace
uses: Swatinem/rust-cache@v2
- name: Cargo check
run: cargo check --all-targets --all-features
run: cargo check --all-targets --all-features --workspace
- name: Cargo clippy
run: cargo clippy --all-targets --all-features
run: cargo clippy --all-targets --all-features --workspace
fmt:
name: Format
@@ -92,7 +92,7 @@ jobs:
- name: Cache Rust workspace
uses: Swatinem/rust-cache@v2
- name: Cargo test
run: cargo test --release --features all
run: cargo test --release --all-features --workspace
build-cli:
name: Build objdiff-cli
@@ -146,13 +146,14 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install uv
if: matrix.build == 'zigbuild'
uses: astral-sh/setup-uv@v6
- name: Install cargo-zigbuild
if: matrix.build == 'zigbuild'
run: |
python3 -m venv .venv
. .venv/bin/activate
echo PATH=$PATH >> $GITHUB_ENV
pip install ziglang==0.13.0.post1 cargo-zigbuild==0.19.8
uv tool install cargo-zigbuild==0.20.1 --with-executables-from ziglang==0.15.1
echo "CARGO_ZIGBUILD_ZIG_PATH=$(uv tool dir)/cargo-zigbuild/bin/python-zig" >> $GITHUB_ENV
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
@@ -213,13 +214,14 @@ jobs:
sudo apt-get -y install ${{ matrix.packages }}
- name: Checkout
uses: actions/checkout@v4
- name: Install uv
if: matrix.build == 'zigbuild'
uses: astral-sh/setup-uv@v6
- name: Install cargo-zigbuild
if: matrix.build == 'zigbuild'
run: |
python3 -m venv .venv
. .venv/bin/activate
echo PATH=$PATH >> $GITHUB_ENV
pip install ziglang==0.13.0.post1 cargo-zigbuild==0.19.8
uv tool install cargo-zigbuild==0.20.1 --with-executables-from ziglang==0.15.1
echo "CARGO_ZIGBUILD_ZIG_PATH=$(uv tool dir)/cargo-zigbuild/bin/python-zig" >> $GITHUB_ENV
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:

View File

@@ -24,7 +24,7 @@ repos:
description: Run cargo clippy on all project files.
language: system
entry: cargo
args: ["+nightly", "clippy", "--all-targets", "--all-features"]
args: ["+nightly", "clippy", "--all-targets", "--all-features", "--workspace"]
pass_filenames: false
- id: cargo-deny
name: cargo deny

44
AGENTS.md Normal file
View File

@@ -0,0 +1,44 @@
# Repository Guidelines
## Project Structure & Module Organization
- `objdiff-core`: core library with diffing logic and shared components
- `objdiff-cli`: CLI/TUI with `ratatui`
- `objdiff-gui`: GUI with `eframe`/`egui`
- `objdiff-wasm`: WebAssembly bindings
objdiff has three main frontends: GUI, CLI/TUI, and [web](https://github.com/encounter/objdiff-web) (utilizing `objdiff-wasm`).
`objdiff-gui` is the most fully-featured and is the primary target for new features.
`objdiff-cli` has an interactive TUI `diff` mode (powered by `ratatui`) and a non-interactive `report` mode to generate detailed progress reports (e.g. for <https://decomp.dev>).
`objdiff-wasm` is compiled into a [WebAssembly Component](https://component-model.bytecodealliance.org/). The [API](objdiff-wasm/wit/objdiff.wit) is defined using [WIT](https://component-model.bytecodealliance.org/design/wit.html). The web interface is separate, but mirrors the GUI in functionality.
## Build, Test, and Development Commands
Run `cargo build` for a debug build and `cargo build --release` for an optimized build.
The CLI can be exercised with `cargo run --release --bin objdiff-cli -- --help`.
The WASM build is not included in the workspace by default due to differences in toolchain and target; build it with `npm -C objdiff-wasm run build`. (nightly required)
In general, do NOT use `--workspace`, as it will include the WASM crate and likely fail. Formatting and linting commands are exempt.
Pre-commit tasks:
- `cargo test` to run the test suite
- `cargo +nightly fmt --all` to format code (nightly required)
- `cargo +nightly clippy --all-targets --all-features --workspace -- -D warnings` to lint code (nightly required)
- `cargo deny check` (`cargo install --locked cargo-deny` if needed) if dependencies change
## Testing Guidelines
Favor focused unit tests adjacent to the code, and integration scenarios in `objdiff-core/tests`.
Integration tests utilize snapshots with the `insta` crate; run `curl -LsSf https://insta.rs/install.sh | sh` if needed.
To generate updated snapshots, use `cargo insta test`, review diffs manually, then accept changes with `cargo insta accept` (or simply `mv` to accept specific snapshots).
## Configuration Tips
- `config.schema.json`: JSON schema for the user-facing project config file (`objdiff.json`)
- `objdiff-core/config-schema.json`: Internal options schema to generate `DiffObjConfig` (see `objdiff-core/config_gen.rs`)
The project configuration (`objdiff.json`) is intended to be generated by the projects' build system. It includes paths to the target (expected) and base (current) object files, along with build commands and file watch patterns. See `README.md` for a summary of key options.

1913
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,18 +5,28 @@ members = [
"objdiff-gui",
"objdiff-wasm",
]
default-members = [
"objdiff-cli",
"objdiff-core",
"objdiff-gui",
# Exclude objdiff-wasm by default
]
resolver = "3"
[workspace.package]
version = "3.4.1"
authors = ["Luke Street <luke@street.dev>"]
edition = "2024"
license = "MIT OR Apache-2.0"
repository = "https://github.com/encounter/objdiff"
rust-version = "1.88"
[profile.release-lto]
inherits = "release"
lto = "fat"
strip = "debuginfo"
codegen-units = 1
[workspace.package]
version = "3.0.0-beta.13"
authors = ["Luke Street <luke@street.dev>"]
edition = "2024"
license = "MIT OR Apache-2.0"
repository = "https://github.com/encounter/objdiff"
rust-version = "1.88"
[profile.release-min]
inherits = "release-lto"
opt-level = "z"

141
README.md
View File

@@ -7,12 +7,14 @@ A local diffing tool for decompilation projects. Inspired by [decomp.me](https:/
Features:
- Compare entire object files: functions and data.
- Built-in symbol demangling for C++. (CodeWarrior, Itanium & MSVC)
- Automatic rebuild on source file changes.
- Project integration via [configuration file](#configuration).
- Search and filter all of a project's objects and quickly switch.
- Click to highlight all instances of values and registers.
- Compare entire object files: functions and data
- Built-in C++ symbol demangling (GCC, MSVC, CodeWarrior, Itanium)
- Automatic rebuild on source file changes
- Project integration via [configuration file](#configuration)
- Search and filter objects with quick switching
- Click-to-highlight values and registers
- Detailed progress reporting (powers [decomp.dev](https://decomp.dev))
- WebAssembly API, [web interface](https://github.com/encounter/objdiff-web) and [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=decomp-dev.objdiff) (WIP)
Supports:
@@ -40,7 +42,7 @@ For Linux and macOS, run `chmod +x objdiff-*` to make the binary executable.
### CLI
CLI binaries can be found on the [releases page](https://github.com/encounter/objdiff/releases).
CLI binaries are available on the [releases page](https://github.com/encounter/objdiff/releases).
## Screenshots
@@ -49,33 +51,30 @@ CLI binaries can be found on the [releases page](https://github.com/encounter/ob
## Usage
objdiff works by comparing two relocatable object files (`.o`). The objects are expected to have the same relative path
from the "target" and "base" directories.
objdiff compares two relocatable object files (`.o`). Here's how it works:
For example, if the target ("expected") object is located at `build/asm/MetroTRK/mslsupp.o` and the base ("actual")
object is located at `build/src/MetroTRK/mslsupp.o`, the following configuration would be used:
1. **Create an `objdiff.json` configuration file** in your project root (or generate it with your build script).
This file lists **all objects in the project** with their target ("expected") and base ("current") paths.
- Target build directory: `build/asm`
- Base build directory: `build/src`
- Object: `MetroTRK/mslsupp.o`
2. **Load the project** in objdiff.
objdiff will then execute the build system from the project directory to build both objects:
3. **Select an object** from the sidebar to begin diffing.
```sh
$ make build/asm/MetroTRK/mslsupp.o # Only if "Build target object" is enabled
$ make build/src/MetroTRK/mslsupp.o
```
4. **objdiff automatically:**
- Executes the build system to compile the base object (from current source code)
- Compares the two objects and displays the differences
- Watches for source file changes and rebuilds when detected
The objects will then be compared and the results will be displayed in the UI.
The configuration file allows complete flexibility in project structure - your build directories can have any layout as long as the paths are specified correctly.
See [Configuration](#configuration) for more information.
See [Configuration](#configuration) for setup details.
## Configuration
While **not required** (most settings can be specified in the UI), projects can add an `objdiff.json` file to configure the tool automatically. The configuration file must be located in
Projects can add an `objdiff.json` file to configure the tool automatically. The configuration file must be located in
the root project directory.
If your project has a generator script (e.g. `configure.py`), it's recommended to generate the objdiff configuration
If your project has a generator script (e.g. `configure.py`), it's highly recommended to generate the objdiff configuration
file as well. You can then add `objdiff.json` to your `.gitignore` to prevent it from being committed.
```json
@@ -90,22 +89,31 @@ file as well. You can then add `objdiff.json` to your `.gitignore` to prevent it
"build_base": true,
"watch_patterns": [
"*.c",
"*.cc",
"*.cp",
"*.cpp",
"*.cxx",
"*.c++",
"*.h",
"*.hh",
"*.hp",
"*.hpp",
"*.hxx",
"*.h++",
"*.pch",
"*.pch++",
"*.inc",
"*.s",
"*.S",
"*.asm",
"*.inc",
"*.py",
"*.yml",
"*.txt",
"*.json"
],
"ignore_patterns": [
"build/**/*"
],
"units": [
{
"name": "main/MetroTRK/mslsupp",
@@ -119,74 +127,69 @@ file as well. You can then add `objdiff.json` to your `.gitignore` to prevent it
### Schema
View [config.schema.json](config.schema.json) for all available options. The below list is a summary of the most important options.
> [!NOTE]
> View [config.schema.json](config.schema.json) for all available options. Below is a summary of the most important options.
`custom_make` _(optional)_: By default, objdiff will use `make` to build the project.
If the project uses a different build system (e.g. `ninja`), specify it here.
The build command will be `[custom_make] [custom_args] path/to/object.o`.
#### Build Configuration
`custom_args` _(optional)_: Additional arguments to pass to the build command prior to the object path.
**`custom_make`** _(optional, default: `"make"`)_
If the project uses a different build system (e.g. `ninja`), specify it here. The build command will be `[custom_make] [custom_args] path/to/object.o`.
`build_target`: If true, objdiff will tell the build system to build the target objects before diffing (e.g.
`make path/to/target.o`).
This is useful if the target objects are not built by default or can change based on project configuration or edits
to assembly files.
Requires the build system to be configured properly.
**`custom_args`** _(optional)_
Additional arguments to pass to the build command prior to the object path.
`build_base`: If true, objdiff will tell the build system to build the base objects before diffing (e.g. `make path/to/base.o`).
It's unlikely you'll want to disable this, unless you're using an external tool to rebuild the base object on source file changes.
**`build_target`** _(default: `false`)_
If true, objdiff will build the target objects before diffing (e.g. `make path/to/target.o`). Useful if target objects are not built by default or can change based on project configuration. Requires proper build system configuration.
`watch_patterns` _(optional)_: A list of glob patterns to watch for changes.
([Supported syntax](https://docs.rs/globset/latest/globset/#syntax))
If any of these files change, objdiff will automatically rebuild the objects and re-compare them.
If not specified, objdiff will use the default patterns listed above.
**`build_base`** _(default: `true`)_
If true, objdiff will build the base objects before diffing (e.g. `make path/to/base.o`). It's unlikely you'll want to disable this unless using an external tool to rebuild the base object.
`units` _(optional)_: If specified, objdiff will display a list of objects in the sidebar for easy navigation.
#### File Watching
> `name` _(optional)_: The name of the object in the UI. If not specified, the object's `path` will be used.
>
> `target_path`: Path to the "target" or "expected" object from the project root.
> This object is the **intended result** of the match.
>
> `base_path`: Path to the "base" or "actual" object from the project root.
> This object is built from the **current source code**.
>
> `metadata.auto_generated` _(optional)_: Hides the object from the object list, but still includes it in reports.
>
> `metadata.complete` _(optional)_: Marks the object as "complete" (or "linked") in the object list.
> This is useful for marking objects that are fully decompiled. A value of `false` will mark the object as "incomplete".
**`watch_patterns`** _(optional, default: listed above)_
A list of glob patterns to watch for changes ([supported syntax](https://docs.rs/globset/latest/globset/#syntax)). When these files change, objdiff automatically rebuilds and re-compares objects.
**`ignore_patterns`** _(optional, default: listed above)_
A list of glob patterns to explicitly ignore when watching for changes ([supported syntax](https://docs.rs/globset/latest/globset/#syntax)).
#### Units (Objects)
**`units`** _(optional)_
If specified, objdiff displays a list of objects in the sidebar for easy navigation. Each unit contains:
- **`name`** _(optional)_ - The display name in the UI. Defaults to the object's `path`.
- **`target_path`** _(optional)_ - Path to the "target" or "expected" object (the **intended result**).
- **`base_path`** _(optional)_ - Path to the "base" or "current" object (built from **current source code**). Omit if there is no source object yet.
- **`metadata.auto_generated`** _(optional)_ - Hides the object from the sidebar but includes it in progress reports.
- **`metadata.complete`** _(optional)_ - Marks the object as "complete" (linked) when `true` or "incomplete" when `false`.
## Building
Install Rust via [rustup](https://rustup.rs).
```shell
$ git clone https://github.com/encounter/objdiff.git
$ cd objdiff
$ cargo run --release
git clone https://github.com/encounter/objdiff.git
cd objdiff
cargo run --release
```
Or using `cargo install`.
Or install directly with cargo:
```shell
$ cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
```
The binaries will be installed to `~/.cargo/bin` as `objdiff` and `objdiff-cli`.
Binaries will be installed to `~/.cargo/bin` as `objdiff` and `objdiff-cli`.
## Installing `pre-commit`
## Contributing
When contributing, it's recommended to install `pre-commit` to automatically run the linter and formatter before a commit.
[`uv`](https://github.com/astral-sh/uv#installation) is recommended to manage Python version and tools.
Rust nightly is required for `cargo +nightly fmt` and `cargo +nightly clippy`.
Install `pre-commit` to run linting and formatting automatically:
```shell
$ cargo install --locked cargo-deny
$ rustup toolchain install nightly
$ uv tool install pre-commit
$ pre-commit install
rustup toolchain install nightly # Required for cargo fmt/clippy
cargo install --locked cargo-deny # https://github.com/EmbarkStudios/cargo-deny
uv tool install pre-commit # https://docs.astral.sh/uv, or use pipx or pip
pre-commit install
```
## License

View File

@@ -15,7 +15,7 @@
},
"custom_make": {
"type": "string",
"description": "By default, objdiff will use make to build the project.\nIf the project uses a different build system (e.g. ninja), specify it here.\nThe build command will be `[custom_make] [custom_args] path/to/object.o`.",
"description": "If the project uses a different build system (e.g. ninja), specify it here.\nThe build command will be `[custom_make] [custom_args] path/to/object.o`.",
"examples": [
"make",
"ninja"
@@ -41,39 +41,55 @@
},
"build_target": {
"type": "boolean",
"description": "If true, objdiff will tell the build system to build the target objects before diffing (e.g. `make path/to/target.o`).\nThis is useful if the target objects are not built by default or can change based on project configuration or edits to assembly files.\nRequires the build system to be configured properly.",
"description": "If true, objdiff will build the target objects before diffing (e.g. `make path/to/target.o`).\nUseful if target objects are not built by default or can change based on project configuration.\nRequires proper build system configuration.",
"default": false
},
"build_base": {
"type": "boolean",
"description": "If true, objdiff will tell the build system to build the base objects before diffing (e.g. `make path/to/base.o`).\nIt's unlikely you'll want to disable this, unless you're using an external tool to rebuild the base object on source file changes.",
"description": "If true, objdiff will build the base objects before diffing (e.g. `make path/to/base.o`).\nIt's unlikely you'll want to disable this unless using an external tool to rebuild the base object.",
"default": true
},
"watch_patterns": {
"type": "array",
"description": "List of glob patterns to watch for changes in the project.\nIf any of these files change, objdiff will automatically rebuild the objects and re-compare them.\nSupported syntax: https://docs.rs/globset/latest/globset/#syntax",
"description": "A list of glob patterns to watch for changes.\nWhen these files change, objdiff automatically rebuilds and re-compares objects.\nSupported syntax: https://docs.rs/globset/latest/globset/#syntax",
"items": {
"type": "string"
},
"default": [
"*.c",
"*.cc",
"*.cp",
"*.cpp",
"*.cxx",
"*.c++",
"*.h",
"*.hh",
"*.hp",
"*.hpp",
"*.hxx",
"*.h++",
"*.pch",
"*.pch++",
"*.inc",
"*.s",
"*.S",
"*.asm",
"*.inc",
"*.py",
"*.yml",
"*.txt",
"*.json"
]
},
"ignore_patterns": {
"type": "array",
"description": "A list of glob patterns to explicitly ignore when watching for changes.\nSupported syntax: https://docs.rs/globset/latest/globset/#syntax",
"items": {
"type": "string"
},
"default": [
"build/**/*"
]
},
"objects": {
"type": "array",
"description": "Use units instead.",
@@ -95,6 +111,25 @@
"items": {
"$ref": "#/$defs/progress_category"
}
},
"options": {
"type": "object",
"description": "Diff configuration options that should be applied automatically when the project is loaded.",
"additionalProperties": {
"oneOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
},
"examples": [
{
"demangler": "gnu_legacy"
}
]
}
},
"$defs": {
@@ -103,7 +138,7 @@
"properties": {
"name": {
"type": "string",
"description": "The name of the object in the UI. If not specified, the object's path will be used."
"description": "The display name in the UI. Defaults to the object's path."
},
"path": {
"type": "string",
@@ -112,11 +147,11 @@
},
"target_path": {
"type": "string",
"description": "Path to the target object from the project root.\nRequired if path is not specified."
"description": "Path to the \"target\" or \"expected\" object (the intended result)."
},
"base_path": {
"type": "string",
"description": "Path to the base object from the project root.\nRequired if path is not specified."
"description": "Path to the \"base\" or \"current\" object (built from current source code).\nOmit if there is no source object yet."
},
"reverse_fn_order": {
"type": "boolean",
@@ -140,6 +175,20 @@
"additionalProperties": {
"type": "string"
}
},
"options": {
"type": "object",
"description": "Diff configuration options that should be applied when this unit is active.",
"additionalProperties": {
"oneOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
}
}
}
},
@@ -191,7 +240,7 @@
"properties": {
"complete": {
"type": "boolean",
"description": "Marks the object as \"complete\" (or \"linked\") in the object list.\nThis is useful for marking objects that are fully decompiled. A value of `false` will mark the object as \"incomplete\"."
"description": "Marks the object as \"complete\" (linked) when `true` or \"incomplete\" when `false`."
},
"reverse_fn_order": {
"type": "boolean",
@@ -211,7 +260,7 @@
},
"auto_generated": {
"type": "boolean",
"description": "Hides the object from the object list by default, but still includes it in reports."
"description": "Hides the object from the sidebar but includes it in progress reports."
}
}
},

View File

@@ -74,6 +74,8 @@ ignore = [
#"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish
#{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" },
{ id = "RUSTSEC-2024-0436", reason = "Unmaintained paste crate is an indirect dependency" },
{ id = "RUSTSEC-2025-0052", reason = "Unmaintained async-std crate is an indirect dependency" },
{ id = "RUSTSEC-2025-0119", reason = "Unmaintained number_prefix crate is an indirect dependency" },
]
# If this is true, then cargo deny will use the git executable to fetch advisory database.
# If this is false, then it uses a built-in git library.
@@ -241,8 +243,8 @@ allow-git = []
[sources.allow-org]
# github.com organizations to allow git sources for
github = [
"enarx", # flagset
"encounter",
"gimli-rs", # gimli
]
# gitlab.com organizations to allow git sources for
gitlab = []

View File

@@ -16,19 +16,19 @@ publish = false
anyhow = "1.0"
argp = "0.4"
crossterm = "0.29"
enable-ansi-support = "0.2"
enable-ansi-support = "0.3"
memmap2 = "0.9"
objdiff-core = { path = "../objdiff-core", features = ["all"] }
prost = "0.14"
ratatui = "0.29"
rayon = "1.10"
rayon = "1.11"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
supports-color = "3.0"
time = { version = "0.3", features = ["formatting", "local-offset"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
typed-path = "0.11"
typed-path = "0.12"
[target.'cfg(target_env = "musl")'.dependencies]
mimalloc = "0.1"

View File

@@ -19,16 +19,16 @@ use crossterm::{
},
};
use objdiff_core::{
bindings::diff::DiffResult,
build::{
BuildConfig, BuildStatus,
watcher::{Watcher, create_watcher},
},
config::{
ProjectConfig, ProjectObject, ProjectObjectMetadata, build_globset,
ProjectConfig, ProjectObject, ProjectObjectMetadata, ProjectOptions, apply_project_options,
build_globset,
path::{check_path_buf, platform_path, platform_path_serde_option},
},
diff::{self, DiffObjConfig, MappingConfig, ObjectDiff},
diff::{DiffObjConfig, MappingConfig, ObjectDiff},
jobs::{
Job, JobQueue, JobResult,
objdiff::{ObjDiffConfig, start_build},
@@ -40,10 +40,7 @@ use typed_path::{Utf8PlatformPath, Utf8PlatformPathBuf};
use crate::{
cmd::apply_config_args,
util::{
output::{OutputFormat, write_output},
term::crossterm_panic_handler,
},
util::term::crossterm_panic_handler,
views::{EventControlFlow, EventResult, UiView, function_diff::FunctionDiffUi},
};
@@ -63,12 +60,6 @@ pub struct Args {
#[argp(option, short = 'u')]
/// Unit name within project
unit: Option<String>,
#[argp(option, short = 'o', from_str_fn(platform_path))]
/// Output file (one-shot mode) ("-" for stdout)
output: Option<Utf8PlatformPathBuf>,
#[argp(option)]
/// Output format (json, json-pretty, proto) (default: json)
format: Option<String>,
#[argp(positional)]
/// Function symbol to diff
symbol: Option<String>,
@@ -87,11 +78,11 @@ pub struct Args {
}
pub fn run(args: Args) -> Result<()> {
let (target_path, base_path, project_config) =
let (target_path, base_path, project_config, unit_options) =
match (&args.target, &args.base, &args.project, &args.unit) {
(Some(_), Some(_), None, None)
| (Some(_), None, None, None)
| (None, Some(_), None, None) => (args.target.clone(), args.base.clone(), None),
| (None, Some(_), None, None) => (args.target.clone(), args.base.clone(), None, None),
(None, None, p, u) => {
let project = match p {
Some(project) => project.clone(),
@@ -116,28 +107,32 @@ pub fn run(args: Args) -> Result<()> {
.base_dir
.as_ref()
.map(|p| project.join(p.with_platform_encoding()));
let objects = project_config
.units
let units = project_config.units.as_deref().unwrap_or_default();
let objects = units
.iter()
.flatten()
.map(|o| {
ObjectConfig::new(
o,
&project,
target_obj_dir.as_deref(),
base_obj_dir.as_deref(),
.enumerate()
.map(|(idx, o)| {
(
ObjectConfig::new(
o,
&project,
target_obj_dir.as_deref(),
base_obj_dir.as_deref(),
),
idx,
)
})
.collect::<Vec<_>>();
let object = if let Some(u) = u {
let (object, unit_idx) = if let Some(u) = u {
objects
.iter()
.find(|obj| obj.name == *u)
.find(|(obj, _)| obj.name == *u)
.map(|(obj, idx)| (obj, *idx))
.ok_or_else(|| anyhow!("Unit not found: {}", u))?
} else if let Some(symbol_name) = &args.symbol {
let mut idx = None;
let mut count = 0usize;
for (i, obj) in objects.iter().enumerate() {
for (i, (obj, unit_idx)) in objects.iter().enumerate() {
if obj
.target_path
.as_deref()
@@ -145,7 +140,7 @@ pub fn run(args: Args) -> Result<()> {
.transpose()?
.unwrap_or(false)
{
idx = Some(i);
idx = Some((i, *unit_idx));
count += 1;
if count > 1 {
break;
@@ -154,7 +149,7 @@ pub fn run(args: Args) -> Result<()> {
}
match (count, idx) {
(0, None) => bail!("Symbol not found: {}", symbol_name),
(1, Some(i)) => &objects[i],
(1, Some((i, unit_idx))) => (&objects[i].0, unit_idx),
(2.., Some(_)) => bail!(
"Multiple instances of {} were found, try specifying a unit",
symbol_name
@@ -164,22 +159,29 @@ pub fn run(args: Args) -> Result<()> {
} else {
bail!("Must specify one of: symbol, project and unit, target and base objects")
};
let unit_options = units.get(unit_idx).and_then(|u| u.options().cloned());
let target_path = object.target_path.clone();
let base_path = object.base_path.clone();
(target_path, base_path, Some(project_config))
(target_path, base_path, Some(project_config), unit_options)
}
_ => bail!("Either target and base or project and unit must be specified"),
};
if let Some(output) = &args.output {
run_oneshot(&args, output, target_path.as_deref(), base_path.as_deref())
} else {
run_interactive(args, target_path, base_path, project_config)
}
run_interactive(args, target_path, base_path, project_config, unit_options)
}
fn build_config_from_args(args: &Args) -> Result<(DiffObjConfig, MappingConfig)> {
fn build_config_from_args(
args: &Args,
project_config: Option<&ProjectConfig>,
unit_options: Option<&ProjectOptions>,
) -> Result<(DiffObjConfig, MappingConfig)> {
let mut diff_config = DiffObjConfig::default();
if let Some(options) = project_config.and_then(|config| config.options.as_ref()) {
apply_project_options(&mut diff_config, options)?;
}
if let Some(options) = unit_options {
apply_project_options(&mut diff_config, options)?;
}
apply_config_args(&mut diff_config, &args.config)?;
let mut mapping_config = MappingConfig {
mappings: Default::default(),
@@ -194,28 +196,6 @@ fn build_config_from_args(args: &Args) -> Result<(DiffObjConfig, MappingConfig)>
Ok((diff_config, mapping_config))
}
fn run_oneshot(
args: &Args,
output: &Utf8PlatformPath,
target_path: Option<&Utf8PlatformPath>,
base_path: Option<&Utf8PlatformPath>,
) -> Result<()> {
let output_format = OutputFormat::from_option(args.format.as_deref())?;
let (diff_config, mapping_config) = build_config_from_args(args)?;
let target = target_path
.map(|p| obj::read::read(p.as_ref(), &diff_config).with_context(|| format!("Loading {p}")))
.transpose()?;
let base = base_path
.map(|p| obj::read::read(p.as_ref(), &diff_config).with_context(|| format!("Loading {p}")))
.transpose()?;
let result =
diff::diff_objs(target.as_ref(), base.as_ref(), None, &diff_config, &mapping_config)?;
let left = target.as_ref().and_then(|o| result.left.as_ref().map(|d| (o, d)));
let right = base.as_ref().and_then(|o| result.right.as_ref().map(|d| (o, d)));
write_output(&DiffResult::new(left, right), Some(output), output_format)?;
Ok(())
}
pub struct AppState {
pub jobs: JobQueue,
pub waker: Arc<TermWaker>,
@@ -352,11 +332,13 @@ fn run_interactive(
target_path: Option<Utf8PlatformPathBuf>,
base_path: Option<Utf8PlatformPathBuf>,
project_config: Option<ProjectConfig>,
unit_options: Option<ProjectOptions>,
) -> Result<()> {
let Some(symbol_name) = &args.symbol else { bail!("Interactive mode requires a symbol name") };
let time_format = time::format_description::parse_borrowed::<2>("[hour]:[minute]:[second]")
.context("Failed to parse time format")?;
let (diff_obj_config, mapping_config) = build_config_from_args(&args)?;
let (diff_obj_config, mapping_config) =
build_config_from_args(&args, project_config.as_ref(), unit_options.as_ref())?;
let mut state = AppState {
jobs: Default::default(),
waker: Default::default(),
@@ -378,10 +360,12 @@ fn run_interactive(
};
if let (Some(project_dir), Some(project_config)) = (&state.project_dir, &state.project_config) {
let watch_patterns = project_config.build_watch_patterns()?;
let ignore_patterns = project_config.build_ignore_patterns()?;
state.watcher = Some(create_watcher(
state.modified.clone(),
project_dir.as_ref(),
build_globset(&watch_patterns)?,
build_globset(&ignore_patterns)?,
Waker::from(state.waker.clone()),
)?);
}

View File

@@ -7,9 +7,9 @@ use objdiff_core::{
ChangeItem, ChangeItemInfo, ChangeUnit, Changes, ChangesInput, Measures, REPORT_VERSION,
Report, ReportCategory, ReportItem, ReportItemMetadata, ReportUnit, ReportUnitMetadata,
},
config::path::platform_path,
diff, obj,
obj::{SectionKind, SymbolFlag},
config::{ProjectObject, ProjectOptions, apply_project_options, path::platform_path},
diff,
obj::{self, SectionKind, SymbolFlag, SymbolKind},
};
use prost::Message;
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
@@ -83,14 +83,13 @@ pub fn run(args: Args) -> Result<()> {
}
fn generate(args: GenerateArgs) -> Result<()> {
let mut diff_config = diff::DiffObjConfig {
let base_diff_config = diff::DiffObjConfig {
function_reloc_diffs: diff::FunctionRelocDiffs::None,
combine_data_sections: true,
combine_text_sections: true,
ppc_calculate_pool_relocations: false,
..Default::default()
};
apply_config_args(&mut diff_config, &args.config)?;
let output_format = OutputFormat::from_option(args.format.as_deref())?;
let project_dir = args.project.as_deref().unwrap_or_else(|| Utf8PlatformPath::new("."));
@@ -101,31 +100,44 @@ fn generate(args: GenerateArgs) -> Result<()> {
Some((Err(err), _)) => bail!("Failed to load project configuration: {}", err),
None => bail!("No project configuration found"),
};
info!(
"Generating report for {} units (using {} threads)",
project.units().len(),
if args.deduplicate { 1 } else { rayon::current_num_threads() }
);
let target_obj_dir =
project.target_dir.as_ref().map(|p| project_dir.join(p.with_platform_encoding()));
let base_obj_dir =
project.base_dir.as_ref().map(|p| project_dir.join(p.with_platform_encoding()));
let objects = project
.units
let project_units = project.units.as_deref().unwrap_or_default();
let objects = project_units
.iter()
.flatten()
.map(|o| {
ObjectConfig::new(o, project_dir, target_obj_dir.as_deref(), base_obj_dir.as_deref())
.enumerate()
.map(|(idx, o)| {
(
ObjectConfig::new(
o,
project_dir,
target_obj_dir.as_deref(),
base_obj_dir.as_deref(),
),
idx,
)
})
.collect::<Vec<_>>();
info!(
"Generating report for {} units (using {} threads)",
objects.len(),
if args.deduplicate { 1 } else { rayon::current_num_threads() }
);
let start = Instant::now();
let mut units = vec![];
let mut existing_functions: HashSet<String> = HashSet::new();
if args.deduplicate {
// If deduplicating, we need to run single-threaded
for object in &objects {
for (object, unit_idx) in &objects {
let diff_config = build_unit_diff_config(
&base_diff_config,
project.options.as_ref(),
project_units.get(*unit_idx).and_then(ProjectObject::options),
&args.config,
)?;
if let Some(unit) = report_object(object, &diff_config, Some(&mut existing_functions))?
{
units.push(unit);
@@ -134,7 +146,15 @@ fn generate(args: GenerateArgs) -> Result<()> {
} else {
let vec = objects
.par_iter()
.map(|object| report_object(object, &diff_config, None))
.map(|(object, unit_idx)| {
let diff_config = build_unit_diff_config(
&base_diff_config,
project.options.as_ref(),
project_units.get(*unit_idx).and_then(ProjectObject::options),
&args.config,
)?;
report_object(object, &diff_config, None)
})
.collect::<Result<Vec<Option<ReportUnit>>>>()?;
units = vec.into_iter().flatten().collect();
}
@@ -156,6 +176,24 @@ fn generate(args: GenerateArgs) -> Result<()> {
Ok(())
}
fn build_unit_diff_config(
base: &diff::DiffObjConfig,
project_options: Option<&ProjectOptions>,
unit_options: Option<&ProjectOptions>,
cli_args: &[String],
) -> Result<diff::DiffObjConfig> {
let mut diff_config = base.clone();
if let Some(options) = project_options {
apply_project_options(&mut diff_config, options)?;
}
if let Some(options) = unit_options {
apply_project_options(&mut diff_config, options)?;
}
// CLI args override project and unit options
apply_config_args(&mut diff_config, cli_args)?;
Ok(diff_config)
}
fn report_object(
object: &ObjectConfig,
diff_config: &diff::DiffObjConfig,
@@ -177,14 +215,16 @@ fn report_object(
.target_path
.as_ref()
.map(|p| {
obj::read::read(p.as_ref(), diff_config).with_context(|| format!("Failed to open {p}"))
obj::read::read(p.as_ref(), diff_config, diff::DiffSide::Target)
.with_context(|| format!("Failed to open {p}"))
})
.transpose()?;
let base = object
.base_path
.as_ref()
.map(|p| {
obj::read::read(p.as_ref(), diff_config).with_context(|| format!("Failed to open {p}"))
obj::read::read(p.as_ref(), diff_config, diff::DiffSide::Base)
.with_context(|| format!("Failed to open {p}"))
})
.transpose()?;
let result =
@@ -245,6 +285,7 @@ fn report_object(
|| symbol.size == 0
|| symbol.flags.contains(SymbolFlag::Hidden)
|| symbol.flags.contains(SymbolFlag::Ignored)
|| symbol.kind == SymbolKind::Section
{
continue;
}

View File

@@ -378,7 +378,6 @@ impl UiView for FunctionDiffUi {
}
// Reload
KeyCode::Char('r') => {
result.redraw = true;
return EventControlFlow::Reload;
}
// Scroll right
@@ -400,7 +399,6 @@ impl UiView for FunctionDiffUi {
FunctionRelocDiffs::DataValue => FunctionRelocDiffs::All,
FunctionRelocDiffs::All => FunctionRelocDiffs::None,
};
result.redraw = true;
return EventControlFlow::Reload;
}
// Toggle three-way diff

View File

@@ -41,7 +41,8 @@ any-arch = [
"dep:regex",
"dep:similar",
"dep:syn",
"dep:encoding_rs"
"dep:encoding_rs",
"demangler",
]
bindings = [
"dep:prost",
@@ -88,38 +89,37 @@ std = [
]
mips = [
"any-arch",
"dep:cpp_demangle",
"dep:cwdemangle",
"dep:rabbitizer",
]
ppc = [
"any-arch",
"dep:cwdemangle",
"dep:cwextab",
"dep:powerpc",
"dep:rlwinmdec",
]
x86 = [
"any-arch",
"dep:cpp_demangle",
"dep:iced-x86",
"dep:msvc-demangler",
]
arm = [
"any-arch",
"dep:arm-attr",
"dep:cpp_demangle",
"dep:unarm",
]
arm64 = [
"any-arch",
"dep:cpp_demangle",
"dep:yaxpeax-arch",
"dep:yaxpeax-arm",
]
superh = [
"any-arch",
]
demangler = [
"dep:cpp_demangle",
"dep:cwdemangle",
"dep:gnuv2_demangle",
"dep:msvc-demangler",
]
[package.metadata.docs.rs]
features = ["all"]
@@ -132,13 +132,13 @@ itertools = { version = "0.14", default-features = false, features = ["use_alloc
log = { version = "0.4", default-features = false, optional = true }
memmap2 = { version = "0.9", optional = true }
num-traits = { version = "0.2", default-features = false, optional = true }
object = { git = "https://github.com/gimli-rs/object", rev = "16ff70aa6fbd97d6bb7b92375929f4d72414c32b", default-features = false, features = ["read_core", "elf", "coff"] }
object = { version = "0.37", default-features = false, features = ["read_core", "elf", "coff"] }
pbjson = { version = "0.8", default-features = false, optional = true }
prost = { version = "0.14", default-features = false, features = ["derive"], optional = true }
regex = { version = "1.11", default-features = false, features = [], optional = true }
regex = { version = "1.12", default-features = false, features = [], optional = true }
serde = { version = "1.0", default-features = false, features = ["derive"], optional = true }
similar = { version = "2.7", default-features = false, features = ["hashbrown"], optional = true, git = "https://github.com/encounter/similar.git", branch = "no_std" }
typed-path = { version = "0.11", default-features = false, optional = true }
similar = { git = "https://github.com/encounter/similar.git", branch = "no_std", default-features = false, features = ["hashbrown"], optional = true }
typed-path = { version = "0.12", default-features = false, optional = true }
# config
globset = { version = "0.4", default-features = false, optional = true }
@@ -146,25 +146,22 @@ semver = { version = "1.0", default-features = false, optional = true }
serde_json = { version = "1.0", default-features = false, features = ["alloc"], optional = true }
# dwarf
gimli = { version = "0.32", default-features = false, features = ["read"], optional = true }
gimli = { git = "https://github.com/gimli-rs/gimli", rev = "7335f00e7c39fd501511584fefb0ba974117c950", default-features = false, features = ["read"], optional = true }
typed-arena = { version = "2.0", default-features = false, optional = true }
# ppc
cwdemangle = { version = "1.0", optional = true }
cwextab = { version = "1.1", optional = true }
powerpc = { version = "0.4", optional = true }
rlwinmdec = { version = "1.1", optional = true }
# mips
rabbitizer = { version = "2.0.0-alpha.4", default-features = false, features = ["all_extensions"], optional = true }
rabbitizer = { version = "2.0.0-alpha.7", default-features = false, features = ["all_extensions"], optional = true }
# x86
cpp_demangle = { version = "0.4", default-features = false, features = ["alloc"], optional = true }
iced-x86 = { version = "1.21", default-features = false, features = ["decoder", "intel", "gas", "masm", "nasm", "exhaustive_enums", "no_std"], optional = true }
msvc-demangler = { version = "0.11", optional = true }
# arm
unarm = { version = "1.9", optional = true }
unarm = { version = "2.1", optional = true }
arm-attr = { version = "0.2", optional = true }
# arm64
@@ -172,13 +169,19 @@ yaxpeax-arch = { version = "0.3", default-features = false, optional = true }
yaxpeax-arm = { version = "0.3", default-features = false, optional = true }
# build
notify = { version = "8.1.0", optional = true }
notify-debouncer-full = { version = "0.5.0", optional = true }
notify = { version = "8.2.0", optional = true }
notify-debouncer-full = { version = "0.6.0", optional = true }
shell-escape = { version = "0.1", optional = true }
tempfile = { version = "3.20", optional = true }
tempfile = { version = "3.23", optional = true }
time = { version = "0.3", optional = true }
encoding_rs = { version = "0.8.35", optional = true }
# demangler
cpp_demangle = { version = "0.5", optional = true, default-features = false, features = ["alloc"] }
cwdemangle = { version = "1.0", optional = true }
gnuv2_demangle = { version = "0.4", optional = true }
msvc-demangler = { version = "0.11", optional = true }
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", optional = true, features = ["winbase"] }

View File

@@ -25,6 +25,42 @@
}
]
},
{
"id": "demangler",
"type": "choice",
"default": "auto",
"name": "Demangler",
"description": "Which demangler should be used to demangle each symbol.",
"items": [
{
"value": "auto",
"name": "Auto",
"description": "Try to automatically guess the mangling format."
},
{
"value": "none",
"name": "None",
"description": "Disable demangling."
},
{
"value": "codewarrior",
"name": "CodeWarrior"
},
{
"value": "itanium",
"name": "Itanium"
},
{
"value": "msvc",
"name": "MSVC"
},
{
"value": "gnu_legacy",
"name": "GNU g++ (Legacy)",
"description": "Use the old GNU mangling ABI. Used up to g++ 2.9.x"
}
]
},
{
"id": "analyzeDataFlow",
"type": "boolean",
@@ -46,6 +82,27 @@
"name": "Space between args",
"description": "Adds a space between arguments in the diff output."
},
{
"id": "showSymbolSizes",
"type": "choice",
"default": "off",
"name": "Show symbol sizes",
"description": "Shows symbol sizes in the symbol view.",
"items": [
{
"value": "off",
"name": "Off"
},
{
"value": "hex",
"name": "Hex"
},
{
"value": "decimal",
"name": "Decimal"
}
]
},
{
"id": "combineDataSections",
"type": "boolean",
@@ -71,20 +128,43 @@
"value": "auto",
"name": "Auto"
},
{
"value": "v4",
"name": "ARMv4"
},
{
"value": "v4t",
"name": "ARMv4T (GBA)"
},
{
"value": "v5t",
"name": "ARMv5T"
},
{
"value": "v5te",
"name": "ARMv5TE (DS)"
},
{
"value": "v5tej",
"name": "ARMv5TEJ"
},
{
"value": "v6",
"name": "ARMv6"
},
{
"value": "v6k",
"name": "ARMv6K (3DS)"
}
]
},
{
"id": "arm.vfpV2",
"type": "boolean",
"default": true,
"name": "VFPv2 instructions",
"description": "Adds floating-point instructions from VFPv2."
},
{
"id": "arm.unifiedSyntax",
"type": "boolean",
@@ -158,6 +238,10 @@
"value": "o32",
"name": "O32"
},
{
"value": "o64",
"name": "O64"
},
{
"value": "n32",
"name": "N32"
@@ -165,6 +249,14 @@
{
"value": "n64",
"name": "N64"
},
{
"value": "eabi32",
"name": "eabi32"
},
{
"value": "eabi64",
"name": "eabi64"
}
]
},
@@ -247,6 +339,8 @@
"name": "General",
"properties": [
"functionRelocDiffs",
"demangler",
"showSymbolSizes",
"spaceBetweenArgs",
"combineDataSections",
"combineTextSections"
@@ -257,6 +351,7 @@
"name": "ARM",
"properties": [
"arm.archVersion",
"arm.vfpV2",
"arm.unifiedSyntax",
"arm.avRegisters",
"arm.r9Usage",
@@ -268,26 +363,17 @@
{
"id": "mips",
"name": "MIPS",
"properties": [
"mips.abi",
"mips.instrCategory",
"mips.registerPrefix"
]
"properties": ["mips.abi", "mips.instrCategory", "mips.registerPrefix"]
},
{
"id": "ppc",
"name": "PowerPC",
"properties": [
"ppc.calculatePoolRelocations",
"analyzeDataFlow"
]
"properties": ["ppc.calculatePoolRelocations", "analyzeDataFlow"]
},
{
"id": "x86",
"name": "x86",
"properties": [
"x86.formatter"
]
"properties": ["x86.formatter"]
}
]
}

View File

@@ -1,165 +0,0 @@
syntax = "proto3";
package objdiff.diff;
// A symbol
message Symbol {
// Name of the symbol
string name = 1;
// Demangled name of the symbol
optional string demangled_name = 2;
// Symbol address
uint64 address = 3;
// Symbol size
uint64 size = 4;
// Bitmask of SymbolFlag
uint32 flags = 5;
}
// Symbol visibility flags
enum SymbolFlag {
SYMBOL_NONE = 0;
SYMBOL_GLOBAL = 1;
SYMBOL_LOCAL = 2;
SYMBOL_WEAK = 4;
SYMBOL_COMMON = 8;
SYMBOL_HIDDEN = 16;
}
// A single parsed instruction
message Instruction {
// Instruction address
uint64 address = 1;
// Instruction size
uint32 size = 2;
// Instruction opcode
uint32 opcode = 3;
// Instruction mnemonic
string mnemonic = 4;
// Instruction formatted string
string formatted = 5;
// Original (unsimplified) instruction string
optional string original = 6;
// Instruction arguments
repeated Argument arguments = 7;
// Instruction relocation
optional Relocation relocation = 8;
// Instruction branch destination
optional uint64 branch_dest = 9;
// Instruction line number
optional uint32 line_number = 10;
}
// An instruction argument
message Argument {
oneof value {
// Plain text
string plain_text = 1;
// Value
ArgumentValue argument = 2;
// Relocation
ArgumentRelocation relocation = 3;
// Branch destination
uint64 branch_dest = 4;
}
}
// An instruction argument value
message ArgumentValue {
oneof value {
// Signed integer
int64 signed = 1;
// Unsigned integer
uint64 unsigned = 2;
// Opaque value
string opaque = 3;
}
}
// Marker type for relocation arguments
message ArgumentRelocation {
}
message Relocation {
uint32 type = 1;
string type_name = 2;
RelocationTarget target = 3;
}
message RelocationTarget {
uint32 symbol_index = 1;
int64 addend = 2;
}
message InstructionDiffRow {
DiffKind diff_kind = 1;
optional Instruction instruction = 2;
optional InstructionBranchFrom branch_from = 3;
optional InstructionBranchTo branch_to = 4;
repeated ArgumentDiff arg_diff = 5;
}
message ArgumentDiff {
optional uint32 diff_index = 1;
}
enum DiffKind {
DIFF_NONE = 0;
DIFF_REPLACE = 1;
DIFF_DELETE = 2;
DIFF_INSERT = 3;
DIFF_OP_MISMATCH = 4;
DIFF_ARG_MISMATCH = 5;
}
message InstructionBranchFrom {
repeated uint32 instruction_index = 1;
uint32 branch_index = 2;
}
message InstructionBranchTo {
uint32 instruction_index = 1;
uint32 branch_index = 2;
}
message SymbolDiff {
Symbol symbol = 1;
repeated InstructionDiffRow instruction_rows = 2;
optional float match_percent = 3;
// The symbol index in the _other_ object that this symbol was diffed against
optional uint32 target_symbol = 5;
}
message DataDiff {
DiffKind kind = 1;
bytes data = 2;
// May be larger than data
uint64 size = 3;
}
message SectionDiff {
string name = 1;
SectionKind kind = 2;
uint64 size = 3;
uint64 address = 4;
reserved 5;
repeated DataDiff data = 6;
optional float match_percent = 7;
}
enum SectionKind {
SECTION_UNKNOWN = 0;
SECTION_TEXT = 1;
SECTION_DATA = 2;
SECTION_BSS = 3;
}
message ObjectDiff {
repeated SectionDiff sections = 1;
repeated SymbolDiff symbols = 2;
}
message DiffResult {
optional ObjectDiff left = 1;
optional ObjectDiff right = 2;
}

View File

@@ -1,21 +1,17 @@
use alloc::{
collections::BTreeMap,
format,
string::{String, ToString},
vec::Vec,
};
use alloc::{borrow::Cow, collections::BTreeMap, vec::Vec};
use core::fmt::Write;
use anyhow::{Result, bail};
use arm_attr::{BuildAttrs, enums::CpuArch, tag::Tag};
use object::{Endian as _, Object as _, ObjectSection as _, ObjectSymbol as _, elf};
use unarm::{args, arm, thumb};
use unarm::FormatValue as _;
use crate::{
arch::{Arch, RelocationOverride, RelocationOverrideTarget},
arch::{Arch, OPCODE_DATA, OPCODE_INVALID, RelocationOverride, RelocationOverrideTarget},
diff::{ArmArchVersion, ArmR9Usage, DiffObjConfig, display::InstructionPart},
obj::{
InstructionRef, Relocation, RelocationFlags, ResolvedInstructionRef, ResolvedRelocation,
Section, SectionKind, Symbol, SymbolFlag, SymbolFlagSet, SymbolKind,
InstructionRef, Relocation, RelocationFlags, ResolvedInstructionRef, Section, SectionKind,
Symbol, SymbolFlag, SymbolFlagSet, SymbolKind,
},
};
@@ -23,7 +19,7 @@ use crate::{
pub struct ArchArm {
/// Maps section index, to list of disasm modes (arm, thumb or data) sorted by address
disasm_modes: BTreeMap<usize, Vec<DisasmMode>>,
detected_version: Option<unarm::ArmVersion>,
detected_version: Option<unarm::Version>,
endianness: object::Endianness,
}
@@ -41,7 +37,7 @@ impl ArchArm {
}
}
fn elf_detect_arm_version(file: &object::File) -> Result<Option<unarm::ArmVersion>> {
fn elf_detect_arm_version(file: &object::File) -> Result<Option<unarm::Version>> {
// Check ARM attributes
if let Some(arm_attrs) = file.sections().find(|s| {
s.kind() == object::SectionKind::Elf(elf::SHT_ARM_ATTRIBUTES)
@@ -62,9 +58,12 @@ impl ArchArm {
if let Tag::CpuArch(cpu_arch) = tag { Some(cpu_arch) } else { None }
});
match cpu_arch {
Some(CpuArch::V4T) => return Ok(Some(unarm::ArmVersion::V4T)),
Some(CpuArch::V5TE) => return Ok(Some(unarm::ArmVersion::V5Te)),
Some(CpuArch::V6K) => return Ok(Some(unarm::ArmVersion::V6K)),
Some(CpuArch::V4) => return Ok(Some(unarm::Version::V4)),
Some(CpuArch::V4T) => return Ok(Some(unarm::Version::V4T)),
Some(CpuArch::V5TE) => return Ok(Some(unarm::Version::V5Te)),
Some(CpuArch::V5TEJ) => return Ok(Some(unarm::Version::V5Tej)),
Some(CpuArch::V6) => return Ok(Some(unarm::Version::V6)),
Some(CpuArch::V6K) => return Ok(Some(unarm::Version::V6K)),
Some(arch) => bail!("ARM arch {} not supported", arch),
None => {}
};
@@ -94,31 +93,33 @@ impl ArchArm {
.collect()
}
fn parse_flags(&self, diff_config: &DiffObjConfig) -> unarm::ParseFlags {
unarm::ParseFlags {
ual: diff_config.arm_unified_syntax,
version: match diff_config.arm_arch_version {
ArmArchVersion::Auto => self.detected_version.unwrap_or(unarm::ArmVersion::V5Te),
ArmArchVersion::V4t => unarm::ArmVersion::V4T,
ArmArchVersion::V5te => unarm::ArmVersion::V5Te,
ArmArchVersion::V6k => unarm::ArmVersion::V6K,
},
fn unarm_options(&self, diff_config: &DiffObjConfig) -> unarm::Options {
let mut extensions = unarm::Extensions::none();
if diff_config.arm_vfp_v2 {
extensions = extensions.with(unarm::Extension::VfpV2);
}
}
fn display_options(&self, diff_config: &DiffObjConfig) -> unarm::DisplayOptions {
unarm::DisplayOptions {
reg_names: unarm::RegNames {
av_registers: diff_config.arm_av_registers,
r9_use: match diff_config.arm_r9_usage {
ArmR9Usage::GeneralPurpose => unarm::R9Use::GeneralPurpose,
ArmR9Usage::Sb => unarm::R9Use::Pid,
ArmR9Usage::Tr => unarm::R9Use::Tls,
},
explicit_stack_limit: diff_config.arm_sl_usage,
frame_pointer: diff_config.arm_fp_usage,
ip: diff_config.arm_ip_usage,
unarm::Options {
version: match diff_config.arm_arch_version {
ArmArchVersion::Auto => self.detected_version.unwrap_or(unarm::Version::V5Te),
ArmArchVersion::V4 => unarm::Version::V4,
ArmArchVersion::V4t => unarm::Version::V4T,
ArmArchVersion::V5t => unarm::Version::V5T,
ArmArchVersion::V5te => unarm::Version::V5Te,
ArmArchVersion::V5tej => unarm::Version::V5Tej,
ArmArchVersion::V6 => unarm::Version::V6,
ArmArchVersion::V6k => unarm::Version::V6K,
},
extensions,
av: diff_config.arm_av_registers,
r9_use: match diff_config.arm_r9_usage {
ArmR9Usage::GeneralPurpose => unarm::R9Use::R9,
ArmR9Usage::Sb => unarm::R9Use::Sb,
ArmR9Usage::Tr => unarm::R9Use::Tr,
},
sl: diff_config.arm_sl_usage,
fp: diff_config.arm_fp_usage,
ip: diff_config.arm_ip_usage,
ual: diff_config.arm_unified_syntax,
}
}
@@ -127,32 +128,7 @@ impl ArchArm {
ins_ref: InstructionRef,
code: &[u8],
diff_config: &DiffObjConfig,
) -> Result<(unarm::Ins, unarm::ParsedIns)> {
if ins_ref.opcode == thumb::Opcode::BlH as u16 && ins_ref.size == 4 {
// Special case: combined thumb BL instruction
let parse_flags = self.parse_flags(diff_config);
let first_ins = thumb::Ins {
code: match self.endianness {
object::Endianness::Little => u16::from_le_bytes([code[0], code[1]]),
object::Endianness::Big => u16::from_be_bytes([code[0], code[1]]),
} as u32,
op: thumb::Opcode::BlH,
};
let second_ins = thumb::Ins::new(
match self.endianness {
object::Endianness::Little => u16::from_le_bytes([code[2], code[3]]),
object::Endianness::Big => u16::from_be_bytes([code[2], code[3]]),
} as u32,
&parse_flags,
);
let first_parsed = first_ins.parse(&parse_flags);
let second_parsed = second_ins.parse(&parse_flags);
return Ok((
unarm::Ins::Thumb(first_ins),
first_parsed.combine_thumb_bl(&second_parsed),
));
}
) -> Result<unarm::Ins> {
let code = match (self.endianness, ins_ref.size) {
(object::Endianness::Little, 2) => u16::from_le_bytes([code[0], code[1]]) as u32,
(object::Endianness::Little, 4) => {
@@ -164,21 +140,24 @@ impl ArchArm {
}
_ => bail!("Invalid instruction size {}", ins_ref.size),
};
let (ins, parsed_ins) = if ins_ref.opcode == u16::MAX {
let mut args = args::Arguments::default();
args[0] = args::Argument::UImm(code);
let mnemonic = if ins_ref.size == 4 { ".word" } else { ".hword" };
(unarm::Ins::Data, unarm::ParsedIns { mnemonic, args })
} else if ins_ref.opcode & (1 << 15) != 0 {
let ins = arm::Ins { code, op: arm::Opcode::from(ins_ref.opcode as u8) };
let parsed = ins.parse(&self.parse_flags(diff_config));
(unarm::Ins::Arm(ins), parsed)
let thumb = ins_ref.opcode & (1 << 15) == 0;
let discriminant = ins_ref.opcode & !(1 << 15);
let pc = ins_ref.address as u32;
let options = self.unarm_options(diff_config);
let ins = if ins_ref.opcode == OPCODE_DATA {
match ins_ref.size {
4 => unarm::Ins::Word(code),
2 => unarm::Ins::HalfWord(code as u16),
_ => bail!("Invalid data size {}", ins_ref.size),
}
} else if thumb {
unarm::parse_thumb_with_discriminant(code, discriminant, pc, &options)
} else {
let ins = thumb::Ins { code, op: thumb::Opcode::from(ins_ref.opcode as u8) };
let parsed = ins.parse(&self.parse_flags(diff_config));
(unarm::Ins::Thumb(ins), parsed)
unarm::parse_arm_with_discriminant(code, discriminant, pc, &options)
};
Ok((ins, parsed_ins))
Ok(ins)
}
}
@@ -218,10 +197,11 @@ impl Arch for ArchArm {
.take_while(|x| x.address < end_addr);
let mut next_mapping = mappings_iter.next();
let ins_count = code.len() / mode.instruction_size(start_addr);
let min_ins_size = if mode == unarm::ParseMode::Thumb { 2 } else { 4 };
let ins_count = code.len() / min_ins_size;
let mut ops = Vec::<InstructionRef>::with_capacity(ins_count);
let parse_flags = self.parse_flags(diff_config);
let options = self.unarm_options(diff_config);
let mut address = start_addr;
while address < end_addr {
@@ -231,94 +211,89 @@ impl Arch for ArchArm {
next_mapping = mappings_iter.next();
}
let mut ins_size = mode.instruction_size(address);
let data = &code[(address - start_addr) as usize..];
if data.len() < ins_size {
if data.len() < min_ins_size {
// Push the remainder as data
ops.push(InstructionRef {
address: address as u64,
size: data.len() as u8,
opcode: u16::MAX,
opcode: OPCODE_DATA,
branch_dest: None,
});
break;
}
let code = match (self.endianness, ins_size) {
(object::Endianness::Little, 2) => u16::from_le_bytes([data[0], data[1]]) as u32,
(object::Endianness::Little, 4) => {
u32::from_le_bytes([data[0], data[1], data[2], data[3]])
}
(object::Endianness::Big, 2) => u16::from_be_bytes([data[0], data[1]]) as u32,
(object::Endianness::Big, 4) => {
u32::from_be_bytes([data[0], data[1], data[2], data[3]])
}
_ => {
// Invalid instruction size
ops.push(InstructionRef {
address: address as u64,
size: ins_size as u8,
opcode: u16::MAX,
branch_dest: None,
});
address += ins_size as u32;
continue;
}
// Check how many bytes we can/should read
let num_code_bytes = if mode == unarm::ParseMode::Data {
// 32-bit .word value should be aligned on a 4-byte boundary, otherwise use .hword
if address & 3 == 0 { 4 } else { 2 }
} else if data.len() >= 4 {
// Read 4 bytes even for Thumb, as the parser will determine if it's a 2 or 4 byte instruction
4
} else if mode != unarm::ParseMode::Arm {
2
} else {
// Invalid instruction size
ops.push(InstructionRef {
address: address as u64,
size: min_ins_size as u8,
opcode: OPCODE_INVALID,
branch_dest: None,
});
address += min_ins_size as u32;
continue;
};
let (opcode, branch_dest) = match mode {
unarm::ParseMode::Arm => {
let ins = arm::Ins::new(code, &parse_flags);
let opcode = ins.op as u16 | (1 << 15);
let branch_dest = match ins.op {
arm::Opcode::B | arm::Opcode::Bl => {
address.checked_add_signed(ins.field_branch_offset())
let code = match num_code_bytes {
4 => match self.endianness {
object::Endianness::Little => {
u32::from_le_bytes([data[0], data[1], data[2], data[3]])
}
object::Endianness::Big => {
if mode != unarm::ParseMode::Thumb {
u32::from_be_bytes([data[0], data[1], data[2], data[3]])
} else {
// For 4-byte Thumb instructions, read two 16-bit halfwords in big endian
u32::from_be_bytes([data[2], data[3], data[0], data[1]])
}
arm::Opcode::BlxI => address.checked_add_signed(ins.field_blx_offset()),
_ => None,
};
(opcode, branch_dest)
}
},
2 => match self.endianness {
object::Endianness::Little => u16::from_le_bytes([data[0], data[1]]) as u32,
object::Endianness::Big => u16::from_be_bytes([data[0], data[1]]) as u32,
},
_ => unreachable!(),
};
let (opcode, ins, ins_size) = match mode {
unarm::ParseMode::Arm => {
let ins = unarm::parse_arm(code, address, &options);
let opcode = ins.discriminant() | (1 << 15);
(opcode, ins, 4)
}
unarm::ParseMode::Thumb => {
let ins = thumb::Ins::new(code, &parse_flags);
let opcode = ins.op as u16;
let branch_dest = match ins.op {
thumb::Opcode::B | thumb::Opcode::Bl => {
address.checked_add_signed(ins.field_branch_offset_8())
}
thumb::Opcode::BlH if data.len() >= 4 => {
// Combine BL instructions
let second_ins = thumb::Ins::new(
match self.endianness {
object::Endianness::Little => {
u16::from_le_bytes([data[2], data[3]]) as u32
}
object::Endianness::Big => {
u16::from_be_bytes([data[2], data[3]]) as u32
}
},
&parse_flags,
);
if let Some(low) = match second_ins.op {
thumb::Opcode::Bl => Some(second_ins.field_low_branch_offset_11()),
thumb::Opcode::BlxI => Some(second_ins.field_low_blx_offset_11()),
_ => None,
} {
ins_size = 4;
address.checked_add_signed(
(ins.field_high_branch_offset_11() + (low as i32)) << 9 >> 9,
)
} else {
None
}
}
thumb::Opcode::BLong => {
address.checked_add_signed(ins.field_branch_offset_11())
}
_ => None,
};
(opcode, branch_dest)
let (ins, size) = unarm::parse_thumb(code, address, &options);
let opcode = ins.discriminant();
(opcode, ins, size)
}
unarm::ParseMode::Data => (u16::MAX, None),
unarm::ParseMode::Data => (
OPCODE_DATA,
if num_code_bytes == 4 {
unarm::Ins::Word(code)
} else {
unarm::Ins::HalfWord(code as u16)
},
num_code_bytes,
),
};
let branch_dest = match ins {
unarm::Ins::B { target, .. }
| unarm::Ins::Bl { target, .. }
| unarm::Ins::Blx { target: unarm::BlxTarget::Direct(target), .. } => {
Some(target.addr)
}
_ => None,
};
ops.push(InstructionRef {
@@ -327,7 +302,7 @@ impl Arch for ArchArm {
opcode,
branch_dest: branch_dest.map(|x| x as u64),
});
address += ins_size as u32;
address += ins_size;
}
Ok(ops)
@@ -339,20 +314,17 @@ impl Arch for ArchArm {
diff_config: &DiffObjConfig,
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
) -> Result<()> {
let (ins, parsed_ins) = self.parse_ins_ref(resolved.ins_ref, resolved.code, diff_config)?;
cb(InstructionPart::opcode(parsed_ins.mnemonic, resolved.ins_ref.opcode))?;
if ins == unarm::Ins::Data && resolved.relocation.is_some() {
cb(InstructionPart::reloc())?;
} else {
push_args(
ins,
&parsed_ins,
resolved.relocation,
resolved.ins_ref.address as u32,
self.display_options(diff_config),
cb,
)?;
}
let ins = self.parse_ins_ref(resolved.ins_ref, resolved.code, diff_config)?;
let options = self.unarm_options(diff_config);
let mut string_fmt = unarm::StringFormatter::new(&options);
ins.write_opcode(&mut string_fmt)?;
let opcode = string_fmt.into_string();
cb(InstructionPart::opcode(opcode, resolved.ins_ref.opcode))?;
let mut args_formatter =
ArgsFormatter { options: &options, cb, resolved: &resolved, skip_leading_space: true };
ins.write_params(&mut args_formatter)?;
Ok(())
}
@@ -409,12 +381,6 @@ impl Arch for ArchArm {
}
}
fn demangle(&self, name: &str) -> Option<String> {
cpp_demangle::Symbol::new(name)
.ok()
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
}
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
match flags {
RelocationFlags::Elf(r_type) => match r_type {
@@ -464,6 +430,26 @@ impl Arch for ArchArm {
}
flags
}
fn infer_function_size(
&self,
symbol: &Symbol,
section: &Section,
mut next_address: u64,
) -> Result<u64> {
// TODO: This should probably check the disasm mode and trim accordingly,
// but self.disasm_modes isn't populated until post_init, so it needs a refactor.
// Trim any trailing 2-byte zeroes from the end (padding)
while next_address >= symbol.address + 2
&& let Some(data) = section.data_range(next_address - 2, 2)
&& data == [0u8; 2]
&& section.relocation_at(next_address - 2, 2).is_none()
{
next_address -= 2;
}
Ok(next_address.saturating_sub(symbol.address))
}
}
#[derive(Clone, Copy, Debug)]
@@ -486,203 +472,133 @@ impl DisasmMode {
}
}
fn push_args(
ins: unarm::Ins,
parsed_ins: &unarm::ParsedIns,
relocation: Option<ResolvedRelocation>,
cur_addr: u32,
display_options: unarm::DisplayOptions,
mut arg_cb: impl FnMut(InstructionPart) -> Result<()>,
) -> Result<()> {
let reloc_arg = find_reloc_arg(parsed_ins, relocation);
let mut writeback = false;
let mut deref = false;
for (i, &arg) in parsed_ins.args_iter().enumerate() {
// Emit punctuation before separator
if deref {
match arg {
args::Argument::OffsetImm(args::OffsetImm { post_indexed: true, value: _ })
| args::Argument::OffsetReg(args::OffsetReg {
add: _,
post_indexed: true,
reg: _,
})
| args::Argument::CoOption(_) => {
deref = false;
arg_cb(InstructionPart::basic("]"))?;
if writeback {
writeback = false;
arg_cb(InstructionPart::opaque("!"))?;
}
pub struct ArgsFormatter<'a> {
options: &'a unarm::Options,
cb: &'a mut dyn FnMut(InstructionPart) -> Result<()>,
resolved: &'a ResolvedInstructionRef<'a>,
skip_leading_space: bool,
}
impl ArgsFormatter<'_> {
fn write(&mut self, part: InstructionPart) -> core::fmt::Result {
(self.cb)(part).map_err(|_| core::fmt::Error)
}
fn write_opaque<F>(&mut self, value: F) -> core::fmt::Result
where F: unarm::FormatValue {
let mut string_fmt = unarm::StringFormatter::new(self.options);
value.write(&mut string_fmt)?;
self.write(InstructionPart::opaque(string_fmt.into_string()))?;
Ok(())
}
}
impl Write for ArgsFormatter<'_> {
fn write_str(&mut self, s: &str) -> core::fmt::Result { self.write(InstructionPart::basic(s)) }
}
impl unarm::FormatIns for ArgsFormatter<'_> {
fn options(&self) -> &unarm::Options { self.options }
fn write_ins(&mut self, ins: &unarm::Ins) -> core::fmt::Result {
let mut string_fmt = unarm::StringFormatter::new(self.options);
ins.write_opcode(&mut string_fmt)?;
let opcode = string_fmt.into_string();
self.write(InstructionPart::Opcode(Cow::Owned(opcode), self.resolved.ins_ref.opcode))?;
ins.write_params(self)
}
fn write_space(&mut self) -> core::fmt::Result {
if self.skip_leading_space {
self.skip_leading_space = false;
Ok(())
} else {
self.write_str(" ")
}
}
fn write_separator(&mut self) -> core::fmt::Result { self.write(InstructionPart::separator()) }
fn write_uimm(&mut self, uimm: u32) -> core::fmt::Result {
if let Some(resolved) = self.resolved.relocation
&& let RelocationFlags::Elf(elf::R_ARM_ABS32) = resolved.relocation.flags
{
return self.write(InstructionPart::reloc());
}
self.write(InstructionPart::unsigned(uimm))
}
fn write_simm(&mut self, simm: i32) -> core::fmt::Result {
self.write(InstructionPart::signed(simm))
}
fn write_branch_target(&mut self, branch_target: unarm::BranchTarget) -> core::fmt::Result {
if let Some(resolved) = self.resolved.relocation {
match resolved.relocation.flags {
RelocationFlags::Elf(elf::R_ARM_THM_XPC22)
| RelocationFlags::Elf(elf::R_ARM_THM_PC22)
| RelocationFlags::Elf(elf::R_ARM_PC24)
| RelocationFlags::Elf(elf::R_ARM_XPC25)
| RelocationFlags::Elf(elf::R_ARM_CALL) => {
return self.write(InstructionPart::reloc());
}
_ => {}
}
}
if i > 0 {
arg_cb(InstructionPart::separator())?;
}
if reloc_arg == Some(i) {
arg_cb(InstructionPart::reloc())?;
} else {
match arg {
args::Argument::None => {}
args::Argument::Reg(reg) => {
if reg.deref {
deref = true;
arg_cb(InstructionPart::basic("["))?;
}
arg_cb(InstructionPart::opaque(
reg.reg.display(display_options.reg_names).to_string(),
))?;
if reg.writeback {
if reg.deref {
writeback = true;
} else {
arg_cb(InstructionPart::opaque("!"))?;
}
}
}
args::Argument::RegList(reg_list) => {
arg_cb(InstructionPart::basic("{"))?;
let mut first = true;
for i in 0..16 {
if (reg_list.regs & (1 << i)) != 0 {
if !first {
arg_cb(InstructionPart::separator())?;
}
arg_cb(InstructionPart::opaque(
args::Register::parse(i)
.display(display_options.reg_names)
.to_string(),
))?;
first = false;
}
}
arg_cb(InstructionPart::basic("}"))?;
if reg_list.user_mode {
arg_cb(InstructionPart::opaque("^"))?;
}
}
args::Argument::UImm(value)
| args::Argument::CoOpcode(value)
| args::Argument::SatImm(value) => {
arg_cb(InstructionPart::basic("#"))?;
arg_cb(InstructionPart::unsigned(value))?;
}
args::Argument::SImm(value)
| args::Argument::OffsetImm(args::OffsetImm { post_indexed: _, value }) => {
arg_cb(InstructionPart::basic("#"))?;
arg_cb(InstructionPart::signed(value))?;
}
args::Argument::BranchDest(value) => {
arg_cb(InstructionPart::branch_dest(cur_addr.wrapping_add_signed(value)))?;
}
args::Argument::CoOption(value) => {
arg_cb(InstructionPart::basic("{"))?;
arg_cb(InstructionPart::unsigned(value))?;
arg_cb(InstructionPart::basic("}"))?;
}
args::Argument::CoprocNum(value) => {
arg_cb(InstructionPart::opaque(format!("p{value}")))?;
}
args::Argument::ShiftImm(shift) => {
arg_cb(InstructionPart::opaque(shift.op.to_string()))?;
arg_cb(InstructionPart::basic(" #"))?;
arg_cb(InstructionPart::unsigned(shift.imm))?;
}
args::Argument::ShiftReg(shift) => {
arg_cb(InstructionPart::opaque(shift.op.to_string()))?;
arg_cb(InstructionPart::basic(" "))?;
arg_cb(InstructionPart::opaque(
shift.reg.display(display_options.reg_names).to_string(),
))?;
}
args::Argument::OffsetReg(offset) => {
if !offset.add {
arg_cb(InstructionPart::basic("-"))?;
}
arg_cb(InstructionPart::opaque(
offset.reg.display(display_options.reg_names).to_string(),
))?;
}
args::Argument::CpsrMode(mode) => {
arg_cb(InstructionPart::basic("#"))?;
arg_cb(InstructionPart::unsigned(mode.mode))?;
if mode.writeback {
arg_cb(InstructionPart::opaque("!"))?;
}
}
args::Argument::CoReg(_)
| args::Argument::StatusReg(_)
| args::Argument::StatusMask(_)
| args::Argument::Shift(_)
| args::Argument::CpsrFlags(_)
| args::Argument::Endian(_) => {
arg_cb(InstructionPart::opaque(
arg.display(display_options, None).to_string(),
))?;
}
}
}
}
if deref {
arg_cb(InstructionPart::basic("]"))?;
if writeback {
arg_cb(InstructionPart::opaque("!"))?;
}
self.write(InstructionPart::branch_dest(branch_target.addr))
}
let branch_dest = get_pc_relative_load_address(ins, cur_addr);
if let Some(branch_dest) = branch_dest {
arg_cb(InstructionPart::basic(" (->"))?;
arg_cb(InstructionPart::branch_dest(branch_dest))?;
arg_cb(InstructionPart::basic(")"))?;
fn write_reg(&mut self, reg: unarm::Reg) -> core::fmt::Result { self.write_opaque(reg) }
fn write_status_reg(&mut self, status_reg: unarm::StatusReg) -> core::fmt::Result {
self.write_opaque(status_reg)
}
Ok(())
}
fn find_reloc_arg(
parsed_ins: &unarm::ParsedIns,
relocation: Option<ResolvedRelocation>,
) -> Option<usize> {
if let Some(resolved) = relocation {
match resolved.relocation.flags {
// Calls
RelocationFlags::Elf(elf::R_ARM_THM_XPC22)
| RelocationFlags::Elf(elf::R_ARM_THM_PC22)
| RelocationFlags::Elf(elf::R_ARM_PC24)
| RelocationFlags::Elf(elf::R_ARM_XPC25)
| RelocationFlags::Elf(elf::R_ARM_CALL) => {
parsed_ins.args.iter().rposition(|a| matches!(a, args::Argument::BranchDest(_)))
}
// Data
RelocationFlags::Elf(elf::R_ARM_ABS32) => {
parsed_ins.args.iter().rposition(|a| matches!(a, args::Argument::UImm(_)))
}
_ => None,
}
} else {
None
fn write_status_fields(&mut self, status_fields: unarm::StatusFields) -> core::fmt::Result {
self.write_opaque(status_fields)
}
}
fn get_pc_relative_load_address(ins: unarm::Ins, address: u32) -> Option<u32> {
match ins {
unarm::Ins::Arm(ins)
if ins.op == arm::Opcode::Ldr
&& ins.modifier_addr_ldr_str() == arm::AddrLdrStr::Imm
&& ins.field_rn_deref().reg == args::Register::Pc =>
fn write_shift_op(&mut self, shift_op: unarm::ShiftOp) -> core::fmt::Result {
self.write_opaque(shift_op)
}
fn write_coproc(&mut self, coproc: unarm::Coproc) -> core::fmt::Result {
self.write_opaque(coproc)
}
fn write_co_reg(&mut self, co_reg: unarm::CoReg) -> core::fmt::Result {
self.write_opaque(co_reg)
}
fn write_aif_flags(&mut self, aif_flags: unarm::AifFlags) -> core::fmt::Result {
self.write_opaque(aif_flags)
}
fn write_endianness(&mut self, endianness: unarm::Endianness) -> core::fmt::Result {
self.write_opaque(endianness)
}
fn write_sreg(&mut self, sreg: unarm::Sreg) -> core::fmt::Result { self.write_opaque(sreg) }
fn write_dreg(&mut self, dreg: unarm::Dreg) -> core::fmt::Result { self.write_opaque(dreg) }
fn write_fpscr(&mut self, fpscr: unarm::Fpscr) -> core::fmt::Result { self.write_opaque(fpscr) }
fn write_addr_ldr_str(&mut self, addr_ldr_str: unarm::AddrLdrStr) -> core::fmt::Result {
addr_ldr_str.write(self)?;
if let unarm::AddrLdrStr::Pre {
rn: unarm::Reg::Pc,
offset: unarm::LdrStrOffset::Imm(offset),
..
} = addr_ldr_str
{
let offset = ins.field_offset_12().value;
Some(address.wrapping_add_signed(offset + 8))
let thumb = self.resolved.ins_ref.opcode & (1 << 15) == 0;
let pc_offset = if thumb { 4 } else { 8 };
let pc = (self.resolved.ins_ref.address as u32 & !3) + pc_offset;
self.write(InstructionPart::basic(" (->"))?;
self.write(InstructionPart::branch_dest(pc.wrapping_add(offset as u32)))?;
self.write(InstructionPart::basic(")"))?;
}
unarm::Ins::Thumb(ins) if ins.op == thumb::Opcode::LdrPc => {
let offset = ins.field_rel_immed_8().value;
Some((address & !3).wrapping_add_signed(offset + 4))
}
_ => None,
Ok(())
}
}

View File

@@ -1,8 +1,4 @@
use alloc::{
format,
string::{String, ToString},
vec::Vec,
};
use alloc::{format, string::ToString, vec::Vec};
use core::cmp::Ordering;
use anyhow::Result;
@@ -14,7 +10,7 @@ use yaxpeax_arm::armv8::a64::{
};
use crate::{
arch::Arch,
arch::{Arch, OPCODE_INVALID},
diff::{DiffObjConfig, display::InstructionPart},
obj::{
InstructionRef, Relocation, RelocationFlags, ResolvedInstructionRef, ResolvedRelocation,
@@ -60,7 +56,7 @@ impl Arch for ArchArm64 {
ops.push(InstructionRef {
address,
size: 4,
opcode: u16::MAX,
opcode: OPCODE_INVALID,
branch_dest: None,
});
continue;
@@ -87,7 +83,7 @@ impl Arch for ArchArm64 {
let decoder = InstDecoder::default();
let mut ins = Instruction::default();
if decoder.decode_into(&mut ins, &mut reader).is_err() {
cb(InstructionPart::opcode("<invalid>", u16::MAX))?;
cb(InstructionPart::opcode("<invalid>", OPCODE_INVALID))?;
return Ok(());
}
@@ -108,12 +104,6 @@ impl Arch for ArchArm64 {
Ok(())
}
fn demangle(&self, name: &str) -> Option<String> {
cpp_demangle::Symbol::new(name)
.ok()
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
}
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
match flags {
RelocationFlags::Elf(r_type) => match r_type {
@@ -2295,7 +2285,7 @@ where Cb: FnMut(InstructionPart<'static>) {
// Opcode is #[repr(u16)], but the tuple variants negate that, so we have to do this instead.
const fn opcode_to_u16(opcode: Opcode) -> u16 {
match opcode {
Opcode::Invalid => u16::MAX,
Opcode::Invalid => OPCODE_INVALID,
Opcode::UDF => 0,
Opcode::MOVN => 1,
Opcode::MOVK => 2,

View File

@@ -1,6 +1,6 @@
use alloc::{
collections::{BTreeMap, BTreeSet},
string::{String, ToString},
string::ToString,
vec::Vec,
};
@@ -12,7 +12,7 @@ use rabbitizer::{
use crate::{
arch::{Arch, RelocationOverride, RelocationOverrideTarget},
diff::{DiffObjConfig, MipsAbi, MipsInstrCategory, display::InstructionPart},
diff::{DiffObjConfig, DiffSide, MipsAbi, MipsInstrCategory, display::InstructionPart},
obj::{
InstructionArg, InstructionArgValue, InstructionRef, Relocation, RelocationFlags,
ResolvedInstructionRef, ResolvedRelocation, Section, Symbol, SymbolFlag, SymbolFlagSet,
@@ -27,6 +27,7 @@ pub struct ArchMips {
pub ri_gp_value: i32,
pub paired_relocations: Vec<BTreeMap<u64, i64>>,
pub ignored_symbols: BTreeSet<usize>,
pub diff_side: DiffSide,
}
const EF_MIPS_ABI: u32 = 0x0000F000;
@@ -38,15 +39,18 @@ const EF_MIPS_MACH_5900: u32 = 0x00920000;
const R_MIPS15_S3: u32 = 119;
impl ArchMips {
pub fn new(object: &object::File) -> Result<Self> {
pub fn new(object: &object::File, diff_side: DiffSide) -> Result<Self> {
let mut abi = Abi::O32;
let mut isa_extension = None;
match object.flags() {
object::FileFlags::None => {}
object::FileFlags::Elf { e_flags, .. } => {
abi = match e_flags & EF_MIPS_ABI {
elf::EF_MIPS_ABI_O32 | elf::EF_MIPS_ABI_O64 => Abi::O32,
elf::EF_MIPS_ABI_EABI32 | elf::EF_MIPS_ABI_EABI64 => Abi::N32,
elf::EF_MIPS_ABI_O32 => Abi::O32,
elf::EF_MIPS_ABI_O64 if e_flags & elf::EF_MIPS_ABI2 != 0 => Abi::N64,
elf::EF_MIPS_ABI_O64 => Abi::O64,
elf::EF_MIPS_ABI_EABI32 => Abi::EABI32,
elf::EF_MIPS_ABI_EABI64 => Abi::EABI64,
_ => {
if e_flags & elf::EF_MIPS_ABI2 != 0 {
Abi::N32
@@ -124,7 +128,11 @@ impl ArchMips {
let Ok(name) = obj_symbol.name() else { continue };
if let Some(prefix) = name.strip_suffix(".NON_MATCHING") {
ignored_symbols.insert(obj_symbol.index().0);
if let Some(target_symbol) = object.symbol_by_name(prefix) {
// Only remove the prefixless symbols if we are on the Base side of the diff,
// to allow diffing against target objects that contain `.NON_MATCHING` markers.
if diff_side == DiffSide::Base
&& let Some(target_symbol) = object.symbol_by_name(prefix)
{
ignored_symbols.insert(target_symbol.index().0);
}
}
@@ -137,6 +145,7 @@ impl ArchMips {
ri_gp_value,
paired_relocations,
ignored_symbols,
diff_side,
})
}
@@ -164,8 +173,11 @@ impl ArchMips {
.with_abi(match diff_config.mips_abi {
MipsAbi::Auto => self.abi,
MipsAbi::O32 => Abi::O32,
MipsAbi::O64 => Abi::O64,
MipsAbi::N32 => Abi::N32,
MipsAbi::N64 => Abi::N64,
MipsAbi::Eabi32 => Abi::EABI32,
MipsAbi::Eabi64 => Abi::EABI64,
})
}
@@ -281,6 +293,7 @@ impl Arch for ArchMips {
}
elf::R_MIPS_PC16 => 0, // PC-relative relocation
R_MIPS15_S3 => ((code & 0x001FFFC0) >> 3) as i64,
elf::R_MIPS_GPREL32 => (code as i32 as i64) + self.ri_gp_value as i64,
flags => bail!("Unsupported MIPS implicit relocation {flags:?}"),
};
Ok(Some(RelocationOverride { target: RelocationOverrideTarget::Keep, addend }))
@@ -292,13 +305,6 @@ impl Arch for ArchMips {
}
}
fn demangle(&self, name: &str) -> Option<String> {
cpp_demangle::Symbol::new(name)
.ok()
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
.or_else(|| cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()))
}
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
match flags {
RelocationFlags::Elf(r_type) => match r_type {
@@ -313,6 +319,7 @@ impl Arch for ArchMips {
elf::R_MIPS_GOT16 => Some("R_MIPS_GOT16"),
elf::R_MIPS_PC16 => Some("R_MIPS_PC16"),
elf::R_MIPS_CALL16 => Some("R_MIPS_CALL16"),
elf::R_MIPS_GPREL32 => Some("R_MIPS_GPREL32"),
R_MIPS15_S3 => Some("R_MIPS15_S3"),
_ => None,
},
@@ -350,6 +357,7 @@ impl Arch for ArchMips {
while new_address >= symbol.address + 4
&& let Some(data) = section.data_range(new_address - 4, 4)
&& data == [0u8; 4]
&& section.relocation_at(next_address - 4, 4).is_none()
{
new_address -= 4;
}

View File

@@ -6,6 +6,7 @@ use alloc::{
vec::Vec,
};
use core::{
any::Any,
ffi::CStr,
fmt::{self, Debug},
};
@@ -16,7 +17,7 @@ use object::Endian as _;
use crate::{
diff::{
DiffObjConfig,
DiffObjConfig, DiffSide,
display::{ContextItem, HoverItem, InstructionPart},
},
obj::{
@@ -40,6 +41,9 @@ pub mod superh;
#[cfg(feature = "x86")]
pub mod x86;
pub const OPCODE_INVALID: u16 = u16::MAX;
pub const OPCODE_DATA: u16 = u16::MAX - 1;
/// Represents the type of data associated with an instruction
#[derive(PartialEq)]
pub enum DataType {
@@ -305,7 +309,7 @@ impl dyn Arch {
}
}
pub trait Arch: Send + Sync + Debug {
pub trait Arch: Any + Debug + Send + Sync {
/// Finishes arch-specific initialization that must be done after sections have been combined.
fn post_init(&mut self, _sections: &[Section], _symbols: &[Symbol]) {}
@@ -367,8 +371,6 @@ pub trait Arch: Send + Sync + Debug {
Ok(None)
}
fn demangle(&self, _name: &str) -> Option<String> { None }
fn reloc_name(&self, _flags: RelocationFlags) -> Option<&'static str> { None }
fn data_reloc_size(&self, flags: RelocationFlags) -> usize;
@@ -417,15 +419,18 @@ pub trait Arch: Send + Sync + Debug {
}
}
pub fn new_arch(object: &object::File) -> Result<Box<dyn Arch>> {
pub fn new_arch(object: &object::File, diff_side: DiffSide) -> Result<Box<dyn Arch>> {
use object::Object as _;
// Avoid unused warnings on non-mips builds
let _ = diff_side;
Ok(match object.architecture() {
#[cfg(feature = "ppc")]
object::Architecture::PowerPc | object::Architecture::PowerPc64 => {
Box::new(ppc::ArchPpc::new(object)?)
}
#[cfg(feature = "mips")]
object::Architecture::Mips => Box::new(mips::ArchMips::new(object)?),
object::Architecture::Mips => Box::new(mips::ArchMips::new(object, diff_side)?),
#[cfg(feature = "x86")]
object::Architecture::I386 | object::Architecture::X86_64 => {
Box::new(x86::ArchX86::new(object)?)

View File

@@ -21,6 +21,7 @@ use crate::{
obj::{
FlowAnalysisResult, InstructionRef, Object, Relocation, RelocationFlags,
ResolvedInstructionRef, ResolvedRelocation, Section, Symbol, SymbolFlag, SymbolFlagSet,
SymbolKind,
},
};
@@ -307,18 +308,6 @@ impl Arch for ArchPpc {
}
}
fn demangle(&self, mut name: &str) -> Option<String> {
if name.starts_with('?') {
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
} else {
name = name.trim_start_matches('.');
cpp_demangle::Symbol::new(name)
.ok()
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
.or_else(|| cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()))
}
}
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
match flags {
RelocationFlags::Elf(r_type) => match r_type {
@@ -468,6 +457,7 @@ impl Arch for ArchPpc {
while next_address >= symbol.address + 4
&& let Some(data) = section.data_range(next_address - 4, 4)
&& data == [0u8; 4]
&& section.relocation_at(next_address - 4, 4).is_none()
{
next_address -= 4;
}
@@ -675,7 +665,7 @@ fn make_symbol_ref(symbol: &object::Symbol) -> Result<ExtabSymbolRef> {
#[derive(Debug)]
struct PoolReference {
addr_src_gpr: powerpc::GPR,
addr_offset: i16,
addr_offset: i64,
addr_dst_gpr: Option<powerpc::GPR>,
}
@@ -683,16 +673,20 @@ struct PoolReference {
// If so, return information pertaining to where the instruction is getting that address from and
// what it's doing with the address (e.g. copying it into another register, adding an offset, etc).
fn get_pool_reference_for_inst(
opcode: powerpc::Opcode,
ins: powerpc::Ins,
simplified: &powerpc::ParsedIns,
) -> Option<PoolReference> {
use powerpc::{Argument, Opcode};
let args = &simplified.args;
if flow_analysis::guess_data_type_from_load_store_inst_op(opcode).is_some() {
if flow_analysis::guess_data_type_from_load_store_inst_op(ins.op).is_some() {
match (args[1], args[2]) {
(Argument::Offset(offset), Argument::GPR(addr_src_gpr)) => {
// e.g. lwz. Immediate offset.
Some(PoolReference { addr_src_gpr, addr_offset: offset.0, addr_dst_gpr: None })
Some(PoolReference {
addr_src_gpr,
addr_offset: offset.0 as i64,
addr_dst_gpr: None,
})
}
(Argument::GPR(addr_src_gpr), Argument::GPR(_offset_gpr)) => {
// e.g. lwzx. The offset is in a register and was likely calculated from an index.
@@ -712,17 +706,51 @@ fn get_pool_reference_for_inst(
// If either of these match, we also want to return the destination register that the
// address is being copied into so that we can detect any future references to that new
// register as well.
match (opcode, args[0], args[1], args[2]) {
match (ins.op, args[0], args[1], args[2]) {
(
// `addi` or `subi`
Opcode::Addi,
Argument::GPR(addr_dst_gpr),
Argument::GPR(addr_src_gpr),
Argument::Simm(simm),
) => Some(PoolReference {
addr_src_gpr,
addr_offset: simm.0,
addr_dst_gpr: Some(addr_dst_gpr),
}),
) => {
let offset = if simplified.mnemonic == "addi" { simm.0 } else { -simm.0 };
Some(PoolReference {
addr_src_gpr,
addr_offset: offset as i64,
addr_dst_gpr: Some(addr_dst_gpr),
})
}
(
// `addis`
Opcode::Addis,
Argument::GPR(addr_dst_gpr),
Argument::GPR(addr_src_gpr),
Argument::Uimm(uimm), // Note: `addis` uses UIMM, unlike `addi`, `subi`, and `subis`
) => {
assert_eq!(simplified.mnemonic, "addis");
let offset = (uimm.0 as i64) << 16;
Some(PoolReference {
addr_src_gpr,
addr_offset: offset,
addr_dst_gpr: Some(addr_dst_gpr),
})
}
(
// `subis`
Opcode::Addis,
Argument::GPR(addr_dst_gpr),
Argument::GPR(addr_src_gpr),
Argument::Simm(simm),
) => {
assert_eq!(simplified.mnemonic, "subis");
let offset = (simm.0 as i64) << 16;
Some(PoolReference {
addr_src_gpr,
addr_offset: offset,
addr_dst_gpr: Some(addr_dst_gpr),
})
}
(
// `mr` or `mr.`
Opcode::Or,
@@ -777,13 +805,13 @@ fn clear_overwritten_gprs(ins: powerpc::Ins, gpr_pool_relocs: &mut BTreeMap<u8,
// Also, if this instruction is accessing the middle of a symbol instead of the start, we add an
// addend to indicate that.
fn make_fake_pool_reloc(
offset: i16,
offset: i64,
cur_addr: u32,
pool_reloc: &Relocation,
symbols: &[Symbol],
) -> Option<Relocation> {
let pool_reloc = resolve_relocation(symbols, pool_reloc);
let offset_from_pool = pool_reloc.relocation.addend + offset as i64;
let offset_from_pool = pool_reloc.relocation.addend + offset;
let target_address = pool_reloc.symbol.address.checked_add_signed(offset_from_pool)?;
let target_symbol;
let addend;
@@ -794,6 +822,7 @@ fn make_fake_pool_reloc(
&& s.size > 0
&& !s.flags.contains(SymbolFlag::Hidden)
&& !s.flags.contains(SymbolFlag::Ignored)
&& s.kind != SymbolKind::Section
&& (s.address..s.address + s.size).contains(&target_address)
})?;
addend = target_address.checked_sub(symbols[target_symbol].address)? as i64;
@@ -946,7 +975,7 @@ fn generate_fake_pool_relocations_for_function(
clear_overwritten_gprs(ins, &mut gpr_pool_relocs);
}
}
} else if let Some(pool_ref) = get_pool_reference_for_inst(ins.op, &simplified) {
} else if let Some(pool_ref) = get_pool_reference_for_inst(ins, &simplified) {
// This instruction doesn't have a real relocation, so it may be a reference to one of
// the already-loaded pools.
if let Some(pool_reloc) = gpr_pool_relocs.get(&pool_ref.addr_src_gpr.0) {
@@ -965,7 +994,7 @@ fn generate_fake_pool_relocations_for_function(
// with the offset within the .data section of an array variable into r21.
// Then the body of the loop will `lwzx` one of the array elements from r21.
let mut new_reloc = pool_reloc.clone();
new_reloc.addend += pool_ref.addr_offset as i64;
new_reloc.addend += pool_ref.addr_offset;
gpr_pool_relocs.insert(addr_dst_gpr.0, new_reloc);
} else {
clear_overwritten_gprs(ins, &mut gpr_pool_relocs);

View File

@@ -1,4 +1,4 @@
use alloc::{collections::BTreeMap, format, string::String, vec, vec::Vec};
use alloc::{collections::BTreeMap, format, vec, vec::Vec};
use anyhow::Result;
use object::elf;
@@ -132,12 +132,6 @@ impl Arch for ArchSuperH {
Ok(())
}
fn demangle(&self, name: &str) -> Option<String> {
cpp_demangle::Symbol::new(name)
.ok()
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
}
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
match flags {
RelocationFlags::Elf(r_type) => match r_type {

View File

@@ -1,4 +1,4 @@
use alloc::{boxed::Box, format, string::String, vec::Vec};
use alloc::{boxed::Box, format, vec::Vec};
use core::cmp::Ordering;
use anyhow::{Context, Result, anyhow, bail};
@@ -9,7 +9,7 @@ use iced_x86::{
use object::{Endian as _, Object as _, ObjectSection as _, elf, pe};
use crate::{
arch::{Arch, RelocationOverride, RelocationOverrideTarget},
arch::{Arch, OPCODE_DATA, RelocationOverride, RelocationOverrideTarget},
diff::{DiffObjConfig, X86Formatter, display::InstructionPart},
obj::{InstructionRef, Relocation, RelocationFlags, ResolvedInstructionRef, Section, Symbol},
};
@@ -89,8 +89,6 @@ impl ArchX86 {
}
}
const DATA_OPCODE: u16 = u16::MAX - 1;
impl Arch for ArchX86 {
fn scan_instructions_internal(
&self,
@@ -121,10 +119,43 @@ impl Arch for ArchX86 {
out.push(InstructionRef {
address,
size: size as u8,
opcode: DATA_OPCODE,
opcode: OPCODE_DATA,
branch_dest: None,
});
reloc_iter.next();
// support .byte arrays after jump tables (they're typically known as indirect tables)
let indirect_array_address = address.wrapping_add(size as u64);
let indirect_array_pos = decoder.position();
let max_size = code.len().saturating_sub(indirect_array_pos);
let indirect_array_size = reloc_iter
.peek()
.map(|next_reloc| {
next_reloc.address.saturating_sub(indirect_array_address)
as usize
})
.unwrap_or(max_size)
.min(max_size);
if indirect_array_size > 0 {
for i in 0..indirect_array_size {
out.push(InstructionRef {
address: indirect_array_address + i as u64,
size: 1,
opcode: OPCODE_DATA,
branch_dest: None,
});
}
// move decoder to after the array (there can be multiple jump+indirect tables in one function)
let _ =
decoder.set_position(indirect_array_pos + indirect_array_size);
decoder.set_ip(indirect_array_address + indirect_array_size as u64);
}
continue 'outer;
}
}
@@ -154,13 +185,14 @@ impl Arch for ArchX86 {
diff_config: &DiffObjConfig,
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
) -> Result<()> {
if resolved.ins_ref.opcode == DATA_OPCODE {
if resolved.ins_ref.opcode == OPCODE_DATA {
let (mnemonic, imm) = match resolved.ins_ref.size {
1 => (".byte", resolved.code[0] as u64),
2 => (".word", self.endianness.read_u16_bytes(resolved.code.try_into()?) as u64),
4 => (".dword", self.endianness.read_u32_bytes(resolved.code.try_into()?) as u64),
_ => bail!("Unsupported x86 inline data size {}", resolved.ins_ref.size),
};
cb(InstructionPart::opcode(mnemonic, DATA_OPCODE))?;
cb(InstructionPart::opcode(mnemonic, OPCODE_DATA))?;
if resolved.relocation.is_some() {
cb(InstructionPart::reloc())?;
} else {
@@ -268,16 +300,6 @@ impl Arch for ArchX86 {
Ok(Some(RelocationOverride { target: RelocationOverrideTarget::Keep, addend }))
}
fn demangle(&self, name: &str) -> Option<String> {
if name.starts_with('?') {
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
} else {
cpp_demangle::Symbol::new(name)
.ok()
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
}
}
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
match self.arch {
Architecture::X86 => match flags {
@@ -791,4 +813,33 @@ mod test {
.unwrap();
assert_eq!(parts, &[InstructionPart::opcode("call", opcode), InstructionPart::reloc()]);
}
#[test]
fn test_display_1_byte_inline_data() {
let arch = ArchX86 { arch: Architecture::X86, endianness: object::Endianness::Little };
let code = [0xAB];
let mut parts = Vec::new();
arch.display_instruction(
ResolvedInstructionRef {
ins_ref: InstructionRef {
address: 0x1234,
size: 1,
opcode: OPCODE_DATA,
branch_dest: None,
},
code: &code,
..Default::default()
},
&DiffObjConfig::default(),
&mut |part| {
parts.push(part.into_static());
Ok(())
},
)
.unwrap();
assert_eq!(parts, &[
InstructionPart::opcode(".byte", OPCODE_DATA),
InstructionPart::unsigned(0xABu64),
]);
}
}

View File

@@ -1,242 +0,0 @@
#![allow(clippy::needless_lifetimes)] // Generated serde code
use crate::{diff, obj};
// Protobuf diff types
include!(concat!(env!("OUT_DIR"), "/objdiff.diff.rs"));
#[cfg(feature = "serde")]
include!(concat!(env!("OUT_DIR"), "/objdiff.diff.serde.rs"));
impl DiffResult {
pub fn new(
_left: Option<(&obj::Object, &diff::ObjectDiff)>,
_right: Option<(&obj::Object, &diff::ObjectDiff)>,
) -> Self {
Self {
// TODO
// left: left.map(|(obj, diff)| ObjectDiff::new(obj, diff)),
// right: right.map(|(obj, diff)| ObjectDiff::new(obj, diff)),
left: None,
right: None,
}
}
}
// impl ObjectDiff {
// pub fn new(obj: &obj::Object, diff: &diff::ObjectDiff) -> Self {
// Self {
// sections: diff
// .sections
// .iter()
// .enumerate()
// .map(|(i, d)| SectionDiff::new(obj, i, d))
// .collect(),
// }
// }
// }
//
// impl SectionDiff {
// pub fn new(obj: &obj::Object, section_index: usize, section_diff: &diff::SectionDiff) -> Self {
// let section = &obj.sections[section_index];
// let symbols = section_diff.symbols.iter().map(|d| SymbolDiff::new(obj, d)).collect();
// let data = section_diff.data_diff.iter().map(|d| DataDiff::new(obj, d)).collect();
// // TODO: section_diff.reloc_diff
// Self {
// name: section.name.to_string(),
// kind: SectionKind::from(section.kind) as i32,
// size: section.size,
// address: section.address,
// symbols,
// data,
// match_percent: section_diff.match_percent,
// }
// }
// }
//
// impl From<obj::SectionKind> for SectionKind {
// fn from(value: obj::SectionKind) -> Self {
// match value {
// obj::SectionKind::Code => SectionKind::SectionText,
// obj::SectionKind::Data => SectionKind::SectionData,
// obj::SectionKind::Bss => SectionKind::SectionBss,
// // TODO common
// }
// }
// }
//
// impl SymbolDiff {
// pub fn new(object: &obj::Object, symbol_diff: &diff::SymbolDiff) -> Self {
// let symbol = object.symbols[symbol_diff.symbol_index];
// let instructions = symbol_diff
// .instruction_rows
// .iter()
// .map(|ins_diff| InstructionDiff::new(object, ins_diff))
// .collect();
// Self {
// symbol: Some(Symbol::new(symbol)),
// instructions,
// match_percent: symbol_diff.match_percent,
// target: symbol_diff.target_symbol.map(SymbolRef::from),
// }
// }
// }
//
// impl DataDiff {
// pub fn new(_object: &obj::Object, data_diff: &diff::DataDiff) -> Self {
// Self {
// kind: DiffKind::from(data_diff.kind) as i32,
// data: data_diff.data.clone(),
// size: data_diff.len as u64,
// }
// }
// }
//
// impl Symbol {
// pub fn new(value: &ObjSymbol) -> Self {
// Self {
// name: value.name.to_string(),
// demangled_name: value.demangled_name.clone(),
// address: value.address,
// size: value.size,
// flags: symbol_flags(value.flags),
// }
// }
// }
//
// fn symbol_flags(value: ObjSymbolFlagSet) -> u32 {
// let mut flags = 0u32;
// if value.0.contains(ObjSymbolFlags::Global) {
// flags |= SymbolFlag::SymbolGlobal as u32;
// }
// if value.0.contains(ObjSymbolFlags::Local) {
// flags |= SymbolFlag::SymbolLocal as u32;
// }
// if value.0.contains(ObjSymbolFlags::Weak) {
// flags |= SymbolFlag::SymbolWeak as u32;
// }
// if value.0.contains(ObjSymbolFlags::Common) {
// flags |= SymbolFlag::SymbolCommon as u32;
// }
// if value.0.contains(ObjSymbolFlags::Hidden) {
// flags |= SymbolFlag::SymbolHidden as u32;
// }
// flags
// }
//
// impl Instruction {
// pub fn new(object: &obj::Object, instruction: &ObjIns) -> Self {
// Self {
// address: instruction.address,
// size: instruction.size as u32,
// opcode: instruction.op as u32,
// mnemonic: instruction.mnemonic.to_string(),
// formatted: instruction.formatted.clone(),
// arguments: instruction.args.iter().map(Argument::new).collect(),
// relocation: instruction.reloc.as_ref().map(|reloc| Relocation::new(object, reloc)),
// branch_dest: instruction.branch_dest,
// line_number: instruction.line,
// original: instruction.orig.clone(),
// }
// }
// }
//
// impl Argument {
// pub fn new(value: &ObjInsArg) -> Self {
// Self {
// value: Some(match value {
// ObjInsArg::PlainText(s) => argument::Value::PlainText(s.to_string()),
// ObjInsArg::Arg(v) => argument::Value::Argument(ArgumentValue::new(v)),
// ObjInsArg::Reloc => argument::Value::Relocation(ArgumentRelocation {}),
// ObjInsArg::BranchDest(dest) => argument::Value::BranchDest(*dest),
// }),
// }
// }
// }
//
// impl ArgumentValue {
// pub fn new(value: &ObjInsArgValue) -> Self {
// Self {
// value: Some(match value {
// ObjInsArgValue::Signed(v) => argument_value::Value::Signed(*v),
// ObjInsArgValue::Unsigned(v) => argument_value::Value::Unsigned(*v),
// ObjInsArgValue::Opaque(v) => argument_value::Value::Opaque(v.to_string()),
// }),
// }
// }
// }
//
// impl Relocation {
// pub fn new(object: &obj::Object, reloc: &ObjReloc) -> Self {
// Self {
// r#type: match reloc.flags {
// object::RelocationFlags::Elf { r_type } => r_type,
// object::RelocationFlags::MachO { r_type, .. } => r_type as u32,
// object::RelocationFlags::Coff { typ } => typ as u32,
// object::RelocationFlags::Xcoff { r_rtype, .. } => r_rtype as u32,
// _ => unreachable!(),
// },
// type_name: object.arch.display_reloc(reloc.flags).into_owned(),
// target: Some(RelocationTarget {
// symbol: Some(Symbol::new(&reloc.target)),
// addend: reloc.addend,
// }),
// }
// }
// }
//
// impl InstructionDiff {
// pub fn new(object: &obj::Object, instruction_diff: &ObjInsDiff) -> Self {
// Self {
// instruction: instruction_diff.ins.as_ref().map(|ins| Instruction::new(object, ins)),
// diff_kind: DiffKind::from(instruction_diff.kind) as i32,
// branch_from: instruction_diff.branch_from.as_ref().map(InstructionBranchFrom::new),
// branch_to: instruction_diff.branch_to.as_ref().map(InstructionBranchTo::new),
// arg_diff: instruction_diff.arg_diff.iter().map(ArgumentDiff::new).collect(),
// }
// }
// }
//
// impl ArgumentDiff {
// pub fn new(value: &Option<ObjInsArgDiff>) -> Self {
// Self { diff_index: value.as_ref().map(|v| v.idx as u32) }
// }
// }
//
// impl From<ObjInsDiffKind> for DiffKind {
// fn from(value: ObjInsDiffKind) -> Self {
// match value {
// ObjInsDiffKind::None => DiffKind::DiffNone,
// ObjInsDiffKind::OpMismatch => DiffKind::DiffOpMismatch,
// ObjInsDiffKind::ArgMismatch => DiffKind::DiffArgMismatch,
// ObjInsDiffKind::Replace => DiffKind::DiffReplace,
// ObjInsDiffKind::Delete => DiffKind::DiffDelete,
// ObjInsDiffKind::Insert => DiffKind::DiffInsert,
// }
// }
// }
//
// impl From<ObjDataDiffKind> for DiffKind {
// fn from(value: ObjDataDiffKind) -> Self {
// match value {
// ObjDataDiffKind::None => DiffKind::DiffNone,
// ObjDataDiffKind::Replace => DiffKind::DiffReplace,
// ObjDataDiffKind::Delete => DiffKind::DiffDelete,
// ObjDataDiffKind::Insert => DiffKind::DiffInsert,
// }
// }
// }
//
// impl InstructionBranchFrom {
// pub fn new(value: &ObjInsBranchFrom) -> Self {
// Self {
// instruction_index: value.ins_idx.iter().map(|&x| x as u32).collect(),
// branch_index: value.branch_idx as u32,
// }
// }
// }
//
// impl InstructionBranchTo {
// pub fn new(value: &ObjInsBranchTo) -> Self {
// Self { instruction_index: value.ins_idx as u32, branch_index: value.branch_idx as u32 }
// }
// }

View File

@@ -1,3 +1 @@
#[cfg(feature = "any-arch")]
pub mod diff;
pub mod report;

View File

@@ -49,6 +49,7 @@ pub fn run_make(config: &BuildConfig, arg: &Utf8UnixPath) -> BuildStatus {
};
#[cfg(windows)]
let mut command = {
use alloc::borrow::Cow;
use std::os::windows::process::CommandExt;
let mut command = if config.selected_wsl_distro.is_some() {
@@ -60,13 +61,17 @@ pub fn run_make(config: &BuildConfig, arg: &Utf8UnixPath) -> BuildStatus {
// Strip distro root prefix \\wsl.localhost\{distro}
let wsl_path_prefix = format!("\\\\wsl.localhost\\{}", distro);
let cwd = match cwd.strip_prefix(wsl_path_prefix) {
Ok(new_cwd) => Utf8UnixPath::new("/").join(new_cwd.with_unix_encoding()),
Err(_) => cwd.with_unix_encoding(),
// Convert to absolute Unix path
Ok(new_cwd) => Cow::Owned(
Utf8UnixPath::new("/").join(new_cwd.with_unix_encoding()).into_string(),
),
// Otherwise, use the Windows path as is
Err(_) => Cow::Borrowed(cwd.as_str()),
};
command
.arg("--cd")
.arg(cwd.as_str())
.arg::<&str>(cwd.as_ref())
.arg("-d")
.arg(distro)
.arg("--")

View File

@@ -29,6 +29,7 @@ pub fn create_watcher(
modified: Arc<AtomicBool>,
project_dir: &Path,
patterns: GlobSet,
ignore_patterns: GlobSet,
waker: Waker,
) -> notify::Result<Watcher> {
let base_dir = fs::canonicalize(project_dir)?;
@@ -54,8 +55,8 @@ pub fn create_watcher(
let Ok(path) = path.strip_prefix(&base_dir_clone) else {
continue;
};
if patterns.is_match(path) {
// log::info!("File modified: {}", path.display());
if patterns.is_match(path) && !ignore_patterns.is_match(path) {
log::debug!("File modified: {}", path.display());
any_match = true;
}
}

View File

@@ -1,6 +1,7 @@
pub mod path;
use alloc::{
borrow::Cow,
collections::BTreeMap,
string::{String, ToString},
vec::Vec,
@@ -36,6 +37,8 @@ pub struct ProjectConfig {
pub build_target: Option<bool>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub watch_patterns: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub ignore_patterns: Option<Vec<String>>,
#[cfg_attr(
feature = "serde",
serde(alias = "objects", skip_serializing_if = "Option::is_none")
@@ -43,6 +46,8 @@ pub struct ProjectConfig {
pub units: Option<Vec<ProjectObject>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub progress_categories: Option<Vec<ProjectProgressCategory>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub options: Option<ProjectOptions>,
}
impl ProjectConfig {
@@ -66,7 +71,18 @@ impl ProjectConfig {
.map(|s| Glob::new(s))
.collect::<Result<Vec<Glob>, globset::Error>>()?
} else {
DEFAULT_WATCH_PATTERNS.iter().map(|s| Glob::new(s).unwrap()).collect()
default_watch_patterns()
})
}
pub fn build_ignore_patterns(&self) -> Result<Vec<Glob>, globset::Error> {
Ok(if let Some(ignore_patterns) = &self.ignore_patterns {
ignore_patterns
.iter()
.map(|s| Glob::new(s))
.collect::<Result<Vec<Glob>, globset::Error>>()?
} else {
default_ignore_patterns()
})
}
}
@@ -103,6 +119,8 @@ pub struct ProjectObject {
pub metadata: Option<ProjectObjectMetadata>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub symbol_mappings: Option<BTreeMap<String, String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub options: Option<ProjectOptions>,
}
#[derive(Default, Clone)]
@@ -130,6 +148,15 @@ pub struct ProjectProgressCategory {
pub name: String,
}
pub type ProjectOptions = BTreeMap<String, ProjectOptionValue>;
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(untagged))]
pub enum ProjectOptionValue {
Bool(bool),
String(String),
}
impl ProjectObject {
pub fn name(&self) -> &str {
if let Some(name) = &self.name {
@@ -166,6 +193,8 @@ impl ProjectObject {
pub fn auto_generated(&self) -> Option<bool> {
self.metadata.as_ref().and_then(|m| m.auto_generated)
}
pub fn options(&self) -> Option<&ProjectOptions> { self.options.as_ref() }
}
#[derive(Default, Clone, Eq, PartialEq)]
@@ -191,14 +220,21 @@ pub struct ScratchConfig {
pub const CONFIG_FILENAMES: [&str; 3] = ["objdiff.json", "objdiff.yml", "objdiff.yaml"];
pub const DEFAULT_WATCH_PATTERNS: &[&str] = &[
"*.c", "*.cp", "*.cpp", "*.cxx", "*.h", "*.hp", "*.hpp", "*.hxx", "*.s", "*.S", "*.asm",
"*.inc", "*.py", "*.yml", "*.txt", "*.json",
"*.c", "*.cc", "*.cp", "*.cpp", "*.cxx", "*.c++", "*.h", "*.hh", "*.hp", "*.hpp", "*.hxx",
"*.h++", "*.pch", "*.pch++", "*.inc", "*.s", "*.S", "*.asm", "*.py", "*.yml", "*.txt",
"*.json",
];
pub const DEFAULT_IGNORE_PATTERNS: &[&str] = &["build/**/*"];
pub fn default_watch_patterns() -> Vec<Glob> {
DEFAULT_WATCH_PATTERNS.iter().map(|s| Glob::new(s).unwrap()).collect()
}
pub fn default_ignore_patterns() -> Vec<Glob> {
DEFAULT_IGNORE_PATTERNS.iter().map(|s| Glob::new(s).unwrap()).collect()
}
#[cfg(feature = "std")]
#[derive(Clone, Eq, PartialEq)]
pub struct ProjectConfigInfo {
@@ -290,3 +326,47 @@ pub fn build_globset(vec: &[Glob]) -> Result<GlobSet, globset::Error> {
}
builder.build()
}
#[cfg(feature = "any-arch")]
pub fn apply_project_options(
diff_config: &mut crate::diff::DiffObjConfig,
options: &ProjectOptions,
) -> Result<()> {
use core::str::FromStr;
use crate::diff::{ConfigEnum, ConfigPropertyId, ConfigPropertyKind};
let mut result = Ok(());
for (key, value) in options.iter() {
let property_id = ConfigPropertyId::from_str(key)
.map_err(|()| anyhow!("Invalid configuration property: {key}"))?;
let value = match value {
ProjectOptionValue::Bool(value) => Cow::Borrowed(if *value { "true" } else { "false" }),
ProjectOptionValue::String(value) => Cow::Borrowed(value.as_str()),
};
if diff_config.set_property_value_str(property_id, &value).is_err() {
if result.is_err() {
// Already returning an error, skip further errors
continue;
}
let mut expected = String::new();
match property_id.kind() {
ConfigPropertyKind::Boolean => expected.push_str("true, false"),
ConfigPropertyKind::Choice(variants) => {
for (idx, variant) in variants.iter().enumerate() {
if idx > 0 {
expected.push_str(", ");
}
expected.push_str(variant.value);
}
}
}
result = Err(anyhow!(
"Invalid value for {}. Expected one of: {}",
property_id.name(),
expected
));
}
}
result
}

View File

@@ -14,7 +14,7 @@ use super::{
};
use crate::obj::{
InstructionArg, InstructionArgValue, InstructionRef, Object, ResolvedInstructionRef,
ResolvedRelocation, ResolvedSymbol, SymbolFlag, SymbolKind,
ResolvedRelocation, ResolvedSymbol, SymbolKind,
};
pub fn no_diff_code(
@@ -41,7 +41,13 @@ pub fn no_diff_code(
instruction_rows.push(InstructionDiffRow { ins_ref: Some(*i), ..Default::default() });
}
resolve_branches(&ops, &mut instruction_rows);
Ok(SymbolDiff { target_symbol: None, match_percent: None, diff_score: None, instruction_rows })
Ok(SymbolDiff {
target_symbol: None,
match_percent: None,
diff_score: None,
instruction_rows,
..Default::default()
})
}
const PENALTY_IMM_DIFF: u64 = 1;
@@ -147,12 +153,14 @@ pub fn diff_code(
match_percent: Some(match_percent),
diff_score: Some((diff_score, max_score)),
instruction_rows: left_rows,
..Default::default()
},
SymbolDiff {
target_symbol: Some(left_symbol_idx),
match_percent: Some(match_percent),
diff_score: Some((diff_score, max_score)),
instruction_rows: right_rows,
..Default::default()
},
))
}
@@ -325,11 +333,7 @@ fn reloc_eq(
|| display_ins_data_literals(left_obj, left_ins)
== display_ins_data_literals(right_obj, right_ins))
}
(None, Some(_)) => {
// Match if possibly stripped weak symbol
symbol_name_addend_matches && right_reloc.symbol.flags.contains(SymbolFlag::Weak)
}
(Some(_), None) | (None, None) => symbol_name_addend_matches,
(Some(_), None) | (None, Some(_)) | (None, None) => symbol_name_addend_matches,
}
}
@@ -496,6 +500,14 @@ fn diff_instruction(
result.right_args_diff.push(InstructionArgDiffIndex::new(b_diff));
}
}
if result.kind == InstructionDiffKind::None
&& left_resolved.code.len() != right_resolved.code.len()
{
// If everything else matches but the raw code length differs (e.g. x86 instructions
// with same disassembly but different encoding), mark as op mismatch
result.kind = InstructionDiffKind::OpMismatch;
state.diff_score += PENALTY_REG_DIFF;
}
return Ok(result);
}

View File

@@ -5,7 +5,7 @@ use anyhow::{Result, anyhow};
use similar::{Algorithm, capture_diff_slices, get_diff_ratio};
use super::{
DataDiff, DataDiffKind, DataRelocationDiff, ObjectDiff, SectionDiff, SymbolDiff,
DataDiff, DataDiffKind, DataDiffRow, DataRelocationDiff, ObjectDiff, SectionDiff, SymbolDiff,
code::{address_eq, section_name_eq},
};
use crate::obj::{Object, Relocation, ResolvedRelocation, Symbol, SymbolFlag, SymbolKind};
@@ -24,17 +24,32 @@ pub fn diff_bss_symbol(
target_symbol: Some(right_symbol_ref),
match_percent: Some(percent),
diff_score: None,
instruction_rows: vec![],
..Default::default()
},
SymbolDiff {
target_symbol: Some(left_symbol_ref),
match_percent: Some(percent),
diff_score: None,
instruction_rows: vec![],
..Default::default()
},
))
}
pub fn symbol_name_matches(left_name: &str, right_name: &str) -> bool {
// Match Metrowerks symbol$1234 against symbol$2345
// and GCC symbol.1234 against symbol.2345
if let Some((prefix, suffix)) = left_name.split_once(['$', '.']) {
if !suffix.chars().all(char::is_numeric) {
return false;
}
right_name
.split_once(['$', '.'])
.is_some_and(|(p, s)| p == prefix && s.chars().all(char::is_numeric))
} else {
left_name == right_name
}
}
fn reloc_eq(
left_obj: &Object,
right_obj: &Object,
@@ -45,19 +60,15 @@ fn reloc_eq(
return false;
}
let symbol_name_addend_matches =
left.symbol.name == right.symbol.name && left.relocation.addend == right.relocation.addend;
let symbol_name_addend_matches = symbol_name_matches(&left.symbol.name, &right.symbol.name)
&& left.relocation.addend == right.relocation.addend;
match (left.symbol.section, right.symbol.section) {
(Some(sl), Some(sr)) => {
// Match if section and name+addend or address match
section_name_eq(left_obj, right_obj, sl, sr)
&& (symbol_name_addend_matches || address_eq(left, right))
}
(None, Some(_)) => {
// Match if possibly stripped weak symbol
symbol_name_addend_matches && right.symbol.flags.contains(SymbolFlag::Weak)
}
(Some(_), None) | (None, None) => symbol_name_addend_matches,
(Some(_), None) | (None, Some(_)) | (None, None) => symbol_name_addend_matches,
}
}
@@ -70,7 +81,77 @@ pub fn resolve_relocation<'obj>(
ResolvedRelocation { relocation: reloc, symbol }
}
/// Compares relocations contained with a certain data range.
/// Compares the bytes within a certain data range.
fn diff_data_range(left_data: &[u8], right_data: &[u8]) -> (f32, Vec<DataDiff>, Vec<DataDiff>) {
let ops = capture_diff_slices(Algorithm::Patience, left_data, right_data);
let bytes_match_ratio = get_diff_ratio(&ops, left_data.len(), right_data.len());
let mut left_data_diff = Vec::<DataDiff>::new();
let mut right_data_diff = Vec::<DataDiff>::new();
for op in ops {
let (tag, left_range, right_range) = op.as_tag_tuple();
let left_len = left_range.len();
let right_len = right_range.len();
let mut len = left_len.max(right_len);
let kind = match tag {
similar::DiffTag::Equal => DataDiffKind::None,
similar::DiffTag::Delete => DataDiffKind::Delete,
similar::DiffTag::Insert => DataDiffKind::Insert,
similar::DiffTag::Replace => {
// Ensure replacements are equal length
len = left_len.min(right_len);
DataDiffKind::Replace
}
};
let left_data = &left_data[left_range];
let right_data = &right_data[right_range];
left_data_diff.push(DataDiff {
data: left_data[..len.min(left_data.len())].to_vec(),
kind,
size: len,
});
right_data_diff.push(DataDiff {
data: right_data[..len.min(right_data.len())].to_vec(),
kind,
size: len,
});
if kind == DataDiffKind::Replace {
match left_len.cmp(&right_len) {
Ordering::Less => {
let len = right_len - left_len;
left_data_diff.push(DataDiff {
data: vec![],
kind: DataDiffKind::Insert,
size: len,
});
right_data_diff.push(DataDiff {
data: right_data[left_len..right_len].to_vec(),
kind: DataDiffKind::Insert,
size: len,
});
}
Ordering::Greater => {
let len = left_len - right_len;
left_data_diff.push(DataDiff {
data: left_data[right_len..left_len].to_vec(),
kind: DataDiffKind::Delete,
size: len,
});
right_data_diff.push(DataDiff {
data: vec![],
kind: DataDiffKind::Delete,
size: len,
});
}
Ordering::Equal => {}
}
}
}
(bytes_match_ratio, left_data_diff, right_data_diff)
}
/// Compares relocations contained within a certain data range.
fn diff_data_relocs_for_range<'left, 'right>(
left_obj: &'left Object,
right_obj: &'right Object,
@@ -127,6 +208,29 @@ fn diff_data_relocs_for_range<'left, 'right>(
diffs
}
pub fn no_diff_data_section(obj: &Object, section_idx: usize) -> Result<SectionDiff> {
let section = &obj.sections[section_idx];
let data_diff = vec![DataDiff {
data: section.data.0.clone(),
kind: DataDiffKind::None,
size: section.data.len(),
}];
let mut reloc_diffs = Vec::new();
for reloc in section.relocations.iter() {
let reloc_len = obj.arch.data_reloc_size(reloc.flags);
let range = reloc.address..reloc.address + reloc_len as u64;
reloc_diffs.push(DataRelocationDiff {
reloc: reloc.clone(),
kind: DataDiffKind::None,
range,
});
}
Ok(SectionDiff { match_percent: Some(0.0), data_diff, reloc_diff: reloc_diffs })
}
/// Compare the data sections of two object files.
pub fn diff_data_section(
left_obj: &Object,
@@ -150,76 +254,10 @@ pub fn diff_data_section(
.min(right_section.size);
let left_data = &left_section.data[..left_max as usize];
let right_data = &right_section.data[..right_max as usize];
let ops = capture_diff_slices(Algorithm::Patience, left_data, right_data);
let match_percent = get_diff_ratio(&ops, left_data.len(), right_data.len()) * 100.0;
let mut left_data_diff = Vec::<DataDiff>::new();
let mut right_data_diff = Vec::<DataDiff>::new();
for op in ops {
let (tag, left_range, right_range) = op.as_tag_tuple();
let left_len = left_range.len();
let right_len = right_range.len();
let mut len = left_len.max(right_len);
let kind = match tag {
similar::DiffTag::Equal => DataDiffKind::None,
similar::DiffTag::Delete => DataDiffKind::Delete,
similar::DiffTag::Insert => DataDiffKind::Insert,
similar::DiffTag::Replace => {
// Ensure replacements are equal length
len = left_len.min(right_len);
DataDiffKind::Replace
}
};
let left_data = &left_section.data[left_range];
let right_data = &right_section.data[right_range];
left_data_diff.push(DataDiff {
data: left_data[..len.min(left_data.len())].to_vec(),
kind,
len,
..Default::default()
});
right_data_diff.push(DataDiff {
data: right_data[..len.min(right_data.len())].to_vec(),
kind,
len,
..Default::default()
});
if kind == DataDiffKind::Replace {
match left_len.cmp(&right_len) {
Ordering::Less => {
let len = right_len - left_len;
left_data_diff.push(DataDiff {
data: vec![],
kind: DataDiffKind::Insert,
len,
..Default::default()
});
right_data_diff.push(DataDiff {
data: right_data[left_len..right_len].to_vec(),
kind: DataDiffKind::Insert,
len,
..Default::default()
});
}
Ordering::Greater => {
let len = left_len - right_len;
left_data_diff.push(DataDiff {
data: left_data[right_len..left_len].to_vec(),
kind: DataDiffKind::Delete,
len,
..Default::default()
});
right_data_diff.push(DataDiff {
data: vec![],
kind: DataDiffKind::Delete,
len,
..Default::default()
});
}
Ordering::Equal => {}
}
}
}
let (bytes_match_ratio, left_data_diff, right_data_diff) =
diff_data_range(left_data, right_data);
let match_percent = bytes_match_ratio * 100.0;
let mut left_reloc_diffs = Vec::new();
let mut right_reloc_diffs = Vec::new();
@@ -233,8 +271,7 @@ pub fn diff_data_section(
) {
if let Some(left_reloc) = left_reloc {
let len = left_obj.arch.data_reloc_size(left_reloc.relocation.flags);
let range = left_reloc.relocation.address as usize
..left_reloc.relocation.address as usize + len;
let range = left_reloc.relocation.address..left_reloc.relocation.address + len as u64;
left_reloc_diffs.push(DataRelocationDiff {
reloc: left_reloc.relocation.clone(),
kind: diff_kind,
@@ -243,8 +280,7 @@ pub fn diff_data_section(
}
if let Some(right_reloc) = right_reloc {
let len = right_obj.arch.data_reloc_size(right_reloc.relocation.flags);
let range = right_reloc.relocation.address as usize
..right_reloc.relocation.address as usize + len;
let range = right_reloc.relocation.address..right_reloc.relocation.address + len as u64;
right_reloc_diffs.push(DataRelocationDiff {
reloc: right_reloc.relocation.clone(),
kind: diff_kind,
@@ -278,6 +314,57 @@ pub fn diff_data_section(
Ok((left_section_diff, right_section_diff))
}
pub fn no_diff_data_symbol(obj: &Object, symbol_index: usize) -> Result<SymbolDiff> {
let symbol = &obj.symbols[symbol_index];
let section_idx = symbol.section.ok_or_else(|| anyhow!("Data symbol section not found"))?;
let section = &obj.sections[section_idx];
let start = symbol
.address
.checked_sub(section.address)
.ok_or_else(|| anyhow!("Symbol address out of section bounds"))?;
let end = start + symbol.size;
if end > section.size {
return Err(anyhow!(
"Symbol {} size out of section bounds ({} > {})",
symbol.name,
end,
section.size
));
}
let range = start as usize..end as usize;
let data = &section.data[range.clone()];
let data_diff = vec![DataDiff {
data: data.to_vec(),
kind: DataDiffKind::None,
size: symbol.size as usize,
}];
let mut reloc_diffs = Vec::new();
for reloc in section.relocations.iter() {
if !range.contains(&(reloc.address as usize)) {
continue;
}
let reloc_len = obj.arch.data_reloc_size(reloc.flags);
let range = reloc.address..reloc.address + reloc_len as u64;
reloc_diffs.push(DataRelocationDiff {
reloc: reloc.clone(),
kind: DataDiffKind::None,
range,
});
}
let data_rows = build_data_diff_rows(&data_diff, &reloc_diffs, symbol.address);
Ok(SymbolDiff {
target_symbol: None,
match_percent: None,
diff_score: None,
data_rows,
..Default::default()
})
}
pub fn diff_data_symbol(
left_obj: &Object,
right_obj: &Object,
@@ -326,6 +413,9 @@ pub fn diff_data_symbol(
let left_data = &left_section.data[left_range.clone()];
let right_data = &right_section.data[right_range.clone()];
let (bytes_match_ratio, left_data_diff, right_data_diff) =
diff_data_range(left_data, right_data);
let reloc_diffs = diff_data_relocs_for_range(
left_obj,
right_obj,
@@ -335,10 +425,9 @@ pub fn diff_data_symbol(
right_range,
);
let ops = capture_diff_slices(Algorithm::Patience, left_data, right_data);
let bytes_match_ratio = get_diff_ratio(&ops, left_data.len(), right_data.len());
let mut match_ratio = bytes_match_ratio;
let mut left_reloc_diffs = Vec::new();
let mut right_reloc_diffs = Vec::new();
if !reloc_diffs.is_empty() {
let mut total_reloc_bytes = 0;
let mut matching_reloc_bytes = 0;
@@ -354,6 +443,27 @@ pub fn diff_data_symbol(
if diff_kind == DataDiffKind::None {
matching_reloc_bytes += reloc_diff_len;
}
if let Some(left_reloc) = left_reloc {
let len = left_obj.arch.data_reloc_size(left_reloc.relocation.flags);
let range =
left_reloc.relocation.address..left_reloc.relocation.address + len as u64;
left_reloc_diffs.push(DataRelocationDiff {
reloc: left_reloc.relocation.clone(),
kind: diff_kind,
range,
});
}
if let Some(right_reloc) = right_reloc {
let len = right_obj.arch.data_reloc_size(right_reloc.relocation.flags);
let range =
right_reloc.relocation.address..right_reloc.relocation.address + len as u64;
right_reloc_diffs.push(DataRelocationDiff {
reloc: right_reloc.relocation.clone(),
kind: diff_kind,
range,
});
}
}
if total_reloc_bytes > 0 {
let relocs_match_ratio = matching_reloc_bytes as f32 / total_reloc_bytes as f32;
@@ -368,20 +478,30 @@ pub fn diff_data_symbol(
}
}
left_reloc_diffs
.sort_by(|a, b| a.range.start.cmp(&b.range.start).then(a.range.end.cmp(&b.range.end)));
right_reloc_diffs
.sort_by(|a, b| a.range.start.cmp(&b.range.start).then(a.range.end.cmp(&b.range.end)));
let match_percent = match_ratio * 100.0;
let left_rows = build_data_diff_rows(&left_data_diff, &left_reloc_diffs, left_symbol.address);
let right_rows =
build_data_diff_rows(&right_data_diff, &right_reloc_diffs, right_symbol.address);
Ok((
SymbolDiff {
target_symbol: Some(right_symbol_idx),
match_percent: Some(match_percent),
diff_score: None,
instruction_rows: vec![],
data_rows: left_rows,
..Default::default()
},
SymbolDiff {
target_symbol: Some(left_symbol_idx),
match_percent: Some(match_percent),
diff_score: None,
instruction_rows: vec![],
data_rows: right_rows,
..Default::default()
},
))
}
@@ -415,6 +535,10 @@ pub fn diff_generic_section(
))
}
pub fn no_diff_bss_section() -> Result<SectionDiff> {
Ok(SectionDiff { match_percent: Some(0.0), data_diff: vec![], reloc_diff: vec![] })
}
/// Compare the addresses and sizes of each symbol in the BSS sections.
pub fn diff_bss_section(
left_obj: &Object,
@@ -467,3 +591,68 @@ fn symbols_matching_section(
&& !s.flags.contains(SymbolFlag::Ignored)
})
}
pub const BYTES_PER_ROW: usize = 16;
fn build_data_diff_row(
data_diffs: &[DataDiff],
reloc_diffs: &[DataRelocationDiff],
symbol_address: u64,
row_index: usize,
) -> DataDiffRow {
let row_start = row_index * BYTES_PER_ROW;
let row_end = row_start + BYTES_PER_ROW;
let mut row_diff = DataDiffRow {
address: symbol_address + row_start as u64,
segments: Vec::new(),
relocations: Vec::new(),
};
// Collect all segments that overlap with this row
let mut current_offset = 0;
for diff in data_diffs {
let diff_end = current_offset + diff.size;
if current_offset < row_end && diff_end > row_start {
let start_in_diff = row_start.saturating_sub(current_offset);
let end_in_diff = row_end.min(diff_end) - current_offset;
if start_in_diff < end_in_diff {
let data_slice = if diff.data.is_empty() {
Vec::new()
} else {
diff.data[start_in_diff..end_in_diff.min(diff.data.len())].to_vec()
};
row_diff.segments.push(DataDiff {
data: data_slice,
kind: diff.kind,
size: end_in_diff - start_in_diff,
});
}
}
current_offset = diff_end;
if current_offset >= row_start + BYTES_PER_ROW {
break;
}
}
// Collect all relocations that overlap with this row
let row_end_absolute = row_diff.address + BYTES_PER_ROW as u64;
row_diff.relocations = reloc_diffs
.iter()
.filter(|rd| rd.range.start < row_end_absolute && rd.range.end > row_diff.address)
.cloned()
.collect();
row_diff
}
fn build_data_diff_rows(
segments: &[DataDiff],
relocations: &[DataRelocationDiff],
symbol_address: u64,
) -> Vec<DataDiffRow> {
let total_len = segments.iter().map(|s| s.size as u64).sum::<u64>();
let num_rows = total_len.div_ceil(BYTES_PER_ROW as u64) as usize;
(0..num_rows)
.map(|row_index| build_data_diff_row(segments, relocations, symbol_address, row_index))
.collect()
}

View File

@@ -0,0 +1,49 @@
use alloc::string::String;
use crate::diff::Demangler;
#[cfg(feature = "demangler")]
impl Demangler {
pub fn demangle(&self, name: &str) -> Option<String> {
match self {
Demangler::None => None,
Demangler::Codewarrior => Self::demangle_codewarrior(name),
Demangler::Msvc => Self::demangle_msvc(name),
Demangler::Itanium => Self::demangle_itanium(name),
Demangler::GnuLegacy => Self::demangle_gnu_legacy(name),
Demangler::Auto => {
// Try to guess
if name.starts_with('?') {
Self::demangle_msvc(name)
} else {
Self::demangle_codewarrior(name)
.or_else(|| Self::demangle_gnu_legacy(name))
.or_else(|| Self::demangle_itanium(name))
}
}
}
}
fn demangle_codewarrior(name: &str) -> Option<String> {
cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default())
}
fn demangle_msvc(name: &str) -> Option<String> {
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
}
fn demangle_itanium(name: &str) -> Option<String> {
let name = name.trim_start_matches('.');
cpp_demangle::Symbol::new(name).ok().and_then(|s| s.demangle().ok())
}
fn demangle_gnu_legacy(name: &str) -> Option<String> {
let name = name.trim_start_matches('.');
gnuv2_demangle::demangle(name, &gnuv2_demangle::DemangleConfig::new()).ok()
}
}
#[cfg(not(feature = "demangler"))]
impl Demangler {
pub fn demangle(&self, _name: &str) -> Option<String> { None }
}

View File

@@ -12,7 +12,10 @@ use itertools::Itertools;
use regex::Regex;
use crate::{
diff::{DiffObjConfig, InstructionDiffKind, InstructionDiffRow, ObjectDiff, SymbolDiff},
diff::{
DataDiffKind, DataDiffRow, DiffObjConfig, InstructionDiffKind, InstructionDiffRow,
ObjectDiff, SymbolDiff, data::resolve_relocation,
},
obj::{
FlowAnalysisValue, InstructionArg, InstructionArgValue, Object, ParsedInstruction,
ResolvedInstructionRef, ResolvedRelocation, SectionFlag, SectionKind, Symbol, SymbolFlag,
@@ -178,7 +181,7 @@ pub fn display_row(
}
cb(DiffTextSegment {
text: DiffText::Address(ins_ref.address.saturating_sub(resolved.symbol.address)),
color: base_color,
color: DiffTextColor::Dim,
pad_to: 5,
})?;
if let Some(branch) = &ins_row.branch_from {
@@ -379,7 +382,9 @@ pub enum HoverItem {
}
pub fn symbol_context(obj: &Object, symbol_index: usize) -> Vec<ContextItem> {
let symbol = &obj.symbols[symbol_index];
let Some(symbol) = obj.symbols.get(symbol_index) else {
return Vec::new();
};
let mut out = Vec::new();
out.push(ContextItem::Copy { value: symbol.name.clone(), label: None });
if let Some(name) = &symbol.demangled_name {
@@ -403,7 +408,9 @@ pub fn symbol_hover(
addend: i64,
override_color: Option<HoverItemColor>,
) -> Vec<HoverItem> {
let symbol = &obj.symbols[symbol_index];
let Some(symbol) = obj.symbols.get(symbol_index) else {
return Vec::new();
};
let addend_str = match addend.cmp(&0i64) {
Ordering::Greater => format!("+{addend:x}"),
Ordering::Less => format!("-{:x}", -addend),
@@ -490,6 +497,57 @@ pub fn relocation_context(
out
}
pub fn data_row_hover(obj: &Object, diff_row: &DataDiffRow) -> Vec<HoverItem> {
let mut out = Vec::new();
let mut prev_reloc = None;
let mut first = true;
for reloc_diff in diff_row.relocations.iter() {
let reloc = &reloc_diff.reloc;
if prev_reloc == Some(reloc) {
// Avoid showing consecutive duplicate relocations.
// We do this because a single relocation can span across multiple diffs if the
// bytes in the relocation changed (e.g. first byte is added, second is unchanged).
continue;
}
prev_reloc = Some(reloc);
if first {
first = false;
} else {
out.push(HoverItem::Separator);
}
let reloc = resolve_relocation(&obj.symbols, reloc);
let color = match reloc_diff.kind {
DataDiffKind::None => HoverItemColor::Normal,
DataDiffKind::Replace => HoverItemColor::Special,
DataDiffKind::Delete => HoverItemColor::Delete,
DataDiffKind::Insert => HoverItemColor::Insert,
};
out.append(&mut relocation_hover(obj, reloc, Some(color)));
}
out
}
pub fn data_row_context(obj: &Object, diff_row: &DataDiffRow) -> Vec<ContextItem> {
let mut out = Vec::new();
let mut prev_reloc = None;
for reloc_diff in diff_row.relocations.iter() {
let reloc = &reloc_diff.reloc;
if prev_reloc == Some(reloc) {
// Avoid showing consecutive duplicate relocations.
// We do this because a single relocation can span across multiple diffs if the
// bytes in the relocation changed (e.g. first byte is added, second is unchanged).
continue;
}
prev_reloc = Some(reloc);
let reloc = resolve_relocation(&obj.symbols, reloc);
out.append(&mut relocation_context(obj, reloc, None));
}
out
}
pub fn relocation_hover(
obj: &Object,
reloc: ResolvedRelocation,
@@ -673,6 +731,7 @@ pub struct SectionDisplay {
pub size: u64,
pub match_percent: Option<f32>,
pub symbols: Vec<SectionDisplaySymbol>,
pub kind: SectionKind,
}
pub fn display_sections(
@@ -751,6 +810,7 @@ pub fn display_sections(
size: section.size,
match_percent: section_diff.match_percent,
symbols,
kind: section.kind,
});
} else {
// Don't sort, preserve order of absolute symbols
@@ -760,6 +820,7 @@ pub fn display_sections(
size: 0,
match_percent: None,
symbols,
kind: SectionKind::Common,
});
}
}

View File

@@ -13,7 +13,8 @@ use crate::{
code::{diff_code, no_diff_code},
data::{
diff_bss_section, diff_bss_symbol, diff_data_section, diff_data_symbol,
diff_generic_section,
diff_generic_section, no_diff_bss_section, no_diff_data_section, no_diff_data_symbol,
symbol_name_matches,
},
},
obj::{InstructionRef, Object, Relocation, SectionKind, Symbol, SymbolFlag},
@@ -21,6 +22,7 @@ use crate::{
pub mod code;
pub mod data;
pub mod demangler;
pub mod display;
include!(concat!(env!("OUT_DIR"), "/config.gen.rs"));
@@ -44,6 +46,7 @@ pub struct SymbolDiff {
pub match_percent: Option<f32>,
pub diff_score: Option<(u64, u64)>,
pub instruction_rows: Vec<InstructionDiffRow>,
pub data_rows: Vec<DataDiffRow>,
}
#[derive(Debug, Clone, Default)]
@@ -80,16 +83,15 @@ pub enum InstructionDiffKind {
#[derive(Debug, Clone, Default)]
pub struct DataDiff {
pub data: Vec<u8>,
pub size: usize,
pub kind: DataDiffKind,
pub len: usize,
pub symbol: String,
}
#[derive(Debug, Clone)]
pub struct DataRelocationDiff {
pub reloc: Relocation,
pub range: Range<u64>,
pub kind: DataDiffKind,
pub range: Range<usize>,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)]
@@ -101,6 +103,13 @@ pub enum DataDiffKind {
Insert,
}
#[derive(Debug, Clone, Default)]
pub struct DataDiffRow {
pub address: u64,
pub segments: Vec<DataDiff>,
pub relocations: Vec<DataRelocationDiff>,
}
/// Index of the argument diff for coloring.
#[repr(transparent)]
#[derive(Debug, Copy, Clone, Default)]
@@ -163,7 +172,7 @@ impl ObjectDiff {
target_symbol: None,
match_percent: None,
diff_score: None,
instruction_rows: vec![],
..Default::default()
});
}
for _ in obj.sections.iter() {
@@ -262,7 +271,11 @@ pub fn diff_objs(
left_out.symbols[left_symbol_ref] =
no_diff_code(left_obj, left_symbol_ref, diff_config)?;
}
SectionKind::Data | SectionKind::Bss | SectionKind::Common => {
SectionKind::Data => {
left_out.symbols[left_symbol_ref] =
no_diff_data_symbol(left_obj, left_symbol_ref)?;
}
SectionKind::Bss | SectionKind::Common => {
// Nothing needs to be done
}
SectionKind::Unknown => unreachable!(),
@@ -275,7 +288,11 @@ pub fn diff_objs(
right_out.symbols[right_symbol_ref] =
no_diff_code(right_obj, right_symbol_ref, diff_config)?;
}
SectionKind::Data | SectionKind::Bss | SectionKind::Common => {
SectionKind::Data => {
right_out.symbols[right_symbol_ref] =
no_diff_data_symbol(right_obj, right_symbol_ref)?;
}
SectionKind::Bss | SectionKind::Common => {
// Nothing needs to be done
}
SectionKind::Unknown => unreachable!(),
@@ -288,52 +305,84 @@ pub fn diff_objs(
}
for section_match in section_matches {
if let SectionMatch {
left: Some(left_section_idx),
right: Some(right_section_idx),
section_kind,
} = section_match
{
let (left_obj, left_out) = left.as_mut().unwrap();
let (right_obj, right_out) = right.as_mut().unwrap();
match section_kind {
SectionKind::Code => {
let (left_diff, right_diff) = diff_generic_section(
left_obj,
right_obj,
left_out,
right_out,
left_section_idx,
right_section_idx,
)?;
left_out.sections[left_section_idx] = left_diff;
right_out.sections[right_section_idx] = right_diff;
match section_match {
SectionMatch {
left: Some(left_section_idx),
right: Some(right_section_idx),
section_kind,
} => {
let (left_obj, left_out) = left.as_mut().unwrap();
let (right_obj, right_out) = right.as_mut().unwrap();
match section_kind {
SectionKind::Code => {
let (left_diff, right_diff) = diff_generic_section(
left_obj,
right_obj,
left_out,
right_out,
left_section_idx,
right_section_idx,
)?;
left_out.sections[left_section_idx] = left_diff;
right_out.sections[right_section_idx] = right_diff;
}
SectionKind::Data => {
let (left_diff, right_diff) = diff_data_section(
left_obj,
right_obj,
left_out,
right_out,
left_section_idx,
right_section_idx,
)?;
left_out.sections[left_section_idx] = left_diff;
right_out.sections[right_section_idx] = right_diff;
}
SectionKind::Bss | SectionKind::Common => {
let (left_diff, right_diff) = diff_bss_section(
left_obj,
right_obj,
left_out,
right_out,
left_section_idx,
right_section_idx,
)?;
left_out.sections[left_section_idx] = left_diff;
right_out.sections[right_section_idx] = right_diff;
}
SectionKind::Unknown => unreachable!(),
}
SectionKind::Data => {
let (left_diff, right_diff) = diff_data_section(
left_obj,
right_obj,
left_out,
right_out,
left_section_idx,
right_section_idx,
)?;
left_out.sections[left_section_idx] = left_diff;
right_out.sections[right_section_idx] = right_diff;
}
SectionMatch { left: Some(left_section_idx), right: None, section_kind } => {
let (left_obj, left_out) = left.as_mut().unwrap();
match section_kind {
SectionKind::Code => {}
SectionKind::Data => {
left_out.sections[left_section_idx] =
no_diff_data_section(left_obj, left_section_idx)?;
}
SectionKind::Bss | SectionKind::Common => {
left_out.sections[left_section_idx] = no_diff_bss_section()?;
}
SectionKind::Unknown => unreachable!(),
}
SectionKind::Bss | SectionKind::Common => {
let (left_diff, right_diff) = diff_bss_section(
left_obj,
right_obj,
left_out,
right_out,
left_section_idx,
right_section_idx,
)?;
left_out.sections[left_section_idx] = left_diff;
right_out.sections[right_section_idx] = right_diff;
}
SectionMatch { left: None, right: Some(right_section_idx), section_kind } => {
let (right_obj, right_out) = right.as_mut().unwrap();
match section_kind {
SectionKind::Code => {}
SectionKind::Data => {
right_out.sections[right_section_idx] =
no_diff_data_section(right_obj, right_section_idx)?;
}
SectionKind::Bss | SectionKind::Common => {
right_out.sections[right_section_idx] = no_diff_bss_section()?;
}
SectionKind::Unknown => unreachable!(),
}
SectionKind::Unknown => unreachable!(),
}
SectionMatch { left: None, right: None, .. } => {
// Should not happen
}
}
}
@@ -543,47 +592,60 @@ fn matching_symbols(
&mut matches,
)?;
}
for (symbol_idx, symbol) in left.symbols.iter().enumerate() {
if symbol.size == 0 || symbol.flags.contains(SymbolFlag::Ignored) {
continue;
}
let section_kind = symbol_section_kind(left, symbol);
if section_kind == SectionKind::Unknown {
continue;
}
if left_used.contains(&symbol_idx) {
continue;
}
let symbol_match = SymbolMatch {
left: Some(symbol_idx),
right: find_symbol(right, left, symbol, Some(&right_used)),
prev: find_symbol(prev, left, symbol, None),
section_kind,
};
matches.push(symbol_match);
if let Some(right) = symbol_match.right {
right_used.insert(right);
// Do two passes for nameless literals. The first only pairs up perfect matches to ensure
// those are correct first, while the second pass catches near matches.
for fuzzy_literals in [false, true] {
for (symbol_idx, symbol) in left.symbols.iter().enumerate() {
if symbol.size == 0 || symbol.flags.contains(SymbolFlag::Ignored) {
continue;
}
let section_kind = symbol_section_kind(left, symbol);
if section_kind == SectionKind::Unknown {
continue;
}
if left_used.contains(&symbol_idx) {
continue;
}
let symbol_match = SymbolMatch {
left: Some(symbol_idx),
right: find_symbol(right, left, symbol_idx, Some(&right_used), fuzzy_literals),
prev: find_symbol(prev, left, symbol_idx, None, fuzzy_literals),
section_kind,
};
matches.push(symbol_match);
if let Some(right) = symbol_match.right {
left_used.insert(symbol_idx);
right_used.insert(right);
}
}
}
}
if let Some(right) = right {
for (symbol_idx, symbol) in right.symbols.iter().enumerate() {
if symbol.size == 0 || symbol.flags.contains(SymbolFlag::Ignored) {
continue;
// Do two passes for nameless literals. The first only pairs up perfect matches to ensure
// those are correct first, while the second pass catches near matches.
for fuzzy_literals in [false, true] {
for (symbol_idx, symbol) in right.symbols.iter().enumerate() {
if symbol.size == 0 || symbol.flags.contains(SymbolFlag::Ignored) {
continue;
}
let section_kind = symbol_section_kind(right, symbol);
if section_kind == SectionKind::Unknown {
continue;
}
if right_used.contains(&symbol_idx) {
continue;
}
let symbol_match = SymbolMatch {
left: None,
right: Some(symbol_idx),
prev: find_symbol(prev, right, symbol_idx, None, fuzzy_literals),
section_kind,
};
matches.push(symbol_match);
if symbol_match.prev.is_some() {
right_used.insert(symbol_idx);
}
}
let section_kind = symbol_section_kind(right, symbol);
if section_kind == SectionKind::Unknown {
continue;
}
if right_used.contains(&symbol_idx) {
continue;
}
matches.push(SymbolMatch {
left: None,
right: Some(symbol_idx),
prev: find_symbol(prev, right, symbol, None),
section_kind,
});
}
}
Ok(matches)
@@ -605,7 +667,10 @@ where
fn symbol_section<'obj>(obj: &'obj Object, symbol: &Symbol) -> Option<(&'obj str, SectionKind)> {
if let Some(section) = symbol.section.and_then(|section_idx| obj.sections.get(section_idx)) {
Some((section.name.as_str(), section.kind))
// Match x86 .rdata$r against .rdata$rs
let section_name =
section.name.split_once('$').map_or(section.name.as_str(), |(prefix, _)| prefix);
Some((section_name, section.kind))
} else if symbol.flags.contains(SymbolFlag::Common) {
Some((".comm", SectionKind::Common))
} else {
@@ -621,52 +686,94 @@ fn symbol_section_kind(obj: &Object, symbol: &Symbol) -> SectionKind {
}
}
/// Check if a symbol is a compiler-generated like @1234 or _$E1234.
fn is_symbol_compiler_generated(symbol: &Symbol) -> bool {
if symbol.name.starts_with('@') && symbol.name[1..].chars().all(char::is_numeric) {
// Exclude @stringBase0, @GUARD@, etc.
return true;
}
if symbol.name.starts_with("_$E") && symbol.name[3..].chars().all(char::is_numeric) {
return true;
}
false
}
fn find_symbol(
obj: Option<&Object>,
in_obj: &Object,
in_symbol: &Symbol,
in_symbol_idx: usize,
used: Option<&BTreeSet<usize>>,
fuzzy_literals: bool,
) -> Option<usize> {
let in_symbol = &in_obj.symbols[in_symbol_idx];
let obj = obj?;
let (section_name, section_kind) = symbol_section(in_obj, in_symbol)?;
// Match compiler-generated symbols against each other (e.g. @251 -> @60)
// If they are in the same section and have the same value
if is_symbol_compiler_generated(in_symbol)
&& matches!(section_kind, SectionKind::Code | SectionKind::Data | SectionKind::Bss)
{
let mut closest_match_symbol_idx = None;
let mut closest_match_percent = 0.0;
for (symbol_idx, symbol) in unmatched_symbols(obj, used) {
let Some(section_index) = symbol.section else {
continue;
};
if obj.sections[section_index].name != section_name {
continue;
}
if !is_symbol_compiler_generated(symbol) {
continue;
}
match section_kind {
SectionKind::Data | SectionKind::Code => {
// For code or data, pick the first symbol with exactly matching bytes and relocations.
// If no symbols match exactly, and `fuzzy_literals` is true, pick the closest
// plausible match instead.
if let Ok((left_diff, _right_diff)) =
diff_data_symbol(in_obj, obj, in_symbol_idx, symbol_idx)
&& let Some(match_percent) = left_diff.match_percent
&& (match_percent == 100.0
|| (fuzzy_literals
&& match_percent >= 50.0
&& match_percent > closest_match_percent))
{
closest_match_symbol_idx = Some(symbol_idx);
closest_match_percent = match_percent;
if match_percent == 100.0 {
break;
}
}
}
SectionKind::Bss => {
// For BSS, pick the first symbol that has the exact matching size.
if in_symbol.size == symbol.size {
closest_match_symbol_idx = Some(symbol_idx);
break;
}
}
_ => unreachable!(),
}
}
return closest_match_symbol_idx;
}
// Try to find an exact name match
if let Some((symbol_idx, _)) = unmatched_symbols(obj, used).find(|(_, symbol)| {
symbol.name == in_symbol.name && symbol_section_kind(obj, symbol) == section_kind
}) {
return Some(symbol_idx);
}
// Match compiler-generated symbols against each other (e.g. @251 -> @60)
// If they are at the same address in the same section
if in_symbol.name.starts_with('@')
&& matches!(section_kind, SectionKind::Data | SectionKind::Bss)
&& let Some((symbol_idx, _)) = unmatched_symbols(obj, used).find(|(_, symbol)| {
let Some(section_index) = symbol.section else {
return false;
};
symbol.name.starts_with('@')
&& symbol.address == in_symbol.address
&& obj.sections[section_index].name == section_name
})
{
if let Some((symbol_idx, _)) = unmatched_symbols(obj, used).find(|&(_, symbol)| {
symbol_name_matches(&in_symbol.name, &symbol.name)
&& symbol_section_kind(obj, symbol) == section_kind
&& symbol_section(obj, symbol).is_some_and(|(name, _)| name == section_name)
}) {
return Some(symbol_idx);
}
// Match Metrowerks symbol$1234 against symbol$2345
if let Some((prefix, suffix)) = in_symbol.name.split_once('$') {
if !suffix.chars().all(char::is_numeric) {
return None;
}
if let Some((symbol_idx, _)) = unmatched_symbols(obj, used).find(|&(_, symbol)| {
if let Some((p, s)) = symbol.name.split_once('$') {
prefix == p
&& s.chars().all(char::is_numeric)
&& symbol_section_kind(obj, symbol) == section_kind
} else {
false
}
}) {
return Some(symbol_idx);
}
}
None
}
@@ -717,3 +824,11 @@ fn find_section(
s.kind == section_kind && s.name == name && !matches.iter().any(|m| m.right == Some(i))
})
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum DiffSide {
/// The target/expected side of the diff.
Target,
/// The base side of the diff.
Base,
}

View File

@@ -170,13 +170,6 @@ pub enum JobResult {
CreateScratch(Option<Box<CreateScratchResult>>),
}
fn should_cancel(rx: &Receiver<()>) -> bool {
match rx.try_recv() {
Ok(_) | Err(TryRecvError::Disconnected) => true,
Err(_) => false,
}
}
fn start_job(
waker: Waker,
title: &str,
@@ -203,7 +196,6 @@ fn start_job(
}
});
let id = JOB_ID.fetch_add(1, Ordering::Relaxed);
// log::info!("Started job {}", id); TODO
JobState { id, kind, handle: Some(handle), context, cancel: tx }
}
@@ -228,3 +220,10 @@ fn update_status(
context.waker.wake_by_ref();
Ok(())
}
fn should_cancel(rx: &Receiver<()>) -> bool {
match rx.try_recv() {
Ok(_) | Err(TryRecvError::Disconnected) => true,
Err(_) => false,
}
}

View File

@@ -6,7 +6,7 @@ use typed_path::Utf8PlatformPathBuf;
use crate::{
build::{BuildConfig, BuildStatus, run_make},
diff::{DiffObjConfig, MappingConfig, ObjectDiff, diff_objs},
diff::{DiffObjConfig, DiffSide, MappingConfig, ObjectDiff, diff_objs},
jobs::{Job, JobContext, JobResult, JobState, start_job, update_status},
obj::{Object, read},
};
@@ -117,7 +117,7 @@ fn run_build(
&cancel,
)?;
step_idx += 1;
match read::read(target_path.as_ref(), &config.diff_obj_config) {
match read::read(target_path.as_ref(), &config.diff_obj_config, DiffSide::Target) {
Ok(obj) => Some(obj),
Err(e) => {
first_status = BuildStatus {
@@ -141,7 +141,7 @@ fn run_build(
Some(base_path) if second_status.success => {
update_status(context, format!("Loading base {base_path}"), step_idx, total, &cancel)?;
step_idx += 1;
match read::read(base_path.as_ref(), &config.diff_obj_config) {
match read::read(base_path.as_ref(), &config.diff_obj_config, DiffSide::Base) {
Ok(obj) => Some(obj),
Err(e) => {
second_status = BuildStatus {

View File

@@ -0,0 +1,401 @@
use alloc::vec::Vec;
use anyhow::{Context, Result, bail, ensure};
use object::{Endianness, Object, ObjectSection};
use super::{Section, SectionKind};
const HDRR_SIZE: usize = 0x60;
const FDR_SIZE: usize = 0x48;
const PDR_SIZE: usize = 0x34;
const SYMR_SIZE: usize = 0x0c;
const ST_PROC: u8 = 6;
const ST_STATICPROC: u8 = 14;
const ST_END: u8 = 8;
pub(super) fn parse_line_info_mdebug(
obj_file: &object::File,
sections: &mut [Section],
) -> Result<()> {
let Some(section) = obj_file.section_by_name(".mdebug") else {
return Ok(());
};
let data = section.data().context("failed to read .mdebug contents")?;
if data.len() < HDRR_SIZE {
return Ok(());
}
let section_file_offset = section.file_range().map(|(offset, _)| offset as usize);
let endianness = obj_file.endianness();
let header = Header::parse(data, endianness)?;
let symbols_data = slice_at(
data,
header.cb_sym_offset,
header.isym_max.checked_mul(SYMR_SIZE as u32).context("symbol table size overflow")?,
section_file_offset,
)?;
let symbols = parse_symbols(symbols_data, endianness)?;
let fdr_data = slice_at(
data,
header.cb_fd_offset,
header
.ifd_max
.checked_mul(FDR_SIZE as u32)
.context("file descriptor table size overflow")?,
section_file_offset,
)?;
for fdr_index in 0..header.ifd_max as usize {
let fdr_offset = fdr_index * FDR_SIZE;
let fdr = FileDescriptor::parse(&fdr_data[fdr_offset..fdr_offset + FDR_SIZE], endianness)?;
if fdr.cpd == 0 || fdr.csym == 0 {
continue;
}
let sym_base = fdr.isym_base as usize;
let sym_end = sym_base + fdr.csym as usize;
if sym_end > symbols.len() {
continue;
}
let Some(line_file_offset) = header.cb_line_offset.checked_add(fdr.cb_line_offset) else {
continue;
};
let Some(line_file_base) =
resolve_offset(line_file_offset, data.len(), section_file_offset)
else {
continue;
};
let Some(line_file_end) = line_file_base.checked_add(fdr.cb_line as usize) else {
continue;
};
if line_file_end > data.len() {
continue;
}
for local_proc_index in 0..fdr.cpd as usize {
let pdr_index = fdr.ipd_first as usize + local_proc_index;
let pdr_offset = header
.cb_pd_offset
.checked_add((pdr_index as u32) * PDR_SIZE as u32)
.context("procedure descriptor offset overflow")?;
let pdr_data = match slice_at(data, pdr_offset, PDR_SIZE as u32, section_file_offset) {
Ok(data) => data,
Err(_) => continue,
};
let pdr = ProcDescriptor::parse(pdr_data, endianness)?;
if pdr.isym as usize >= fdr.csym as usize {
continue;
}
let global_sym_index = sym_base + pdr.isym as usize;
let Some(start_symbol) = symbols.get(global_sym_index) else {
continue;
};
if start_symbol.st != ST_PROC && start_symbol.st != ST_STATICPROC {
continue;
}
let local_index = pdr.isym as u32;
let mut end_address = None;
for sym in &symbols[global_sym_index..sym_end] {
if sym.st == ST_END && sym.index == local_index {
end_address = Some(sym.value);
break;
}
}
let Some(end_address) = end_address else {
continue;
};
let Some(size) = end_address.checked_sub(start_symbol.value) else {
continue;
};
if size == 0 || size % 4 != 0 {
continue;
}
let word_count = (size / 4) as usize;
if word_count == 0 {
continue;
}
let Some(mut cursor) = line_file_base.checked_add(pdr.cb_line_offset as usize) else {
continue;
};
if cursor >= line_file_end {
continue;
}
let mut line_number = pdr.ln_low as i32;
let mut lines = Vec::with_capacity(word_count);
while lines.len() < word_count && cursor < line_file_end {
let b0 = data[cursor];
cursor += 1;
let count = (b0 & 0x0f) as usize + 1;
let delta = decode_delta(endianness, b0 >> 4, data, &mut cursor, line_file_end)?;
line_number = line_number.wrapping_add(delta as i32);
for _ in 0..count {
if lines.len() == word_count {
break;
}
lines.push(line_number);
}
}
if lines.len() != word_count {
continue;
}
assign_lines(sections, fdr.adr as u64 + pdr.addr as u64, &lines);
}
}
Ok(())
}
fn assign_lines(sections: &mut [Section], base_address: u64, lines: &[i32]) {
let mut address = base_address;
for &line in lines {
if line >= 0
&& let Some(section) = find_code_section(sections, address)
{
section.line_info.insert(address, line as u32);
}
address = address.wrapping_add(4);
}
}
fn find_code_section(sections: &mut [Section], address: u64) -> Option<&mut Section> {
sections.iter_mut().find(|section| {
section.kind == SectionKind::Code
&& address >= section.address
&& address < section.address + section.size
})
}
fn decode_delta(
endianness: Endianness,
nibble: u8,
data: &[u8],
cursor: &mut usize,
end: usize,
) -> Result<i32> {
if nibble == 8 {
ensure!(*cursor + 2 <= end, "extended delta out of range");
let bytes: [u8; 2] = data[*cursor..*cursor + 2].try_into().unwrap();
*cursor += 2;
Ok(match endianness {
Endianness::Big => i16::from_be_bytes(bytes) as i32,
Endianness::Little => i16::from_le_bytes(bytes) as i32,
})
} else {
let mut value = (nibble & 0x0f) as i32;
if value & 0x8 != 0 {
value -= 0x10;
}
Ok(value)
}
}
fn slice_at(
data: &[u8],
offset: u32,
size: u32,
section_file_offset: Option<usize>,
) -> Result<&[u8]> {
let size = size as usize;
if size == 0 {
ensure!(
resolve_offset(offset, data.len(), section_file_offset).is_some(),
"offset outside of .mdebug section"
);
return Ok(&data[0..0]);
}
let Some(offset) = resolve_offset(offset, data.len(), section_file_offset) else {
bail!("offset outside of .mdebug section");
};
let end = offset.checked_add(size).context("range overflow")?;
ensure!(end <= data.len(), "range exceeds .mdebug size");
Ok(&data[offset..end])
}
fn resolve_offset(
offset: u32,
data_len: usize,
section_file_offset: Option<usize>,
) -> Option<usize> {
let offset = offset as usize;
if offset <= data_len {
Some(offset)
} else if let Some(file_offset) = section_file_offset {
offset.checked_sub(file_offset).filter(|rel| *rel <= data_len)
} else {
None
}
}
#[derive(Clone, Copy)]
struct Header {
cb_line_offset: u32,
cb_pd_offset: u32,
cb_sym_offset: u32,
cb_fd_offset: u32,
isym_max: u32,
ifd_max: u32,
}
impl Header {
fn parse(data: &[u8], endianness: Endianness) -> Result<Self> {
ensure!(HDRR_SIZE <= data.len(), ".mdebug header truncated");
let mut cursor = 0;
let magic = read_u16(data, &mut cursor, endianness)?;
let _vstamp = read_u16(data, &mut cursor, endianness)?;
ensure!(magic == 0x7009, "unexpected .mdebug magic: {magic:#x}");
let _iline_max = read_u32(data, &mut cursor, endianness)?;
let _cb_line = read_u32(data, &mut cursor, endianness)?;
let cb_line_offset = read_u32(data, &mut cursor, endianness)?;
let _idn_max = read_u32(data, &mut cursor, endianness)?;
let _cb_dn_offset = read_u32(data, &mut cursor, endianness)?;
let _ipd_max = read_u32(data, &mut cursor, endianness)?;
let cb_pd_offset = read_u32(data, &mut cursor, endianness)?;
let isym_max = read_u32(data, &mut cursor, endianness)?;
let cb_sym_offset = read_u32(data, &mut cursor, endianness)?;
let _iopt_max = read_u32(data, &mut cursor, endianness)?;
let _cb_opt_offset = read_u32(data, &mut cursor, endianness)?;
let _iaux_max = read_u32(data, &mut cursor, endianness)?;
let _cb_aux_offset = read_u32(data, &mut cursor, endianness)?;
let _iss_max = read_u32(data, &mut cursor, endianness)?;
let _cb_ss_offset = read_u32(data, &mut cursor, endianness)?;
let _iss_ext_max = read_u32(data, &mut cursor, endianness)?;
let _cb_ss_ext_offset = read_u32(data, &mut cursor, endianness)?;
let ifd_max = read_u32(data, &mut cursor, endianness)?;
let cb_fd_offset = read_u32(data, &mut cursor, endianness)?;
let _crfd = read_u32(data, &mut cursor, endianness)?;
let _cb_rfd_offset = read_u32(data, &mut cursor, endianness)?;
let _iext_max = read_u32(data, &mut cursor, endianness)?;
let _cb_ext_offset = read_u32(data, &mut cursor, endianness)?;
Ok(Header { cb_line_offset, cb_pd_offset, cb_sym_offset, cb_fd_offset, isym_max, ifd_max })
}
}
#[derive(Clone, Copy)]
struct FileDescriptor {
adr: u32,
isym_base: u32,
csym: u32,
ipd_first: u16,
cpd: u16,
cb_line_offset: u32,
cb_line: u32,
}
impl FileDescriptor {
fn parse(data: &[u8], endianness: Endianness) -> Result<Self> {
ensure!(data.len() >= FDR_SIZE, "FDR truncated");
let mut cursor = 0;
let adr = read_u32(data, &mut cursor, endianness)?;
let _rss = read_u32(data, &mut cursor, endianness)?;
let _iss_base = read_u32(data, &mut cursor, endianness)?;
let _cb_ss = read_u32(data, &mut cursor, endianness)?;
let isym_base = read_u32(data, &mut cursor, endianness)?;
let csym = read_u32(data, &mut cursor, endianness)?;
let _iline_base = read_u32(data, &mut cursor, endianness)?;
let _cline = read_u32(data, &mut cursor, endianness)?;
let _iopt_base = read_u32(data, &mut cursor, endianness)?;
let _copt = read_u32(data, &mut cursor, endianness)?;
let ipd_first = read_u16(data, &mut cursor, endianness)?;
let cpd = read_u16(data, &mut cursor, endianness)?;
let _iaux_base = read_u32(data, &mut cursor, endianness)?;
let _caux = read_u32(data, &mut cursor, endianness)?;
let _rfd_base = read_u32(data, &mut cursor, endianness)?;
let _crfd = read_u32(data, &mut cursor, endianness)?;
let _bits = read_u32(data, &mut cursor, endianness)?;
let cb_line_offset = read_u32(data, &mut cursor, endianness)?;
let cb_line = read_u32(data, &mut cursor, endianness)?;
Ok(FileDescriptor { adr, isym_base, csym, ipd_first, cpd, cb_line_offset, cb_line })
}
}
#[derive(Clone, Copy)]
struct ProcDescriptor {
addr: u32,
isym: u32,
ln_low: i32,
cb_line_offset: u32,
}
impl ProcDescriptor {
fn parse(data: &[u8], endianness: Endianness) -> Result<Self> {
ensure!(data.len() >= PDR_SIZE, "PDR truncated");
let mut cursor = 0;
let addr = read_u32(data, &mut cursor, endianness)?;
let isym = read_u32(data, &mut cursor, endianness)?;
let _iline = read_u32(data, &mut cursor, endianness)?;
let _regmask = read_u32(data, &mut cursor, endianness)?;
let _regoffset = read_u32(data, &mut cursor, endianness)?;
let _iopt = read_u32(data, &mut cursor, endianness)?;
let _fregmask = read_u32(data, &mut cursor, endianness)?;
let _fregoffset = read_u32(data, &mut cursor, endianness)?;
let _frameoffset = read_u32(data, &mut cursor, endianness)?;
let _framereg = read_u16(data, &mut cursor, endianness)?;
let _pcreg = read_u16(data, &mut cursor, endianness)?;
let ln_low = read_i32(data, &mut cursor, endianness)?;
let _ln_high = read_i32(data, &mut cursor, endianness)?;
let cb_line_offset = read_u32(data, &mut cursor, endianness)?;
Ok(ProcDescriptor { addr, isym, ln_low, cb_line_offset })
}
}
#[derive(Clone, Copy)]
struct SymbolEntry {
value: u32,
st: u8,
index: u32,
}
fn parse_symbols(data: &[u8], endianness: Endianness) -> Result<Vec<SymbolEntry>> {
ensure!(data.len().is_multiple_of(SYMR_SIZE), "symbol table misaligned");
let mut symbols = Vec::with_capacity(data.len() / SYMR_SIZE);
let mut cursor = 0;
while cursor + SYMR_SIZE <= data.len() {
let _iss = read_u32(data, &mut cursor, endianness)?;
let value = read_u32(data, &mut cursor, endianness)?;
let bits = read_u32(data, &mut cursor, endianness)?;
let (st, index) = match endianness {
Endianness::Big => (((bits >> 26) & 0x3f) as u8, bits & 0x000f_ffff),
Endianness::Little => (((bits & 0x3f) as u8), (bits >> 12) & 0x000f_ffff),
};
symbols.push(SymbolEntry { value, st, index });
}
Ok(symbols)
}
fn read_u16(data: &[u8], cursor: &mut usize, endianness: Endianness) -> Result<u16> {
ensure!(*cursor + 2 <= data.len(), "unexpected EOF while reading u16");
let bytes: [u8; 2] = data[*cursor..*cursor + 2].try_into().unwrap();
*cursor += 2;
Ok(match endianness {
Endianness::Big => u16::from_be_bytes(bytes),
Endianness::Little => u16::from_le_bytes(bytes),
})
}
fn read_u32(data: &[u8], cursor: &mut usize, endianness: Endianness) -> Result<u32> {
ensure!(*cursor + 4 <= data.len(), "unexpected EOF while reading u32");
let bytes: [u8; 4] = data[*cursor..*cursor + 4].try_into().unwrap();
*cursor += 4;
Ok(match endianness {
Endianness::Big => u32::from_be_bytes(bytes),
Endianness::Little => u32::from_le_bytes(bytes),
})
}
fn read_i32(data: &[u8], cursor: &mut usize, endianness: Endianness) -> Result<i32> {
Ok(read_u32(data, cursor, endianness)? as i32)
}

View File

@@ -1,5 +1,6 @@
#[cfg(feature = "dwarf")]
mod dwarf2;
mod mdebug;
pub mod read;
pub mod split_meta;
@@ -107,32 +108,33 @@ impl Section {
// The alignment to use when "Combine data/text sections" is enabled.
pub fn combined_alignment(&self) -> u64 {
const MIN_ALIGNMENT: u64 = 4;
self.align.map(|align| align.get().max(MIN_ALIGNMENT)).unwrap_or(MIN_ALIGNMENT)
self.align.map_or(MIN_ALIGNMENT, |align| align.get().max(MIN_ALIGNMENT))
}
pub fn relocation_at<'obj>(
&'obj self,
obj: &'obj Object,
ins_ref: InstructionRef,
) -> Option<ResolvedRelocation<'obj>> {
match self.relocations.binary_search_by_key(&ins_ref.address, |r| r.address) {
pub fn relocation_at(&self, address: u64, size: u8) -> Option<&Relocation> {
match self.relocations.binary_search_by_key(&address, |r| r.address) {
Ok(mut i) => {
// Find the first relocation at the address
while i
.checked_sub(1)
.and_then(|n| self.relocations.get(n))
.is_some_and(|r| r.address == ins_ref.address)
.is_some_and(|r| r.address == address)
{
i -= 1;
}
self.relocations.get(i)
}
Err(i) => self
.relocations
.get(i)
.filter(|r| r.address < ins_ref.address + ins_ref.size as u64),
Err(i) => self.relocations.get(i).filter(|r| r.address < address + size as u64),
}
.and_then(|relocation| {
}
pub fn resolve_relocation_at<'obj>(
&'obj self,
obj: &'obj Object,
address: u64,
size: u8,
) -> Option<ResolvedRelocation<'obj>> {
self.relocation_at(address, size).and_then(|relocation| {
let symbol = obj.symbols.get(relocation.target_symbol)?;
Some(ResolvedRelocation { relocation, symbol })
})
@@ -316,7 +318,7 @@ impl Object {
let section = self.sections.get(section_index)?;
let offset = ins_ref.address.checked_sub(section.address)?;
let code = section.data.get(offset as usize..offset as usize + ins_ref.size as usize)?;
let relocation = section.relocation_at(self, ins_ref);
let relocation = section.resolve_relocation_at(self, ins_ref.address, ins_ref.size);
Some(ResolvedInstructionRef {
ins_ref,
symbol_index,

View File

@@ -12,10 +12,10 @@ use object::{Object as _, ObjectSection as _, ObjectSymbol as _};
use crate::{
arch::{Arch, RelocationOverride, RelocationOverrideTarget, new_arch},
diff::DiffObjConfig,
diff::{DiffObjConfig, DiffSide},
obj::{
FlowAnalysisResult, Object, Relocation, RelocationFlags, Section, SectionData, SectionFlag,
SectionKind, Symbol, SymbolFlag, SymbolKind,
SectionKind, Symbol, SymbolFlag, SymbolFlagSet, SymbolKind,
split_meta::{SPLITMETA_SECTION, SplitMeta},
},
util::{align_data_slice_to, align_u64_to, read_u16, read_u32},
@@ -41,6 +41,7 @@ fn map_symbol(
symbol: &object::Symbol,
section_indices: &[usize],
split_meta: Option<&SplitMeta>,
config: &DiffObjConfig,
) -> Result<Symbol> {
let mut name = symbol.name().context("Failed to process symbol name")?.to_string();
let mut size = symbol.size();
@@ -74,6 +75,14 @@ fn map_symbol(
{
flags |= SymbolFlag::Hidden;
}
if file.format() == object::BinaryFormat::Coff
&& let Ok(name) = symbol.name()
&& (name.starts_with("except_data_")
|| name.starts_with("__unwind")
|| name.starts_with("__catch"))
{
flags |= SymbolFlag::Hidden;
}
let kind = match symbol.kind() {
object::SymbolKind::Text => SymbolKind::Function,
@@ -82,7 +91,7 @@ fn map_symbol(
_ => SymbolKind::Unknown,
};
let address = arch.symbol_address(symbol.address(), kind);
let demangled_name = arch.demangle(&name);
let demangled_name = config.demangler.demangle(&name);
// Find the virtual address for the symbol if available
let virtual_address = split_meta
.and_then(|m| m.virtual_addresses.as_ref())
@@ -108,15 +117,16 @@ fn map_symbols(
sections: &[Section],
section_indices: &[usize],
split_meta: Option<&SplitMeta>,
config: &DiffObjConfig,
) -> Result<(Vec<Symbol>, Vec<usize>)> {
let symbol_count = obj_file.symbols().count();
let mut symbols = Vec::<Symbol>::with_capacity(symbol_count);
let mut symbols = Vec::<Symbol>::with_capacity(symbol_count + obj_file.sections().count());
let mut symbol_indices = Vec::<usize>::with_capacity(symbol_count + 1);
for obj_symbol in obj_file.symbols() {
if symbol_indices.len() <= obj_symbol.index().0 {
symbol_indices.resize(obj_symbol.index().0 + 1, usize::MAX);
}
let symbol = map_symbol(arch, obj_file, &obj_symbol, section_indices, split_meta)?;
let symbol = map_symbol(arch, obj_file, &obj_symbol, section_indices, split_meta, config)?;
symbol_indices[obj_symbol.index().0] = symbols.len();
symbols.push(symbol);
}
@@ -127,10 +137,56 @@ fn map_symbols(
Ok((symbols, symbol_indices))
}
/// Add an extra fake symbol to the start of each data section in order to allow the user to diff
/// all of the data in the section at once by clicking on this fake symbol at the top of the list.
fn add_section_symbols(sections: &[Section], symbols: &mut Vec<Symbol>) {
for (section_idx, section) in sections.iter().enumerate() {
if section.kind != SectionKind::Data {
continue;
}
// Instead of naming the fake section symbol after `section.name` (e.g. ".data") we use
// `section.id` (e.g. ".data-0") so that it is unique when multiple sections with the same
// name exist and it also doesn't conflict with any real section symbols from the object.
let name = if section.flags.contains(SectionFlag::Combined) {
// For combined sections, `section.id` (e.g. ".data-combined") is inconsistent with
// uncombined section IDs, so we add the "-0" suffix to the name to enable proper
// pairing when one side had multiple sections combined and the other only had one
// section to begin with.
format!("[{}-0]", section.name)
} else {
format!("[{}]", section.id)
};
// `section.size` can include extra padding, so instead prefer using the address that the
// last symbol ends at when there are any symbols in the section.
let size = symbols
.iter()
.filter(|s| {
s.section == Some(section_idx) && s.kind == SymbolKind::Object && s.size > 0
})
.map(|s| s.address + s.size)
.max()
.unwrap_or(section.size);
symbols.push(Symbol {
name,
demangled_name: None,
address: 0,
size,
kind: SymbolKind::Section,
section: Some(section_idx),
flags: SymbolFlagSet::default() | SymbolFlag::Local,
align: None,
virtual_address: None,
});
}
}
/// When inferring a symbol's size, we ignore symbols that start with specific prefixes. They are
/// usually emitted as branch targets and do not represent the start of a function or object.
fn is_local_label(symbol: &Symbol) -> bool {
const LABEL_PREFIXES: &[&str] = &[".L", "LAB_"];
const LABEL_PREFIXES: &[&str] = &[".L", "LAB_", "switchD_"];
symbol.size == 0
&& symbol.flags.contains(SymbolFlag::Local)
&& LABEL_PREFIXES.iter().any(|p| symbol.name.starts_with(p))
@@ -208,7 +264,11 @@ fn infer_symbol_sizes(arch: &dyn Arch, symbols: &mut [Symbol], sections: &[Secti
let section = &sections[section_idx];
let next_address =
next_symbol.map(|s| s.address).unwrap_or_else(|| section.address + section.size);
let new_size = if section.kind == SectionKind::Code {
let new_size = if symbol.kind == SymbolKind::Section && section.kind == SectionKind::Data {
// Data sections already have always-visible section symbols created by objdiff to allow
// diffing them, so no need to unhide these.
0
} else if section.kind == SectionKind::Code {
arch.infer_function_size(symbol, section, next_address)?
} else {
next_address.saturating_sub(symbol.address)
@@ -594,6 +654,10 @@ fn parse_line_info(
log::warn!("Failed to parse COFF line info: {e}");
}
if let Err(e) = super::mdebug::parse_line_info_mdebug(obj_file, sections) {
log::warn!("Failed to parse MIPS mdebug line info: {e}");
}
Ok(())
}
@@ -917,31 +981,42 @@ fn do_combine_sections(
}
#[cfg(feature = "std")]
pub fn read(obj_path: &std::path::Path, config: &DiffObjConfig) -> Result<Object> {
pub fn read(
obj_path: &std::path::Path,
config: &DiffObjConfig,
diff_side: DiffSide,
) -> Result<Object> {
let (data, timestamp) = {
let file = std::fs::File::open(obj_path)?;
let timestamp = filetime::FileTime::from_last_modification_time(&file.metadata()?);
(unsafe { memmap2::Mmap::map(&file) }?, timestamp)
};
let mut obj = parse(&data, config)?;
let mut obj = parse(&data, config, diff_side)?;
obj.path = Some(obj_path.to_path_buf());
obj.timestamp = Some(timestamp);
Ok(obj)
}
pub fn parse(data: &[u8], config: &DiffObjConfig) -> Result<Object> {
pub fn parse(data: &[u8], config: &DiffObjConfig, diff_side: DiffSide) -> Result<Object> {
let obj_file = object::File::parse(data)?;
let mut arch = new_arch(&obj_file)?;
let mut arch = new_arch(&obj_file, diff_side)?;
let split_meta = parse_split_meta(&obj_file)?;
let (mut sections, section_indices) =
map_sections(arch.as_ref(), &obj_file, split_meta.as_ref())?;
let (mut symbols, symbol_indices) =
map_symbols(arch.as_ref(), &obj_file, &sections, &section_indices, split_meta.as_ref())?;
let (mut symbols, symbol_indices) = map_symbols(
arch.as_ref(),
&obj_file,
&sections,
&section_indices,
split_meta.as_ref(),
config,
)?;
map_relocations(arch.as_ref(), &obj_file, &mut sections, &section_indices, &symbol_indices)?;
parse_line_info(&obj_file, &mut sections, &section_indices, data)?;
if config.combine_data_sections || config.combine_text_sections {
combine_sections(&mut sections, &mut symbols, config)?;
}
add_section_symbols(&sections, &mut symbols);
arch.post_init(&sections, &symbols);
let mut obj = Object {
arch,

View File

@@ -6,7 +6,12 @@ mod common;
#[cfg(feature = "arm")]
fn read_arm() {
let diff_config = diff::DiffObjConfig { ..Default::default() };
let obj = obj::read::parse(include_object!("data/arm/LinkStateItem.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/arm/LinkStateItem.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx =
obj.symbols.iter().position(|s| s.name == "_ZN13LinkStateItem12OnStateLeaveEi").unwrap();
@@ -20,7 +25,9 @@ fn read_arm() {
#[cfg(feature = "arm")]
fn read_thumb() {
let diff_config = diff::DiffObjConfig { ..Default::default() };
let obj = obj::read::parse(include_object!("data/arm/thumb.o"), &diff_config).unwrap();
let obj =
obj::read::parse(include_object!("data/arm/thumb.o"), &diff_config, diff::DiffSide::Base)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx = obj
.symbols
@@ -37,10 +44,32 @@ fn read_thumb() {
#[cfg(feature = "arm")]
fn combine_text_sections() {
let diff_config = diff::DiffObjConfig { combine_text_sections: true, ..Default::default() };
let obj = obj::read::parse(include_object!("data/arm/enemy300.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/arm/enemy300.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
let symbol_idx = obj.symbols.iter().position(|s| s.name == "Enemy300Draw").unwrap();
let diff = diff::code::no_diff_code(&obj, symbol_idx, &diff_config).unwrap();
insta::assert_debug_snapshot!(diff.instruction_rows);
let output = common::display_diff(&obj, &diff, symbol_idx, &diff_config);
insta::assert_snapshot!(output);
}
#[test]
#[cfg(feature = "arm")]
fn trim_trailing_hword() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(
include_object!("data/arm/issue_253.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
let symbol_idx = obj.symbols.iter().position(|s| s.name == "sub_8030F20").unwrap();
let diff = diff::code::no_diff_code(&obj, symbol_idx, &diff_config).unwrap();
insta::assert_debug_snapshot!(diff.instruction_rows);
let output = common::display_diff(&obj, &diff, symbol_idx, &diff_config);
insta::assert_snapshot!(output);
}

View File

@@ -6,7 +6,9 @@ mod common;
#[cfg(feature = "mips")]
fn read_mips() {
let diff_config = diff::DiffObjConfig { mips_register_prefix: true, ..Default::default() };
let obj = obj::read::parse(include_object!("data/mips/main.c.o"), &diff_config).unwrap();
let obj =
obj::read::parse(include_object!("data/mips/main.c.o"), &diff_config, diff::DiffSide::Base)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx = obj.symbols.iter().position(|s| s.name == "ControlEntry").unwrap();
let diff = diff::code::no_diff_code(&obj, symbol_idx, &diff_config).unwrap();
@@ -19,9 +21,19 @@ fn read_mips() {
#[cfg(feature = "mips")]
fn cross_endian_diff() {
let diff_config = diff::DiffObjConfig::default();
let obj_be = obj::read::parse(include_object!("data/mips/code_be.o"), &diff_config).unwrap();
let obj_be = obj::read::parse(
include_object!("data/mips/code_be.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
assert_eq!(obj_be.endianness, object::Endianness::Big);
let obj_le = obj::read::parse(include_object!("data/mips/code_le.o"), &diff_config).unwrap();
let obj_le = obj::read::parse(
include_object!("data/mips/code_le.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
assert_eq!(obj_le.endianness, object::Endianness::Little);
let left_symbol_idx = obj_be.symbols.iter().position(|s| s.name == "func_00000000").unwrap();
let right_symbol_idx =
@@ -42,6 +54,29 @@ fn cross_endian_diff() {
#[cfg(feature = "mips")]
fn filter_non_matching() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/mips/vw_main.c.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/mips/vw_main.c.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj.symbols);
}
#[test]
#[cfg(feature = "mips")]
fn ido_mdebug_line_numbers() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(
include_object!("data/mips/ido_lines_example.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
let text_section = obj.sections.iter().find(|s| s.name == ".text").unwrap();
assert_eq!(text_section.line_info.get(&0), Some(&6));
assert_eq!(text_section.line_info.get(&12), Some(&7));
assert_eq!(text_section.line_info.get(&56), Some(&9));
assert_eq!(text_section.line_info.len(), 66);
}

View File

@@ -10,7 +10,9 @@ mod common;
#[cfg(feature = "ppc")]
fn read_ppc() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/ppc/IObj.o"), &diff_config).unwrap();
let obj =
obj::read::parse(include_object!("data/ppc/IObj.o"), &diff_config, diff::DiffSide::Base)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx =
obj.symbols.iter().position(|s| s.name == "Type2Text__10SObjectTagFUi").unwrap();
@@ -24,7 +26,12 @@ fn read_ppc() {
#[cfg(feature = "ppc")]
fn read_dwarf1_line_info() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/ppc/m_Do_hostIO.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/ppc/m_Do_hostIO.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
let line_infos = obj
.sections
.iter()
@@ -38,7 +45,12 @@ fn read_dwarf1_line_info() {
#[cfg(feature = "ppc")]
fn read_extab() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/ppc/NMWException.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/ppc/NMWException.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
}
@@ -47,12 +59,18 @@ fn read_extab() {
fn diff_ppc() {
let diff_config = diff::DiffObjConfig::default();
let mapping_config = diff::MappingConfig::default();
let target_obj =
obj::read::parse(include_object!("data/ppc/CDamageVulnerability_target.o"), &diff_config)
.unwrap();
let base_obj =
obj::read::parse(include_object!("data/ppc/CDamageVulnerability_base.o"), &diff_config)
.unwrap();
let target_obj = obj::read::parse(
include_object!("data/ppc/CDamageVulnerability_target.o"),
&diff_config,
diff::DiffSide::Target,
)
.unwrap();
let base_obj = obj::read::parse(
include_object!("data/ppc/CDamageVulnerability_base.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
let diff =
diff::diff_objs(Some(&target_obj), Some(&base_obj), None, &diff_config, &mapping_config)
.unwrap();
@@ -90,7 +108,12 @@ fn diff_ppc() {
#[cfg(feature = "ppc")]
fn read_vmx128_coff() {
let diff_config = diff::DiffObjConfig { combine_data_sections: true, ..Default::default() };
let obj = obj::read::parse(include_object!("data/ppc/vmx128.obj"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/ppc/vmx128.obj"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx =
obj.symbols.iter().position(|s| s.name == "?FloatingPointExample@@YAXXZ").unwrap();

View File

@@ -6,7 +6,12 @@ mod common;
#[cfg(feature = "x86")]
fn read_x86() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/x86/staticdebug.obj"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/x86/staticdebug.obj"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx = obj.symbols.iter().position(|s| s.name == "?PrintThing@@YAXXZ").unwrap();
let diff = diff::code::no_diff_code(&obj, symbol_idx, &diff_config).unwrap();
@@ -23,7 +28,9 @@ fn read_x86_combine_sections() {
combine_text_sections: true,
..Default::default()
};
let obj = obj::read::parse(include_object!("data/x86/rtest.obj"), &diff_config).unwrap();
let obj =
obj::read::parse(include_object!("data/x86/rtest.obj"), &diff_config, diff::DiffSide::Base)
.unwrap();
insta::assert_debug_snapshot!(obj.sections);
}
@@ -31,7 +38,12 @@ fn read_x86_combine_sections() {
#[cfg(feature = "x86")]
fn read_x86_64() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/x86_64/vs2022.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/x86_64/vs2022.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx =
obj.symbols.iter().position(|s| s.name == "?Dot@Vector@@QEAAMPEAU1@@Z").unwrap();
@@ -45,7 +57,12 @@ fn read_x86_64() {
#[cfg(feature = "x86")]
fn display_section_ordering() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/x86/basenode.obj"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/x86/basenode.obj"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
let obj_diff =
diff::diff_objs(Some(&obj), None, None, &diff_config, &diff::MappingConfig::default())
.unwrap()
@@ -60,7 +77,12 @@ fn display_section_ordering() {
#[cfg(feature = "x86")]
fn read_x86_jumptable() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/x86/jumptable.o"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/x86/jumptable.o"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx = obj.symbols.iter().position(|s| s.name == "?test@@YAHH@Z").unwrap();
let diff = diff::code::no_diff_code(&obj, symbol_idx, &diff_config).unwrap();
@@ -74,6 +96,29 @@ fn read_x86_jumptable() {
#[cfg(feature = "x86")]
fn read_x86_local_labels() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(include_object!("data/x86/local_labels.obj"), &diff_config).unwrap();
let obj = obj::read::parse(
include_object!("data/x86/local_labels.obj"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
}
#[test]
#[cfg(feature = "x86")]
fn read_x86_indirect_table() {
let diff_config = diff::DiffObjConfig::default();
let obj = obj::read::parse(
include_object!("data/x86/indirect_table.obj"),
&diff_config,
diff::DiffSide::Base,
)
.unwrap();
insta::assert_debug_snapshot!(obj);
let symbol_idx = obj.symbols.iter().position(|s| s.name == "?process@@YAHHHH@Z").unwrap();
let diff = diff::code::no_diff_code(&obj, symbol_idx, &diff_config).unwrap();
insta::assert_debug_snapshot!(diff.instruction_rows);
let output = common::display_diff(&obj, &diff, symbol_idx, &diff_config);
insta::assert_snapshot!(output);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -2,6 +2,6 @@
source: objdiff-core/tests/arch_arm.rs
expression: output
---
[(Line(90), Dim, 5), (Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(8), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(90), Dim, 5), (Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bx", 32779), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Eol, Normal, 0)]
[(Line(90), Dim, 5), (Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Symbol(Symbol { name: "esEnemyDraw", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Line(90), Dim, 5), (Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(8), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(90), Dim, 5), (Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bx", 32777), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Eol, Normal, 0)]
[(Line(90), Dim, 5), (Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Symbol(Symbol { name: "esEnemyDraw", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]

View File

@@ -8,7 +8,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 76,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -22,7 +22,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 80,
size: 4,
opcode: 32779,
opcode: 32777,
branch_dest: None,
},
),
@@ -36,7 +36,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 84,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),

View File

@@ -8,7 +8,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 40,
size: 4,
opcode: 32895,
opcode: 32883,
branch_dest: None,
},
),
@@ -22,7 +22,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 44,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -36,7 +36,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 48,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -50,7 +50,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 52,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -64,7 +64,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 56,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -78,7 +78,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 60,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -92,7 +92,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 64,
size: 4,
opcode: 32770,
opcode: 32769,
branch_dest: None,
},
),
@@ -106,7 +106,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 68,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -127,7 +127,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 72,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -148,7 +148,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 76,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -169,7 +169,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 80,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -190,7 +190,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 84,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
232,
),
@@ -211,7 +211,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 88,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
164,
),
@@ -232,7 +232,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 92,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -253,7 +253,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 96,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
180,
),
@@ -274,7 +274,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 100,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
116,
),
@@ -295,7 +295,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 104,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
192,
),
@@ -316,7 +316,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 108,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
204,
),
@@ -337,7 +337,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 112,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
204,
),
@@ -358,7 +358,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 116,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -379,7 +379,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 120,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -393,7 +393,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 124,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -407,7 +407,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 128,
size: 4,
opcode: 32800,
opcode: 32793,
branch_dest: None,
},
),
@@ -421,7 +421,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 132,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -435,7 +435,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 136,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
148,
),
@@ -456,7 +456,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 140,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: Some(
464,
),
@@ -477,7 +477,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 144,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -491,7 +491,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 148,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -512,7 +512,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 152,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -526,7 +526,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 156,
size: 4,
opcode: 32777,
opcode: 32776,
branch_dest: None,
},
),
@@ -540,7 +540,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 160,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -561,7 +561,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 164,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -582,7 +582,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 168,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -596,7 +596,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 172,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -610,7 +610,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 176,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -631,7 +631,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 180,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -652,7 +652,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 184,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -666,7 +666,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 188,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -687,7 +687,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 192,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -708,7 +708,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 196,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -722,7 +722,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 200,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -743,7 +743,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 204,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -765,7 +765,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 208,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -779,7 +779,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 212,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -793,7 +793,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 216,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -807,7 +807,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 220,
size: 4,
opcode: 32899,
opcode: 32885,
branch_dest: None,
},
),
@@ -821,7 +821,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 224,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -835,7 +835,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 228,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
240,
),
@@ -856,7 +856,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 232,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -877,7 +877,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 236,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -891,7 +891,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 240,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -921,7 +921,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 244,
size: 4,
opcode: 32829,
opcode: 32819,
branch_dest: None,
},
),
@@ -935,7 +935,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 248,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -949,7 +949,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 252,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
276,
),
@@ -970,7 +970,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 256,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -984,7 +984,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 260,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -998,7 +998,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 264,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -1012,7 +1012,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 268,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -1026,7 +1026,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 272,
size: 4,
opcode: 32778,
opcode: 32776,
branch_dest: None,
},
),
@@ -1040,7 +1040,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 276,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -1061,7 +1061,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 280,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1075,7 +1075,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 284,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
328,
),
@@ -1096,7 +1096,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 288,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
336,
),
@@ -1117,7 +1117,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 292,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1131,7 +1131,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 296,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
348,
),
@@ -1152,7 +1152,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 300,
size: 4,
opcode: 32829,
opcode: 32819,
branch_dest: None,
},
),
@@ -1166,7 +1166,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 304,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1180,7 +1180,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 308,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
348,
),
@@ -1201,7 +1201,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 312,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1215,7 +1215,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 316,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1229,7 +1229,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 320,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
380,
),
@@ -1250,7 +1250,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 324,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
348,
),
@@ -1271,7 +1271,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 328,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1292,7 +1292,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 332,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
348,
),
@@ -1313,7 +1313,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 336,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -1334,7 +1334,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 340,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -1348,7 +1348,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 344,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
380,
),
@@ -1369,7 +1369,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 348,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -1393,7 +1393,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 352,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -1407,7 +1407,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 356,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1421,7 +1421,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 360,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1435,7 +1435,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 364,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
380,
),
@@ -1456,7 +1456,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 368,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -1470,7 +1470,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 372,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -1484,7 +1484,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 376,
size: 4,
opcode: 32899,
opcode: 32885,
branch_dest: None,
},
),
@@ -1498,7 +1498,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 380,
size: 4,
opcode: 32829,
opcode: 32819,
branch_dest: None,
},
),
@@ -1521,7 +1521,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 384,
size: 4,
opcode: 32770,
opcode: 32769,
branch_dest: None,
},
),
@@ -1535,7 +1535,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 388,
size: 4,
opcode: 32770,
opcode: 32769,
branch_dest: None,
},
),
@@ -1549,7 +1549,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 392,
size: 4,
opcode: 32898,
opcode: 32884,
branch_dest: None,
},
),
@@ -1563,7 +1563,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 396,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1577,7 +1577,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 400,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
424,
),
@@ -1598,7 +1598,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 404,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -1619,7 +1619,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 408,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -1633,7 +1633,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 412,
size: 4,
opcode: 32770,
opcode: 32769,
branch_dest: None,
},
),
@@ -1647,7 +1647,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 416,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1661,7 +1661,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 420,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
404,
),
@@ -1682,7 +1682,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 424,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -1703,7 +1703,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 428,
size: 4,
opcode: 32799,
opcode: 32792,
branch_dest: None,
},
),
@@ -1717,7 +1717,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 432,
size: 4,
opcode: 32800,
opcode: 32793,
branch_dest: None,
},
),
@@ -1731,7 +1731,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 436,
size: 4,
opcode: 32786,
opcode: 32784,
branch_dest: None,
},
),
@@ -1745,7 +1745,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 440,
size: 4,
opcode: 32773,
opcode: 32772,
branch_dest: Some(
448,
),
@@ -1766,7 +1766,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 444,
size: 4,
opcode: 32774,
opcode: 32775,
branch_dest: None,
},
),
@@ -1780,7 +1780,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 448,
size: 4,
opcode: 32818,
opcode: 32811,
branch_dest: None,
},
),
@@ -1801,7 +1801,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 452,
size: 4,
opcode: 32899,
opcode: 32885,
branch_dest: None,
},
),
@@ -1815,7 +1815,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 456,
size: 4,
opcode: 32793,
opcode: 32791,
branch_dest: None,
},
),
@@ -1829,7 +1829,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 460,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1843,7 +1843,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 464,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1864,7 +1864,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 468,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),

View File

@@ -2,111 +2,111 @@
source: objdiff-core/tests/arch_arm.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stmdb", 32895), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Argument(Opaque("!")), Normal, 0), (Basic(", "), Normal, 0), (Basic("{"), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("lr")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Address(12), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase12OnStateLeaveEi", demangled_name: Some("LinkStateBase::OnStateLeave(int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(16), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(10)), Normal, 0), (Eol, Normal, 0)]
[(Address(24), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addls", 32770), Normal, 10), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("lsl")), Normal, 0), (Basic(" #"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(32), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(36), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(40), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(44), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(192), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(48), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(124), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Address(52), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(56), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(140), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Address(60), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(76), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Address(64), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(152), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Address(68), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(164), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(164), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(76), Normal, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(336)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(420), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN18UnkStruct_027e103c19func_ov000_020cf01cEv", demangled_name: Some("UnkStruct_027e103c::func_ov000_020cf01c()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(88), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 32800), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(224)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(92), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(96), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 32773), Normal, 10), (BranchDest(108), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Address(100), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (BranchDest(424), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
[(Address(104), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN12EquipBombchu19func_ov014_0213ec64Ev", demangled_name: Some("EquipBombchu::func_ov014_0213ec64()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(108), Normal, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(308)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(424), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(116), Normal, 5), (Spacing(4), Normal, 0), (Opcode("blx", 32777), Normal, 10), (Symbol(Symbol { name: "_Z19func_ov014_0211fd04Pi", demangled_name: Some("func_ov014_0211fd04(int*)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(120), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(124), Normal, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(128), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(132), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem13StopUsingBombEi", demangled_name: Some("LinkStateItem::StopUsingBomb(int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(136), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(140), Normal, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(144), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem13StopUsingRopeEv", demangled_name: Some("LinkStateItem::StopUsingRope()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(148), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(152), Normal, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(156), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem15StopUsingHammerEv", demangled_name: Some("LinkStateItem::StopUsingHammer()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(160), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(164), Normal, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(248)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(420), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(168), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(176), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Address(180), Normal, 5), (Spacing(4), Normal, 0), (Opcode("strb", 32899), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(42)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(184), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN18UnkStruct_027e103c19func_ov000_020cf9dcEii", demangled_name: Some("UnkStruct_027e103c::func_ov000_020cf9dc(int, int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(188), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(192), Normal, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(196), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem14StopUsingScoopEv", demangled_name: Some("LinkStateItem::StopUsingScoop()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(200), Normal, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(204), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mvn", 32829), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(208), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Address(212), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32773), Normal, 10), (BranchDest(236), Normal, 0), (Basic(" ~>"), Rotating(9), 0), (Eol, Normal, 0)]
[(Address(216), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(220), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase12GetEquipItemEi", demangled_name: Some("LinkStateBase::GetEquipItem(int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(224), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(228), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(28)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(232), Normal, 5), (Spacing(4), Normal, 0), (Opcode("blx", 32778), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Address(236), Normal, 5), (Basic(" ~> "), Rotating(9), 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(240), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(9)), Normal, 0), (Eol, Normal, 0)]
[(Address(244), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bgt", 32773), Normal, 10), (BranchDest(288), Normal, 0), (Basic(" ~>"), Rotating(10), 0), (Eol, Normal, 0)]
[(Address(248), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bge", 32773), Normal, 10), (BranchDest(296), Normal, 0), (Basic(" ~>"), Rotating(11), 0), (Eol, Normal, 0)]
[(Address(252), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Address(256), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bgt", 32773), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(260), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mvn", 32829), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(264), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Address(268), Normal, 5), (Spacing(4), Normal, 0), (Opcode("blt", 32773), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(272), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpne", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(276), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpne", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Address(280), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32773), Normal, 10), (BranchDest(340), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Address(284), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(288), Normal, 5), (Basic(" ~> "), Rotating(10), 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(10)), Normal, 0), (Eol, Normal, 0)]
[(Address(292), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 32773), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(296), Normal, 5), (Basic(" ~> "), Rotating(11), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(300), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase18EquipItem_vfunc_28Ev", demangled_name: Some("LinkStateBase::EquipItem_vfunc_28()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(304), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 32773), Normal, 10), (BranchDest(340), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Address(308), Normal, 5), (Basic(" ~> "), Rotating(12), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(312), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase18EquipItem_vfunc_28Ev", demangled_name: Some("LinkStateBase::EquipItem_vfunc_28()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(316), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(320), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpne", 32786), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(324), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32773), Normal, 10), (BranchDest(340), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Address(328), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem16GetLinkStateMoveEv", demangled_name: Some("LinkStateItem::GetLinkStateMove()"), address: 488, size: 16, kind: Function, section: Some(0), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(332), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Address(336), Normal, 5), (Spacing(4), Normal, 0), (Opcode("strb", 32899), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(340), Normal, 5), (Basic(" ~> "), Rotating(13), 0), (Opcode("mvn", 32829), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(344), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 32770), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(80)), Normal, 0), (Eol, Normal, 0)]
[(Address(348), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 32770), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(88)), Normal, 0), (Eol, Normal, 0)]
[(Address(352), Normal, 5), (Spacing(4), Normal, 0), (Opcode("str", 32898), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(24)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(356), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(360), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32773), Normal, 10), (BranchDest(384), Normal, 0), (Basic(" ~>"), Rotating(14), 0), (Eol, Normal, 0)]
[(Address(364), Normal, 5), (Basic(" ~> "), Rotating(15), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(368), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_Z19func_ov000_020b7e6cPi", demangled_name: Some("func_ov000_020b7e6c(int*)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(372), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 32770), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(376), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(380), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 32773), Normal, 10), (BranchDest(364), Normal, 0), (Basic(" ~>"), Rotating(15), 0), (Eol, Normal, 0)]
[(Address(384), Normal, 5), (Basic(" ~> "), Rotating(14), 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(36)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(428), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(388), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32799), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(392), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 32800), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(128)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(396), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32786), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(400), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32773), Normal, 10), (BranchDest(408), Normal, 0), (Basic(" ~>"), Rotating(16), 0), (Eol, Normal, 0)]
[(Address(404), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32774), Normal, 10), (Symbol(Symbol { name: "_ZN13PlayerControl13StopFollowingEv", demangled_name: Some("PlayerControl::StopFollowing()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(408), Normal, 5), (Basic(" ~> "), Rotating(16), 0), (Opcode("mov", 32818), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(412), Normal, 5), (Spacing(4), Normal, 0), (Opcode("strb", 32899), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(38)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(416), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldmia", 32793), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Argument(Opaque("!")), Normal, 0), (Basic(", "), Normal, 0), (Basic("{"), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Address(420), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Symbol(Symbol { name: "data_027e103c", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(424), Normal, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode(".word", 65535), Normal, 10), (Symbol(Symbol { name: "data_027e1098", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(428), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Symbol(Symbol { name: "gPlayerControl", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stmdb", 32883), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic("!"), Normal, 0), (Basic(", "), Normal, 0), (Basic("{"), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("lr")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Address(12), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase12OnStateLeaveEi", demangled_name: Some("LinkStateBase::OnStateLeave(int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(16), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(10)), Normal, 0), (Eol, Normal, 0)]
[(Address(24), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addls", 32769), Normal, 10), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("lsl")), Normal, 0), (Spacing(1), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(32), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(36), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(44), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(192), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(48), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(124), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Address(52), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(56), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(140), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Address(60), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(76), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Address(64), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(152), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Address(68), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(164), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(164), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(76), Dim, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(336)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(420), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(84), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN18UnkStruct_027e103c19func_ov000_020cf01cEv", demangled_name: Some("UnkStruct_027e103c::func_ov000_020cf01c()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(88), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 32793), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(224)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(92), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(96), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 32772), Normal, 10), (BranchDest(108), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Address(100), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (BranchDest(424), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
[(Address(104), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN12EquipBombchu19func_ov014_0213ec64Ev", demangled_name: Some("EquipBombchu::func_ov014_0213ec64()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(108), Dim, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(308)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(424), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(116), Dim, 5), (Spacing(4), Normal, 0), (Opcode("blx", 32776), Normal, 10), (Symbol(Symbol { name: "_Z19func_ov014_0211fd04Pi", demangled_name: Some("func_ov014_0211fd04(int*)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(120), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(124), Dim, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(128), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(132), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem13StopUsingBombEi", demangled_name: Some("LinkStateItem::StopUsingBomb(int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(136), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(140), Dim, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(144), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem13StopUsingRopeEv", demangled_name: Some("LinkStateItem::StopUsingRope()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(148), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(152), Dim, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(156), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem15StopUsingHammerEv", demangled_name: Some("LinkStateItem::StopUsingHammer()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(160), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(164), Dim, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(248)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(420), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(168), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(176), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Address(180), Dim, 5), (Spacing(4), Normal, 0), (Opcode("strb", 32885), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(42)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(184), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN18UnkStruct_027e103c19func_ov000_020cf9dcEii", demangled_name: Some("UnkStruct_027e103c::func_ov000_020cf9dc(int, int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(188), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(192), Dim, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(196), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem14StopUsingScoopEv", demangled_name: Some("LinkStateItem::StopUsingScoop()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(200), Dim, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(204), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mvn", 32819), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(208), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Address(212), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32772), Normal, 10), (BranchDest(236), Normal, 0), (Basic(" ~>"), Rotating(9), 0), (Eol, Normal, 0)]
[(Address(216), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(220), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase12GetEquipItemEi", demangled_name: Some("LinkStateBase::GetEquipItem(int)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(224), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(228), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(28)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(232), Dim, 5), (Spacing(4), Normal, 0), (Opcode("blx", 32776), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Address(236), Dim, 5), (Basic(" ~> "), Rotating(9), 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(240), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(9)), Normal, 0), (Eol, Normal, 0)]
[(Address(244), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bgt", 32772), Normal, 10), (BranchDest(288), Normal, 0), (Basic(" ~>"), Rotating(10), 0), (Eol, Normal, 0)]
[(Address(248), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bge", 32772), Normal, 10), (BranchDest(296), Normal, 0), (Basic(" ~>"), Rotating(11), 0), (Eol, Normal, 0)]
[(Address(252), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Address(256), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bgt", 32772), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(260), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mvn", 32819), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(264), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Address(268), Dim, 5), (Spacing(4), Normal, 0), (Opcode("blt", 32772), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(272), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpne", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(276), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpne", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Address(280), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32772), Normal, 10), (BranchDest(340), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Address(284), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(288), Dim, 5), (Basic(" ~> "), Rotating(10), 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(10)), Normal, 0), (Eol, Normal, 0)]
[(Address(292), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 32772), Normal, 10), (BranchDest(308), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Address(296), Dim, 5), (Basic(" ~> "), Rotating(11), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(300), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase18EquipItem_vfunc_28Ev", demangled_name: Some("LinkStateBase::EquipItem_vfunc_28()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(304), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 32772), Normal, 10), (BranchDest(340), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Address(308), Dim, 5), (Basic(" ~> "), Rotating(12), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(312), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateBase18EquipItem_vfunc_28Ev", demangled_name: Some("LinkStateBase::EquipItem_vfunc_28()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(316), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(320), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpne", 32784), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(324), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32772), Normal, 10), (BranchDest(340), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Address(328), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13LinkStateItem16GetLinkStateMoveEv", demangled_name: Some("LinkStateItem::GetLinkStateMove()"), address: 488, size: 16, kind: Function, section: Some(0), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(332), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Address(336), Dim, 5), (Spacing(4), Normal, 0), (Opcode("strb", 32885), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(340), Dim, 5), (Basic(" ~> "), Rotating(13), 0), (Opcode("mvn", 32819), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(344), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 32769), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(80)), Normal, 0), (Eol, Normal, 0)]
[(Address(348), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 32769), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(88)), Normal, 0), (Eol, Normal, 0)]
[(Address(352), Dim, 5), (Spacing(4), Normal, 0), (Opcode("str", 32884), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(24)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(356), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(360), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32772), Normal, 10), (BranchDest(384), Normal, 0), (Basic(" ~>"), Rotating(14), 0), (Eol, Normal, 0)]
[(Address(364), Dim, 5), (Basic(" ~> "), Rotating(15), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(368), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_Z19func_ov000_020b7e6cPi", demangled_name: Some("func_ov000_020b7e6c(int*)"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(372), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 32769), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(376), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(380), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 32772), Normal, 10), (BranchDest(364), Normal, 0), (Basic(" ~>"), Rotating(15), 0), (Eol, Normal, 0)]
[(Address(384), Dim, 5), (Basic(" ~> "), Rotating(14), 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(36)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(428), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(388), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32792), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(392), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 32793), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(128)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(396), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 32784), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(400), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 32772), Normal, 10), (BranchDest(408), Normal, 0), (Basic(" ~>"), Rotating(16), 0), (Eol, Normal, 0)]
[(Address(404), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 32775), Normal, 10), (Symbol(Symbol { name: "_ZN13PlayerControl13StopFollowingEv", demangled_name: Some("PlayerControl::StopFollowing()"), address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Addend(-8), Bright, 0), (Eol, Normal, 0)]
[(Address(408), Dim, 5), (Basic(" ~> "), Rotating(16), 0), (Opcode("mov", 32811), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(412), Dim, 5), (Spacing(4), Normal, 0), (Opcode("strb", 32885), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(38)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(416), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldmia", 32791), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic("!"), Normal, 0), (Basic(", "), Normal, 0), (Basic("{"), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Address(420), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Symbol(Symbol { name: "data_027e103c", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(424), Dim, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode(".word", 65534), Normal, 10), (Symbol(Symbol { name: "data_027e1098", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(428), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Symbol(Symbol { name: "gPlayerControl", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global | Weak), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]

View File

@@ -1507,6 +1507,19 @@ Object {
align: None,
virtual_address: None,
},
Symbol {
name: "[.data-0]",
demangled_name: None,
address: 0,
size: 76,
kind: Section,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

View File

@@ -8,7 +8,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 0,
size: 2,
opcode: 56,
opcode: 59,
branch_dest: None,
},
),
@@ -22,7 +22,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 2,
size: 2,
opcode: 74,
opcode: 126,
branch_dest: None,
},
),
@@ -36,7 +36,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 4,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -50,7 +50,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 6,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -64,7 +64,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 8,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -78,7 +78,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 10,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -92,7 +92,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 12,
size: 2,
opcode: 66,
opcode: 116,
branch_dest: None,
},
),
@@ -106,7 +106,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 14,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -120,7 +120,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 18,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -134,7 +134,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 20,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
212,
),
@@ -155,7 +155,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 22,
size: 2,
opcode: 38,
opcode: 32,
branch_dest: None,
},
),
@@ -169,7 +169,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 24,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -183,7 +183,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 26,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
48,
),
@@ -204,7 +204,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 28,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -218,7 +218,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 30,
size: 2,
opcode: 26,
opcode: 16,
branch_dest: None,
},
),
@@ -232,7 +232,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 32,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
94,
),
@@ -253,7 +253,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 34,
size: 2,
opcode: 35,
opcode: 24,
branch_dest: None,
},
),
@@ -267,7 +267,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 36,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -281,7 +281,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 38,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -295,7 +295,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 40,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -309,7 +309,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 44,
size: 2,
opcode: 7,
opcode: 1,
branch_dest: None,
},
),
@@ -323,7 +323,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 46,
size: 2,
opcode: 55,
opcode: 58,
branch_dest: None,
},
),
@@ -337,7 +337,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 48,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -358,7 +358,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 50,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -372,7 +372,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 52,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -386,7 +386,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 56,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -400,7 +400,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 58,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
212,
),
@@ -421,7 +421,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 60,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -435,7 +435,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 62,
size: 2,
opcode: 33,
opcode: 24,
branch_dest: None,
},
),
@@ -449,7 +449,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 64,
size: 2,
opcode: 36,
opcode: 25,
branch_dest: None,
},
),
@@ -463,7 +463,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 66,
size: 2,
opcode: 42,
opcode: 36,
branch_dest: None,
},
),
@@ -477,7 +477,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 68,
size: 2,
opcode: 44,
opcode: 37,
branch_dest: None,
},
),
@@ -491,7 +491,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 70,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
212,
),
@@ -512,7 +512,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 72,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -526,7 +526,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 74,
size: 2,
opcode: 17,
opcode: 5,
branch_dest: None,
},
),
@@ -540,7 +540,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 76,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -568,7 +568,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 80,
size: 2,
opcode: 67,
opcode: 117,
branch_dest: None,
},
),
@@ -582,7 +582,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 82,
size: 2,
opcode: 36,
opcode: 25,
branch_dest: None,
},
),
@@ -596,7 +596,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 84,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -610,7 +610,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 86,
size: 2,
opcode: 7,
opcode: 1,
branch_dest: None,
},
),
@@ -638,7 +638,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 90,
size: 2,
opcode: 67,
opcode: 117,
branch_dest: None,
},
),
@@ -652,7 +652,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 92,
size: 2,
opcode: 55,
opcode: 58,
branch_dest: None,
},
),
@@ -666,7 +666,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 94,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -687,7 +687,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 96,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -701,7 +701,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 98,
size: 2,
opcode: 4,
opcode: 1,
branch_dest: None,
},
),
@@ -715,7 +715,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 100,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -729,7 +729,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 104,
size: 2,
opcode: 66,
opcode: 116,
branch_dest: None,
},
),
@@ -743,7 +743,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 106,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -757,7 +757,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 108,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -771,7 +771,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 112,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -785,7 +785,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 114,
size: 2,
opcode: 6,
opcode: 1,
branch_dest: None,
},
),
@@ -799,7 +799,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 116,
size: 2,
opcode: 66,
opcode: 116,
branch_dest: None,
},
),
@@ -813,7 +813,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 118,
size: 2,
opcode: 35,
opcode: 24,
branch_dest: None,
},
),
@@ -827,7 +827,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 120,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -841,7 +841,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 122,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -855,7 +855,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 124,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -869,7 +869,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 126,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -883,7 +883,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 130,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -897,7 +897,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 132,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
168,
),
@@ -918,7 +918,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 134,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -932,7 +932,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 136,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -946,7 +946,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 140,
size: 2,
opcode: 47,
opcode: 43,
branch_dest: None,
},
),
@@ -960,7 +960,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 142,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -974,7 +974,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 144,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
168,
),
@@ -995,7 +995,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 146,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -1009,7 +1009,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 148,
size: 2,
opcode: 33,
opcode: 24,
branch_dest: None,
},
),
@@ -1023,7 +1023,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 150,
size: 2,
opcode: 36,
opcode: 25,
branch_dest: None,
},
),
@@ -1037,7 +1037,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 152,
size: 2,
opcode: 42,
opcode: 36,
branch_dest: None,
},
),
@@ -1051,7 +1051,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 154,
size: 2,
opcode: 44,
opcode: 37,
branch_dest: None,
},
),
@@ -1065,7 +1065,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 156,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
168,
),
@@ -1086,7 +1086,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 158,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -1100,7 +1100,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 160,
size: 2,
opcode: 17,
opcode: 5,
branch_dest: None,
},
),
@@ -1114,7 +1114,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 162,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -1142,7 +1142,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 166,
size: 2,
opcode: 67,
opcode: 117,
branch_dest: None,
},
),
@@ -1156,7 +1156,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 168,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -1179,7 +1179,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 170,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
200,
),
@@ -1200,7 +1200,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 172,
size: 2,
opcode: 35,
opcode: 24,
branch_dest: None,
},
),
@@ -1214,7 +1214,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 174,
size: 2,
opcode: 25,
opcode: 16,
branch_dest: None,
},
),
@@ -1228,7 +1228,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 176,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
200,
),
@@ -1249,7 +1249,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 178,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -1263,7 +1263,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 180,
size: 2,
opcode: 37,
opcode: 25,
branch_dest: None,
},
),
@@ -1277,7 +1277,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 182,
size: 2,
opcode: 42,
opcode: 36,
branch_dest: None,
},
),
@@ -1291,7 +1291,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 184,
size: 2,
opcode: 44,
opcode: 37,
branch_dest: None,
},
),
@@ -1305,7 +1305,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 186,
size: 2,
opcode: 15,
opcode: 4,
branch_dest: Some(
200,
),
@@ -1326,7 +1326,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 188,
size: 2,
opcode: 32,
opcode: 24,
branch_dest: None,
},
),
@@ -1340,7 +1340,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 190,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -1354,7 +1354,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 192,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -1368,7 +1368,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 194,
size: 2,
opcode: 46,
opcode: 43,
branch_dest: None,
},
),
@@ -1382,7 +1382,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 196,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -1396,7 +1396,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 200,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -1419,7 +1419,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 202,
size: 2,
opcode: 35,
opcode: 24,
branch_dest: None,
},
),
@@ -1433,7 +1433,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 204,
size: 2,
opcode: 34,
opcode: 24,
branch_dest: None,
},
),
@@ -1447,7 +1447,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 206,
size: 2,
opcode: 4,
opcode: 1,
branch_dest: None,
},
),
@@ -1461,7 +1461,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 208,
size: 4,
opcode: 19,
opcode: 7,
branch_dest: None,
},
),
@@ -1475,7 +1475,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 212,
size: 2,
opcode: 7,
opcode: 1,
branch_dest: None,
},
),
@@ -1498,7 +1498,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 214,
size: 2,
opcode: 55,
opcode: 58,
branch_dest: None,
},
),
@@ -1512,7 +1512,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 216,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1526,7 +1526,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 220,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1540,7 +1540,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 224,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1554,7 +1554,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 228,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1568,7 +1568,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 232,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1582,7 +1582,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 236,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),
@@ -1596,7 +1596,7 @@ expression: diff.instruction_rows
InstructionRef {
address: 240,
size: 4,
opcode: 65535,
opcode: 65534,
branch_dest: None,
},
),

View File

@@ -1,111 +1,110 @@
---
source: objdiff-core/tests/arch_arm.rs
assertion_line: 33
expression: output
---
[(Line(37), Dim, 5), (Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("push", 56), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("lr")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(37), Dim, 5), (Address(2), Normal, 5), (Spacing(4), Normal, 0), (Opcode("sub", 74), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(37), Dim, 5), (Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(6), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(10), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(12), Normal, 5), (Spacing(4), Normal, 0), (Opcode("str", 66), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(14), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "PokeSet_IsRemovedAll", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(18), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(20), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 15), Normal, 10), (BranchDest(212), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(22), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrh", 38), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(24), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(164)), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(26), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 15), Normal, 10), (BranchDest(48), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(28), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(184)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(216), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(30), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 26), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(32), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 15), Normal, 10), (BranchDest(94), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(34), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 35), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(36), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(38), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(40), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "ServerDisplay_SkillSwap", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(44), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(46), Normal, 5), (Spacing(4), Normal, 0), (Opcode("pop", 55), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(48), Normal, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(50), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(52), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "ServerEvent_CreateSubstitute", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(56), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(58), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 15), Normal, 10), (BranchDest(212), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(60), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(156)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(220), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(62), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 33), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(64), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 36), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(66), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lsl", 42), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(68), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lsr", 44), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(70), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 15), Normal, 10), (BranchDest(212), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(74), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bic", 17), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(76), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(78), Normal, 5), (Spacing(4), Normal, 0), (Opcode("orr", 54), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(80), Normal, 5), (Spacing(4), Normal, 0), (Opcode("strb", 67), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(82), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 36), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(86), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(88), Normal, 5), (Spacing(4), Normal, 0), (Opcode("orr", 54), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(90), Normal, 5), (Spacing(4), Normal, 0), (Opcode("strb", 67), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(92), Normal, 5), (Spacing(4), Normal, 0), (Opcode("pop", 55), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(94), Normal, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(128)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(224), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(96), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(128)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(228), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(98), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 4), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(100), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "HEManager_PushState", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(104), Normal, 5), (Spacing(4), Normal, 0), (Opcode("str", 66), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(61), Dim, 5), (Address(106), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(61), Dim, 5), (Address(108), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "BattleHandler_Result", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(61), Dim, 5), (Address(112), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(114), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 6), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(12)), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(116), Normal, 5), (Spacing(4), Normal, 0), (Opcode("str", 66), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(118), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 35), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(120), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(122), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(124), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(126), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "ServerEvent_UncategorizedMove", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(130), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(132), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 15), Normal, 10), (BranchDest(168), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(65), Dim, 5), (Address(134), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(65), Dim, 5), (Address(136), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "BattleHandler_Result", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(65), Dim, 5), (Address(140), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 47), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(142), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(144), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 15), Normal, 10), (BranchDest(168), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(146), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(72)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(220), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(148), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 33), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(150), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 36), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(152), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lsl", 42), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(154), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lsr", 44), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(156), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 15), Normal, 10), (BranchDest(168), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(158), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(160), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bic", 17), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(162), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(164), Normal, 5), (Spacing(4), Normal, 0), (Opcode("orr", 54), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(166), Normal, 5), (Spacing(4), Normal, 0), (Opcode("strb", 67), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(168), Normal, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(170), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bhi", 15), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(172), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 35), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(12)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(174), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 25), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(176), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 15), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(178), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(52)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(232), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(180), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 37), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(182), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lsl", 42), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(27)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(184), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lsr", 44), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(186), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 15), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(188), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 32), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(12)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(190), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(44)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(236), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(192), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(90)), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(194), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 46), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(71)), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(196), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "SCQUE_PUT_MsgImpl", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(200), Normal, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(224), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(202), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 35), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(204), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 34), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(240), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(206), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 4), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(208), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 19), Normal, 10), (Symbol(Symbol { name: "HEManager_PopState", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(212), Normal, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(214), Normal, 5), (Spacing(4), Normal, 0), (Opcode("pop", 55), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(216), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(285)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(220), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(1192)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(224), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(7544)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(228), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(9103)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(232), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(1930)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(236), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(4294901760)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(240), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65535), Normal, 10), (Basic("#"), Normal, 0), (Argument(Unsigned(9129)), Normal, 0), (Eol, Normal, 0)]
[(Line(37), Dim, 5), (Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("push", 59), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("lr")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(37), Dim, 5), (Address(2), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 126), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(37), Dim, 5), (Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(6), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(10), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(12), Dim, 5), (Spacing(4), Normal, 0), (Opcode("str", 116), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(14), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "PokeSet_IsRemovedAll", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(18), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(39), Dim, 5), (Address(20), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 4), Normal, 10), (BranchDest(212), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(22), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrh", 32), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(24), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(164)), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(26), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 4), Normal, 10), (BranchDest(48), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(184)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(216), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(30), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(32), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 4), Normal, 10), (BranchDest(94), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(34), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(36), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(38), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Line(47), Dim, 5), (Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "ServerDisplay_SkillSwap", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(44), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 1), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(46), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 58), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(48), Dim, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(50), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(52), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "ServerEvent_CreateSubstitute", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(56), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(58), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 4), Normal, 10), (BranchDest(212), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(60), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(156)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(220), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(62), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(64), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 25), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(66), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lsl", 36), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(68), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lsr", 37), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(70), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 4), Normal, 10), (BranchDest(212), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(74), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bic", 5), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(76), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(78), Dim, 5), (Spacing(4), Normal, 0), (Opcode("orr", 54), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(80), Dim, 5), (Spacing(4), Normal, 0), (Opcode("strb", 117), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(82), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 25), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(84), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(86), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 1), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(88), Dim, 5), (Spacing(4), Normal, 0), (Opcode("orr", 54), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(52), Dim, 5), (Address(90), Dim, 5), (Spacing(4), Normal, 0), (Opcode("strb", 117), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(92), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 58), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(94), Dim, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(128)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(224), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(96), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(128)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(228), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(98), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 1), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(100), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "HEManager_PushState", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(104), Dim, 5), (Spacing(4), Normal, 0), (Opcode("str", 116), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(61), Dim, 5), (Address(106), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(61), Dim, 5), (Address(108), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "BattleHandler_Result", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(61), Dim, 5), (Address(112), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(114), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 1), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(12)), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(116), Dim, 5), (Spacing(4), Normal, 0), (Opcode("str", 116), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(118), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(120), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(122), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(124), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(126), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "ServerEvent_UncategorizedMove", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(130), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(132), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 4), Normal, 10), (BranchDest(168), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(65), Dim, 5), (Address(134), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Line(65), Dim, 5), (Address(136), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "BattleHandler_Result", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(65), Dim, 5), (Address(140), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(142), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(144), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 4), Normal, 10), (BranchDest(168), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(146), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(72)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(220), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(148), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(150), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 25), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(152), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lsl", 36), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(154), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lsr", 37), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(156), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 4), Normal, 10), (BranchDest(168), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(158), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(160), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bic", 5), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(162), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(164), Dim, 5), (Spacing(4), Normal, 0), (Opcode("orr", 54), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r2")), Normal, 0), (Eol, Normal, 0)]
[(Line(68), Dim, 5), (Address(166), Dim, 5), (Spacing(4), Normal, 0), (Opcode("strb", 117), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(5)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(168), Dim, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(170), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bhi", 4), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(172), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(12)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(174), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 16), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(176), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 4), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(178), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(52)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(232), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(180), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldrb", 25), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(182), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lsl", 36), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(27)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(184), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lsr", 37), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(31)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(186), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 4), Normal, 10), (BranchDest(200), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(188), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(12)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(190), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(44)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(236), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(192), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(90)), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(194), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 43), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(71)), Normal, 0), (Eol, Normal, 0)]
[(Line(77), Dim, 5), (Address(196), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "SCQUE_PUT_MsgImpl", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(200), Dim, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(20)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(224), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(202), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(204), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ldr", 24), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Basic(" (->"), Normal, 0), (BranchDest(240), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(206), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 1), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(208), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 7), Normal, 10), (Symbol(Symbol { name: "HEManager_PopState", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Addend(-4), Bright, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(212), Dim, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("add", 1), Normal, 10), (Argument(Opaque("sp")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(214), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 58), Normal, 10), (Basic("{"), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("pc")), Normal, 0), (Basic("}"), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(216), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(285)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(220), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(1192)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(224), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(7544)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(228), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(9103)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(232), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(1930)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(236), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(4294901760)), Normal, 0), (Eol, Normal, 0)]
[(Line(86), Dim, 5), (Address(240), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".word", 65534), Normal, 10), (Argument(Unsigned(9129)), Normal, 0), (Eol, Normal, 0)]

View File

@@ -0,0 +1,7 @@
---
source: objdiff-core/tests/arch_arm.rs
expression: output
---
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("str", 116), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(36)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(2), Dim, 5), (Spacing(4), Normal, 0), (Opcode("str", 116), Normal, 10), (Argument(Opaque("r2")), Normal, 0), (Basic(", "), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("#"), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bx", 9), Normal, 10), (Argument(Opaque("lr")), Normal, 0), (Eol, Normal, 0)]

View File

@@ -0,0 +1,48 @@
---
source: objdiff-core/tests/arch_arm.rs
expression: diff.instruction_rows
---
[
InstructionDiffRow {
ins_ref: Some(
InstructionRef {
address: 0,
size: 2,
opcode: 116,
branch_dest: None,
},
),
kind: None,
branch_from: None,
branch_to: None,
arg_diff: [],
},
InstructionDiffRow {
ins_ref: Some(
InstructionRef {
address: 2,
size: 2,
opcode: 116,
branch_dest: None,
},
),
kind: None,
branch_from: None,
branch_to: None,
arg_diff: [],
},
InstructionDiffRow {
ins_ref: Some(
InstructionRef {
address: 4,
size: 2,
opcode: 9,
branch_dest: None,
},
),
kind: None,
branch_from: None,
branch_to: None,
arg_diff: [],
},
]

View File

@@ -449,4 +449,17 @@ expression: obj.symbols
align: None,
virtual_address: None,
},
Symbol {
name: "[.data-0]",
demangled_name: None,
address: 0,
size: 0,
kind: Section,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
]

View File

@@ -2,49 +2,49 @@
source: objdiff-core/tests/arch_mips.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$sp")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-32)), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(12), Normal, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$s2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Normal, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$ra")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(24)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglSleep", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(24), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(28), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lw", 26), Normal, 10), (Argument(Opaque("$a1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%gp_rel("), Normal, 0), (Symbol(Symbol { name: "WorkEnd", demangled_name: None, address: 64, size: 4, kind: Object, section: Some(8), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$gp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(32), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%hi("), Normal, 0), (Symbol(Symbol { name: "[.sdata]", demangled_name: None, address: 0, size: 64, kind: Section, section: Some(8), flags: FlagSet(Local), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(36), Normal, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglSoundLoadEffect", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(44), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%lo("), Normal, 0), (Symbol(Symbol { name: "[.sdata]", demangled_name: None, address: 0, size: 64, kind: Section, section: Some(8), flags: FlagSet(Local), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(48), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%hi("), Normal, 0), (Symbol(Symbol { name: "PacketBottomNewVu1DropMicroCode", demangled_name: None, address: 0, size: 12, kind: Object, section: Some(7), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lw", 26), Normal, 10), (Argument(Opaque("$a1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%gp_rel("), Normal, 0), (Symbol(Symbol { name: "WorkEnd", demangled_name: None, address: 64, size: 4, kind: Object, section: Some(8), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$gp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(56), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglSoundLoadSwd", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(60), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%lo("), Normal, 0), (Symbol(Symbol { name: "PacketBottomNewVu1DropMicroCode", demangled_name: None, address: 0, size: 12, kind: Object, section: Some(7), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(64), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lw", 26), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%gp_rel("), Normal, 0), (Symbol(Symbol { name: "WorkEnd", demangled_name: None, address: 64, size: 4, kind: Object, section: Some(8), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$gp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(68), Normal, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "SsdAddWaveData", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(76), Normal, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Normal, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "SsdSpuDmaCompleted", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(88), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bnez", 56), Normal, 10), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (BranchDest(80), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(92), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(96), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglRenderDispOn", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(100), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(255)), Normal, 0), (Eol, Normal, 0)]
[(Address(104), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglCdLoadOverlay", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(108), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "LogoFirst", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(116), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ori", 16), Normal, 10), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(65535)), Normal, 0), (Eol, Normal, 0)]
[(Address(120), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%hi("), Normal, 0), (Symbol(Symbol { name: "Title", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(124), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$s2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%lo("), Normal, 0), (Symbol(Symbol { name: "Title", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(128), Normal, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglCdLoadOverlay", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(132), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(136), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "Title", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(140), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(144), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beqz", 55), Normal, 10), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (BranchDest(128), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(148), Normal, 5), (Spacing(4), Normal, 0), (Opcode("and", 90), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$s1")), Normal, 0), (Eol, Normal, 0)]
[(Address(152), Normal, 5), (Spacing(4), Normal, 0), (Opcode("beq", 3), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$s2")), Normal, 0), (Basic(", "), Normal, 0), (BranchDest(128), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(156), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(160), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglCdLoadOverlay", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(164), Normal, 5), (Spacing(4), Normal, 0), (Opcode("srl", 60), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("24")), Normal, 0), (Eol, Normal, 0)]
[(Address(168), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jalr", 77), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(176), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 54), Normal, 10), (BranchDest(128), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(180), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$sp")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-32)), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(12), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$s2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sd", 44), Normal, 10), (Argument(Opaque("$ra")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(24)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$sp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglSleep", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(24), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lw", 26), Normal, 10), (Argument(Opaque("$a1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%gp_rel("), Normal, 0), (Symbol(Symbol { name: "WorkEnd", demangled_name: None, address: 64, size: 4, kind: Object, section: Some(8), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$gp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(32), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%hi("), Normal, 0), (Symbol(Symbol { name: "[.sdata]", demangled_name: None, address: 0, size: 0, kind: Section, section: Some(8), flags: FlagSet(Local), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(36), Dim, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglSoundLoadEffect", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(44), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%lo("), Normal, 0), (Symbol(Symbol { name: "[.sdata]", demangled_name: None, address: 0, size: 0, kind: Section, section: Some(8), flags: FlagSet(Local), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(48), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%hi("), Normal, 0), (Symbol(Symbol { name: "PacketBottomNewVu1DropMicroCode", demangled_name: None, address: 0, size: 12, kind: Object, section: Some(7), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lw", 26), Normal, 10), (Argument(Opaque("$a1")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%gp_rel("), Normal, 0), (Symbol(Symbol { name: "WorkEnd", demangled_name: None, address: 64, size: 4, kind: Object, section: Some(8), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$gp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(56), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglSoundLoadSwd", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(60), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%lo("), Normal, 0), (Symbol(Symbol { name: "PacketBottomNewVu1DropMicroCode", demangled_name: None, address: 0, size: 12, kind: Object, section: Some(7), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(64), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lw", 26), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%gp_rel("), Normal, 0), (Symbol(Symbol { name: "WorkEnd", demangled_name: None, address: 64, size: 4, kind: Object, section: Some(8), flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("$gp")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(68), Dim, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "SsdAddWaveData", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(76), Dim, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Dim, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "SsdSpuDmaCompleted", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(84), Dim, 5), (Spacing(4), Normal, 0), (Opcode("daddu", 97), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Eol, Normal, 0)]
[(Address(88), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bnez", 56), Normal, 10), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (BranchDest(80), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(92), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(96), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglRenderDispOn", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(100), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(255)), Normal, 0), (Eol, Normal, 0)]
[(Address(104), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglCdLoadOverlay", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(108), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "LogoFirst", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(116), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ori", 16), Normal, 10), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$s1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(65535)), Normal, 0), (Eol, Normal, 0)]
[(Address(120), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lui", 20), Normal, 10), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%hi("), Normal, 0), (Symbol(Symbol { name: "Title", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(124), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$s2")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Basic("%lo("), Normal, 0), (Symbol(Symbol { name: "Title", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(128), Dim, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglCdLoadOverlay", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(132), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addiu", 12), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$zero")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(136), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "Title", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(140), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(144), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beqz", 55), Normal, 10), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (BranchDest(128), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(148), Dim, 5), (Spacing(4), Normal, 0), (Opcode("and", 90), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$s1")), Normal, 0), (Eol, Normal, 0)]
[(Address(152), Dim, 5), (Spacing(4), Normal, 0), (Opcode("beq", 3), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$s2")), Normal, 0), (Basic(", "), Normal, 0), (BranchDest(128), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(156), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(160), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jal", 2), Normal, 10), (Symbol(Symbol { name: "xglCdLoadOverlay", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(164), Dim, 5), (Spacing(4), Normal, 0), (Opcode("srl", 60), Normal, 10), (Argument(Opaque("$a0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("$v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("24")), Normal, 0), (Eol, Normal, 0)]
[(Address(168), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jalr", 77), Normal, 10), (Argument(Opaque("$s0")), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]
[(Address(176), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 54), Normal, 10), (BranchDest(128), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(180), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 113), Normal, 10), (Eol, Normal, 0)]

View File

@@ -1,11 +1,12 @@
---
source: objdiff-core/tests/arch_mips.rs
assertion_line: 12
expression: obj
---
Object {
arch: ArchMips {
endianness: Little,
abi: N32,
abi: EABI64,
isa_extension: Some(
R5900EE,
),
@@ -51,6 +52,7 @@ Object {
{},
],
ignored_symbols: {},
diff_side: Base,
},
endianness: Little,
symbols: [
@@ -110,7 +112,7 @@ Object {
name: "[.sdata]",
demangled_name: None,
address: 0,
size: 64,
size: 0,
kind: Section,
section: Some(
8,
@@ -671,6 +673,45 @@ Object {
align: None,
virtual_address: None,
},
Symbol {
name: "[.data-0]",
demangled_name: None,
address: 0,
size: 0,
kind: Section,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rodata-0]",
demangled_name: None,
address: 0,
size: 12,
kind: Section,
section: Some(
7,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.sdata-0]",
demangled_name: None,
address: 0,
size: 76,
kind: Section,
section: Some(
8,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

View File

@@ -2645,6 +2645,7 @@ expression: "(target_symbol_diff, base_symbol_diff)"
arg_diff: [],
},
],
data_rows: [],
},
SymbolDiff {
target_symbol: Some(
@@ -5288,5 +5289,6 @@ expression: "(target_symbol_diff, base_symbol_diff)"
arg_diff: [],
},
],
data_rows: [],
},
)

View File

@@ -1,6 +1,5 @@
---
source: objdiff-core/tests/arch_ppc.rs
assertion_line: 70
expression: sections_display
---
[
@@ -27,6 +26,7 @@ expression: sections_display
is_mapping_symbol: false,
},
],
kind: Common,
},
SectionDisplay {
id: ".ctors-0",
@@ -37,10 +37,11 @@ expression: sections_display
),
symbols: [
SectionDisplaySymbol {
symbol: 2,
symbol: 16,
is_mapping_symbol: false,
},
],
kind: Data,
},
SectionDisplay {
id: ".text-0",
@@ -83,5 +84,6 @@ expression: sections_display
is_mapping_symbol: false,
},
],
kind: Code,
},
]

View File

@@ -69,19 +69,19 @@ Object {
action_param: 0,
has_end_bit: true,
bytes: [
130,
0,
0,
8,
0,
0,
0,
0,
],
},
],
relocations: [
Relocation {
offset: 20,
address: 0,
offset: 18,
address: 524288,
},
],
},
@@ -308,6 +308,32 @@ Object {
align: None,
virtual_address: None,
},
Symbol {
name: "[extab-0]",
demangled_name: None,
address: 0,
size: 40,
kind: Section,
section: Some(
1,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[extabindex-0]",
demangled_name: None,
address: 0,
size: 36,
kind: Section,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

View File

@@ -2,69 +2,69 @@
source: objdiff-core/tests/arch_ppc.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("srwi", 283), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("24")), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(20), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(12), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(32), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(20), Normal, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(24), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(32), Normal, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("extrwi", 283), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("8")), Normal, 0), (Eol, Normal, 0)]
[(Address(36), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(44), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(56), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Address(48), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(68), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Address(56), Normal, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(60), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(64), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(68), Normal, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("extrwi", 283), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("16")), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(76), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(96), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Address(88), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(92), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(108), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Address(96), Normal, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(100), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(104), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(108), Normal, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode("clrlwi", 283), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("24")), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(116), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(120), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(2)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(124), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(136), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(128), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(132), Normal, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(148), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Address(136), Normal, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(140), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(144), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(148), Normal, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(152), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(156), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(3)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(160), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(164), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(168), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(45)), Normal, 0), (Eol, Normal, 0)]
[(Address(176), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbz", 441), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(180), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(184), Normal, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(188), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(196), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
[(Address(192), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(196), Normal, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode("lbzu", 442), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(200), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(204), Normal, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(208), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(216), Normal, 0), (Basic(" ~>"), Rotating(9), 0), (Eol, Normal, 0)]
[(Address(212), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(216), Normal, 5), (Basic(" ~> "), Rotating(9), 0), (Opcode("lbzu", 442), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(220), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(224), Normal, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(228), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(236), Normal, 0), (Basic(" ~>"), Rotating(10), 0), (Eol, Normal, 0)]
[(Address(232), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(236), Normal, 5), (Basic(" ~> "), Rotating(10), 0), (Opcode("lbzu", 442), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(240), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(244), Normal, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(248), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(256), Normal, 0), (Basic(" ~>"), Rotating(11), 0), (Eol, Normal, 0)]
[(Address(252), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(256), Normal, 5), (Basic(" ~> "), Rotating(11), 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(260), Normal, 5), (Spacing(4), Normal, 0), (Opcode("blr", 269), Normal, 10), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("srwi", 283), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("24")), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(20), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(12), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(32), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(20), Dim, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(24), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(32), Dim, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("extrwi", 283), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("8")), Normal, 0), (Eol, Normal, 0)]
[(Address(36), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(44), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(56), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Address(48), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(68), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Address(56), Dim, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(60), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(64), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(68), Dim, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("extrwi", 283), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("16")), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(76), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(84), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(96), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Address(88), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(92), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(108), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Address(96), Dim, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(100), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(104), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(108), Dim, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode("clrlwi", 283), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("24")), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(116), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmpwi", 260), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(120), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(2)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(124), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(136), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(128), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-1)), Normal, 0), (Eol, Normal, 0)]
[(Address(132), Dim, 5), (Spacing(4), Normal, 0), (Opcode("b", 267), Normal, 10), (BranchDest(148), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Address(136), Dim, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(140), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(144), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__upper_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(148), Dim, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(152), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(156), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(3)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(160), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@ha"), Normal, 0), (Eol, Normal, 0)]
[(Address(164), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(168), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(45)), Normal, 0), (Eol, Normal, 0)]
[(Address(176), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbz", 441), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(180), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(184), Dim, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(188), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(196), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
[(Address(192), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(196), Dim, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode("lbzu", 442), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(200), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(204), Dim, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(208), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(216), Normal, 0), (Basic(" ~>"), Rotating(9), 0), (Eol, Normal, 0)]
[(Address(212), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(216), Dim, 5), (Basic(" ~> "), Rotating(9), 0), (Opcode("lbzu", 442), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(220), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(224), Dim, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(228), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(236), Normal, 0), (Basic(" ~>"), Rotating(10), 0), (Eol, Normal, 0)]
[(Address(232), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(236), Dim, 5), (Basic(" ~> "), Rotating(10), 0), (Opcode("lbzu", 442), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(240), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lbzx", 323), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(" <"), Normal, 0), (Symbol(Symbol { name: "__ctype_map", demangled_name: None, address: 0, size: 0, kind: Unknown, section: None, flags: FlagSet(Global), align: None, virtual_address: Some(0) }), Bright, 0), (Basic(">"), Normal, 0), (Eol, Normal, 0)]
[(Address(244), Dim, 5), (Spacing(4), Normal, 0), (Opcode("andi.", 289), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Unsigned(220)), Normal, 0), (Eol, Normal, 0)]
[(Address(248), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bne", 265), Normal, 10), (BranchDest(256), Normal, 0), (Basic(" ~>"), Rotating(11), 0), (Eol, Normal, 0)]
[(Address(252), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stb", 445), Normal, 10), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(256), Dim, 5), (Basic(" ~> "), Rotating(11), 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "text$52", demangled_name: None, address: 8, size: 5, kind: Object, section: Some(2), flags: FlagSet(Local), align: None, virtual_address: Some(2153420056) }), Bright, 0), (Basic("@sda21"), Normal, 0), (Eol, Normal, 0)]
[(Address(260), Dim, 5), (Spacing(4), Normal, 0), (Opcode("blr", 269), Normal, 10), (Eol, Normal, 0)]

View File

@@ -43,7 +43,7 @@ Object {
name: "[.ctors]",
demangled_name: None,
address: 0,
size: 4,
size: 0,
kind: Section,
section: Some(
1,
@@ -157,6 +157,19 @@ Object {
0,
),
},
Symbol {
name: "[.ctors-0]",
demangled_name: None,
address: 0,
size: 4,
kind: Section,
section: Some(
1,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

View File

@@ -2,133 +2,133 @@
source: objdiff-core/tests/arch_ppc.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mflr", 342), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stw", 443), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-8)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stwu", 444), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-336)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(12), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f800000", demangled_name: None, address: 388, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f0")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f800000", demangled_name: None, address: 388, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(272)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(24), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40000000", demangled_name: None, address: 384, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f13")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40000000", demangled_name: None, address: 384, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(32), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f13")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(276)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(36), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40400000", demangled_name: None, address: 380, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f12")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40400000", demangled_name: None, address: 380, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(44), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(280)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(48), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40800000", demangled_name: None, address: 376, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40800000", demangled_name: None, address: 376, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(56), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(284)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(60), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40a00000", demangled_name: None, address: 372, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(64), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f10")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40a00000", demangled_name: None, address: 372, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(68), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(256)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40c00000", demangled_name: None, address: 368, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(76), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40c00000", demangled_name: None, address: 368, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(260)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40e00000", demangled_name: None, address: 364, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(88), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f8")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40e00000", demangled_name: None, address: 364, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(92), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(264)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(96), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@41000000", demangled_name: None, address: 360, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(100), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@41000000", demangled_name: None, address: 360, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(104), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(268)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(108), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f6")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(116), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(224)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(120), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(124), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(128), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(228)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(132), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(136), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(140), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(232)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(144), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(148), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(152), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(236)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(156), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(160), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(272)), Normal, 0), (Eol, Normal, 0)]
[(Address(164), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__lvx", demangled_name: None, address: 640, size: 24, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(168), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(80)), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(176), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(80)), Normal, 0), (Eol, Normal, 0)]
[(Address(180), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Eol, Normal, 0)]
[(Address(184), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(188), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(192), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(196), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(256)), Normal, 0), (Eol, Normal, 0)]
[(Address(200), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__lvx", demangled_name: None, address: 640, size: 24, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(204), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(96)), Normal, 0), (Eol, Normal, 0)]
[(Address(208), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(212), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(96)), Normal, 0), (Eol, Normal, 0)]
[(Address(216), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v13")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(220), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(224), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v13")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Address(228), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(232), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(224)), Normal, 0), (Eol, Normal, 0)]
[(Address(236), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__lvx", demangled_name: None, address: 640, size: 24, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(240), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(112)), Normal, 0), (Eol, Normal, 0)]
[(Address(244), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Eol, Normal, 0)]
[(Address(248), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(112)), Normal, 0), (Eol, Normal, 0)]
[(Address(252), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Eol, Normal, 0)]
[(Address(256), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(304)), Normal, 0), (Eol, Normal, 0)]
[(Address(260), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Eol, Normal, 0)]
[(Address(264), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(304)), Normal, 0), (Eol, Normal, 0)]
[(Address(268), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(272), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(276), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Eol, Normal, 0)]
[(Address(280), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(284), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(288), Normal, 5), (Spacing(4), Normal, 0), (Opcode("vmaddfp", 76), Normal, 10), (Argument(Opaque("v8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v11")), Normal, 0), (Eol, Normal, 0)]
[(Address(292), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(128)), Normal, 0), (Eol, Normal, 0)]
[(Address(296), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(300), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(128)), Normal, 0), (Eol, Normal, 0)]
[(Address(304), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(308), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(192)), Normal, 0), (Eol, Normal, 0)]
[(Address(312), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Address(316), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(320), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Eol, Normal, 0)]
[(Address(324), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(328), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Eol, Normal, 0)]
[(Address(332), Normal, 5), (Spacing(4), Normal, 0), (Opcode("vmsum4fp128", 203), Normal, 10), (Argument(Opaque("v4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v6")), Normal, 0), (Eol, Normal, 0)]
[(Address(336), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(144)), Normal, 0), (Eol, Normal, 0)]
[(Address(340), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Eol, Normal, 0)]
[(Address(344), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(144)), Normal, 0), (Eol, Normal, 0)]
[(Address(348), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(352), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(176)), Normal, 0), (Eol, Normal, 0)]
[(Address(356), Normal, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Eol, Normal, 0)]
[(Address(360), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(364), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(288)), Normal, 0), (Eol, Normal, 0)]
[(Address(368), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(192)), Normal, 0), (Eol, Normal, 0)]
[(Address(372), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(376), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__stvx", demangled_name: None, address: 664, size: 40, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(380), Normal, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(384), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(160)), Normal, 0), (Eol, Normal, 0)]
[(Address(388), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(176)), Normal, 0), (Eol, Normal, 0)]
[(Address(392), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(396), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__stvx", demangled_name: None, address: 664, size: 40, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(400), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4433", demangled_name: None, address: 32, size: 32, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(404), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4433", demangled_name: None, address: 32, size: 32, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(408), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "printf", demangled_name: None, address: 0, size: 0, kind: Function, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(412), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(416), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Address(420), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4434", demangled_name: None, address: 64, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(424), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4434", demangled_name: None, address: 64, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(428), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(432), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(436), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Eol, Normal, 0)]
[(Address(440), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4435", demangled_name: None, address: 72, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(444), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4435", demangled_name: None, address: 72, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(448), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(452), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(192)), Normal, 0), (Eol, Normal, 0)]
[(Address(456), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(460), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4436", demangled_name: None, address: 80, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(464), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4436", demangled_name: None, address: 80, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(468), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(472), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(176)), Normal, 0), (Eol, Normal, 0)]
[(Address(476), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(480), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4437", demangled_name: None, address: 92, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(484), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4437", demangled_name: None, address: 92, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(488), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(492), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4438", demangled_name: None, address: 104, size: 4, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(496), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4438", demangled_name: None, address: 104, size: 4, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(500), Normal, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "printf", demangled_name: None, address: 0, size: 0, kind: Function, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(504), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(336)), Normal, 0), (Eol, Normal, 0)]
[(Address(508), Normal, 5), (Spacing(4), Normal, 0), (Opcode("lwz", 439), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-8)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(512), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mtlr", 348), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Eol, Normal, 0)]
[(Address(516), Normal, 5), (Spacing(4), Normal, 0), (Opcode("blr", 269), Normal, 10), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mflr", 342), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stw", 443), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-8)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stwu", 444), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-336)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(12), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f800000", demangled_name: None, address: 388, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f0")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f800000", demangled_name: None, address: 388, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(272)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(24), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40000000", demangled_name: None, address: 384, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f13")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40000000", demangled_name: None, address: 384, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(32), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f13")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(276)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(36), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40400000", demangled_name: None, address: 380, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f12")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40400000", demangled_name: None, address: 380, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(44), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(280)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(48), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40800000", demangled_name: None, address: 376, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40800000", demangled_name: None, address: 376, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(56), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(284)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(60), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40a00000", demangled_name: None, address: 372, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(64), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f10")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40a00000", demangled_name: None, address: 372, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(68), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(256)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40c00000", demangled_name: None, address: 368, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(76), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40c00000", demangled_name: None, address: 368, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(80), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(260)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(84), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40e00000", demangled_name: None, address: 364, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(88), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f8")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@40e00000", demangled_name: None, address: 364, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(92), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(264)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(96), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@41000000", demangled_name: None, address: 360, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(100), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@41000000", demangled_name: None, address: 360, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(104), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(268)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(108), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(112), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f6")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(116), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(224)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(120), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(124), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(128), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(228)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(132), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(136), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(140), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(232)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(144), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(148), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lfs", 455), Normal, 10), (Argument(Opaque("f3")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "__real@3f000000", demangled_name: None, address: 356, size: 4, kind: Object, section: Some(4), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(152), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stfs", 459), Normal, 10), (Argument(Opaque("f3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(236)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(156), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(160), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(272)), Normal, 0), (Eol, Normal, 0)]
[(Address(164), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__lvx", demangled_name: None, address: 640, size: 24, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(168), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(80)), Normal, 0), (Eol, Normal, 0)]
[(Address(172), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(176), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(80)), Normal, 0), (Eol, Normal, 0)]
[(Address(180), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Eol, Normal, 0)]
[(Address(184), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(188), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(192), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(196), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(256)), Normal, 0), (Eol, Normal, 0)]
[(Address(200), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__lvx", demangled_name: None, address: 640, size: 24, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(204), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(96)), Normal, 0), (Eol, Normal, 0)]
[(Address(208), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(212), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(96)), Normal, 0), (Eol, Normal, 0)]
[(Address(216), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v13")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(220), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(224), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v13")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Address(228), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(232), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(224)), Normal, 0), (Eol, Normal, 0)]
[(Address(236), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__lvx", demangled_name: None, address: 640, size: 24, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(240), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(112)), Normal, 0), (Eol, Normal, 0)]
[(Address(244), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Eol, Normal, 0)]
[(Address(248), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(112)), Normal, 0), (Eol, Normal, 0)]
[(Address(252), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Eol, Normal, 0)]
[(Address(256), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(304)), Normal, 0), (Eol, Normal, 0)]
[(Address(260), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Eol, Normal, 0)]
[(Address(264), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(304)), Normal, 0), (Eol, Normal, 0)]
[(Address(268), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(272), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(276), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Eol, Normal, 0)]
[(Address(280), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(284), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(288), Dim, 5), (Spacing(4), Normal, 0), (Opcode("vmaddfp", 76), Normal, 10), (Argument(Opaque("v8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v11")), Normal, 0), (Eol, Normal, 0)]
[(Address(292), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(128)), Normal, 0), (Eol, Normal, 0)]
[(Address(296), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(300), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(128)), Normal, 0), (Eol, Normal, 0)]
[(Address(304), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Eol, Normal, 0)]
[(Address(308), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(192)), Normal, 0), (Eol, Normal, 0)]
[(Address(312), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Address(316), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(320), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Eol, Normal, 0)]
[(Address(324), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(328), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Eol, Normal, 0)]
[(Address(332), Dim, 5), (Spacing(4), Normal, 0), (Opcode("vmsum4fp128", 203), Normal, 10), (Argument(Opaque("v4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("v6")), Normal, 0), (Eol, Normal, 0)]
[(Address(336), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(144)), Normal, 0), (Eol, Normal, 0)]
[(Address(340), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Eol, Normal, 0)]
[(Address(344), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(144)), Normal, 0), (Eol, Normal, 0)]
[(Address(348), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(352), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(176)), Normal, 0), (Eol, Normal, 0)]
[(Address(356), Dim, 5), (Spacing(4), Normal, 0), (Opcode("stvx128", 194), Normal, 10), (Argument(Opaque("v3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Eol, Normal, 0)]
[(Address(360), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(364), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(288)), Normal, 0), (Eol, Normal, 0)]
[(Address(368), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(192)), Normal, 0), (Eol, Normal, 0)]
[(Address(372), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(376), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__stvx", demangled_name: None, address: 664, size: 40, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(380), Dim, 5), (Spacing(4), Normal, 0), (Opcode("li", 263), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(0)), Normal, 0), (Eol, Normal, 0)]
[(Address(384), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(160)), Normal, 0), (Eol, Normal, 0)]
[(Address(388), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(176)), Normal, 0), (Eol, Normal, 0)]
[(Address(392), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Eol, Normal, 0)]
[(Address(396), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "__stvx", demangled_name: None, address: 664, size: 40, kind: Function, section: Some(5), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(400), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4433", demangled_name: None, address: 32, size: 32, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(404), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4433", demangled_name: None, address: 32, size: 32, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(408), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "printf", demangled_name: None, address: 0, size: 0, kind: Function, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(412), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(240)), Normal, 0), (Eol, Normal, 0)]
[(Address(416), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r3")), Normal, 0), (Eol, Normal, 0)]
[(Address(420), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4434", demangled_name: None, address: 64, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(424), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r11")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4434", demangled_name: None, address: 64, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(428), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(432), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r10")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(208)), Normal, 0), (Eol, Normal, 0)]
[(Address(436), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r10")), Normal, 0), (Eol, Normal, 0)]
[(Address(440), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4435", demangled_name: None, address: 72, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(444), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r9")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4435", demangled_name: None, address: 72, size: 8, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(448), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(452), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r8")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(192)), Normal, 0), (Eol, Normal, 0)]
[(Address(456), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r8")), Normal, 0), (Eol, Normal, 0)]
[(Address(460), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4436", demangled_name: None, address: 80, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(464), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r7")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4436", demangled_name: None, address: 80, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(468), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(472), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r6")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(176)), Normal, 0), (Eol, Normal, 0)]
[(Address(476), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lvx128", 187), Normal, 10), (Argument(Opaque("v1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r0")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r6")), Normal, 0), (Eol, Normal, 0)]
[(Address(480), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4437", demangled_name: None, address: 92, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(484), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r5")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4437", demangled_name: None, address: 92, size: 12, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(488), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "?PrintVector@@YAXPBDU__vector4@@@Z", demangled_name: Some("void __cdecl PrintVector(char const *, struct __vector4)"), address: 0, size: 120, kind: Function, section: Some(5), flags: FlagSet(Global | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(492), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lis", 264), Normal, 10), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4438", demangled_name: None, address: 104, size: 4, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@h"), Normal, 0), (Eol, Normal, 0)]
[(Address(496), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r3")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r4")), Normal, 0), (Basic(", "), Normal, 0), (Symbol(Symbol { name: "$SG4438", demangled_name: None, address: 104, size: 4, kind: Object, section: Some(4), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Basic("@l"), Normal, 0), (Eol, Normal, 0)]
[(Address(500), Dim, 5), (Spacing(4), Normal, 0), (Opcode("bl", 267), Normal, 10), (Symbol(Symbol { name: "printf", demangled_name: None, address: 0, size: 0, kind: Function, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(504), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addi", 263), Normal, 10), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(336)), Normal, 0), (Eol, Normal, 0)]
[(Address(508), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lwz", 439), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Basic(", "), Normal, 0), (Argument(Signed(-8)), Normal, 0), (Basic("("), Normal, 0), (Argument(Opaque("r1")), Normal, 0), (Basic(")"), Normal, 0), (Eol, Normal, 0)]
[(Address(512), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mtlr", 348), Normal, 10), (Argument(Opaque("r12")), Normal, 0), (Eol, Normal, 0)]
[(Address(516), Dim, 5), (Spacing(4), Normal, 0), (Opcode("blr", 269), Normal, 10), (Eol, Normal, 0)]

View File

@@ -1101,6 +1101,45 @@ Object {
align: None,
virtual_address: None,
},
Symbol {
name: "[.XBLD$W-0]",
demangled_name: None,
address: 0,
size: 16,
kind: Section,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rdata-0]",
demangled_name: None,
address: 0,
size: 416,
kind: Section,
section: Some(
4,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.pdata-0]",
demangled_name: None,
address: 0,
size: 40,
kind: Section,
section: Some(
6,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

View File

@@ -14,6 +14,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-1",
@@ -26,6 +27,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-2",
@@ -38,6 +40,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-3",
@@ -50,6 +53,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-4",
@@ -62,6 +66,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-5",
@@ -74,6 +79,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-6",
@@ -86,6 +92,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-7",
@@ -98,6 +105,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-8",
@@ -110,6 +118,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-9",
@@ -122,6 +131,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-10",
@@ -134,6 +144,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-11",
@@ -146,6 +157,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-12",
@@ -158,6 +170,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-13",
@@ -170,6 +183,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-14",
@@ -182,6 +196,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-15",
@@ -194,6 +209,7 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
SectionDisplay {
id: ".text-16",
@@ -206,5 +222,6 @@ expression: section_display
is_mapping_symbol: false,
},
],
kind: Code,
},
]

View File

@@ -2,10 +2,10 @@
source: objdiff-core/tests/arch_x86.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Argument(Opaque("ebp")), Normal, 0), (Eol, Normal, 0)]
[(Address(1), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ebp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Eol, Normal, 0)]
[(Address(3), Normal, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Symbol(Symbol { name: "$SG526", demangled_name: None, address: 4, size: 6, kind: Object, section: Some(1), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("call", 59), Normal, 10), (Symbol(Symbol { name: "_printf", demangled_name: None, address: 0, size: 0, kind: Function, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(13), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("esp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Normal, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("ebp")), Normal, 0), (Eol, Normal, 0)]
[(Address(17), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Argument(Opaque("ebp")), Normal, 0), (Eol, Normal, 0)]
[(Address(1), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ebp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Eol, Normal, 0)]
[(Address(3), Dim, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Symbol(Symbol { name: "$SG526", demangled_name: None, address: 4, size: 6, kind: Object, section: Some(1), flags: FlagSet(Local | SizeInferred), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("call", 59), Normal, 10), (Symbol(Symbol { name: "_printf", demangled_name: None, address: 0, size: 0, kind: Function, section: None, flags: FlagSet(Global), align: None, virtual_address: None }), Bright, 0), (Eol, Normal, 0)]
[(Address(13), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("esp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(16), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("ebp")), Normal, 0), (Eol, Normal, 0)]
[(Address(17), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]

View File

@@ -124,6 +124,19 @@ Object {
align: None,
virtual_address: None,
},
Symbol {
name: "[.data-0]",
demangled_name: None,
address: 0,
size: 10,
kind: Section,
section: Some(
1,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

View File

@@ -2,24 +2,24 @@
source: objdiff-core/tests/arch_x86.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("rdx")), Normal, 0), (Eol, Normal, 0)]
[(Address(5), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Eol, Normal, 0)]
[(Address(10), Normal, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Argument(Opaque("rdi")), Normal, 0), (Eol, Normal, 0)]
[(Address(11), Normal, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("rsp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Address(15), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rcx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(25), Normal, 5), (Spacing(4), Normal, 0), (Opcode("movss", 448), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rax")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(29), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mulss", 460), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(33), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(38), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rcx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(43), Normal, 5), (Spacing(4), Normal, 0), (Opcode("movss", 448), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(48), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mulss", 460), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(53), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addss", 11), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("xmm1")), Normal, 0), (Eol, Normal, 0)]
[(Address(57), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(62), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rcx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(67), Normal, 5), (Spacing(4), Normal, 0), (Opcode("movss", 448), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mulss", 460), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(77), Normal, 5), (Spacing(4), Normal, 0), (Opcode("addss", 11), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("xmm1")), Normal, 0), (Eol, Normal, 0)]
[(Address(81), Normal, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("rsp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Address(85), Normal, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("rdi")), Normal, 0), (Eol, Normal, 0)]
[(Address(86), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("rdx")), Normal, 0), (Eol, Normal, 0)]
[(Address(5), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Eol, Normal, 0)]
[(Address(10), Dim, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Argument(Opaque("rdi")), Normal, 0), (Eol, Normal, 0)]
[(Address(11), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("rsp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Address(15), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(20), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rcx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(25), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movss", 448), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rax")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(29), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mulss", 460), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(33), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(38), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rcx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(43), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movss", 448), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(48), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mulss", 460), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(53), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addss", 11), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("xmm1")), Normal, 0), (Eol, Normal, 0)]
[(Address(57), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(32)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(62), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("rcx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rsp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(40)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(67), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movss", 448), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mulss", 460), Normal, 10), (Argument(Opaque("xmm1")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("rcx")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(8)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(77), Dim, 5), (Spacing(4), Normal, 0), (Opcode("addss", 11), Normal, 10), (Argument(Opaque("xmm0")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("xmm1")), Normal, 0), (Eol, Normal, 0)]
[(Address(81), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("rsp")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(16)), Normal, 0), (Eol, Normal, 0)]
[(Address(85), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("rdi")), Normal, 0), (Eol, Normal, 0)]
[(Address(86), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]

View File

@@ -854,6 +854,201 @@ Object {
align: None,
virtual_address: None,
},
Symbol {
name: "[.xdata-0]",
demangled_name: None,
address: 0,
size: 8,
kind: Section,
section: Some(
7,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.pdata-0]",
demangled_name: None,
address: 0,
size: 12,
kind: Section,
section: Some(
8,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.xdata-1]",
demangled_name: None,
address: 0,
size: 8,
kind: Section,
section: Some(
9,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.pdata-1]",
demangled_name: None,
address: 0,
size: 12,
kind: Section,
section: Some(
10,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.xdata-2]",
demangled_name: None,
address: 0,
size: 8,
kind: Section,
section: Some(
11,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.pdata-2]",
demangled_name: None,
address: 0,
size: 12,
kind: Section,
section: Some(
12,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.xdata-3]",
demangled_name: None,
address: 0,
size: 8,
kind: Section,
section: Some(
13,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.pdata-3]",
demangled_name: None,
address: 0,
size: 12,
kind: Section,
section: Some(
14,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rdata-0]",
demangled_name: None,
address: 0,
size: 256,
kind: Section,
section: Some(
15,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.xdata-4]",
demangled_name: None,
address: 0,
size: 20,
kind: Section,
section: Some(
16,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.pdata-4]",
demangled_name: None,
address: 0,
size: 12,
kind: Section,
section: Some(
17,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rtc$IMZ-0]",
demangled_name: None,
address: 0,
size: 8,
kind: Section,
section: Some(
19,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rtc$TMZ-0]",
demangled_name: None,
address: 0,
size: 8,
kind: Section,
section: Some(
20,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rdata-1]",
demangled_name: None,
address: 0,
size: 4,
kind: Section,
section: Some(
21,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.rdata-2]",
demangled_name: None,
address: 0,
size: 4,
kind: Section,
section: Some(
22,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,995 @@
---
source: objdiff-core/tests/arch_x86.rs
expression: output
---
[(Line(9), Dim, 5), (Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(9), Dim, 5), (Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(500)), Normal, 0), (Eol, Normal, 0)]
[(Line(9), Dim, 5), (Address(9), Dim, 5), (Spacing(4), Normal, 0), (Opcode("push", 640), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(9), Dim, 5), (Address(10), Dim, 5), (Spacing(4), Normal, 0), (Opcode("je", 302), Normal, 10), (BranchDest(223), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Line(9), Dim, 5), (Address(16), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(100)), Normal, 0), (Eol, Normal, 0)]
[(Line(9), Dim, 5), (Address(19), Dim, 5), (Spacing(4), Normal, 0), (Opcode("je", 302), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(29), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Line(91), Dim, 5), (Address(21), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(91), Dim, 5), (Address(25), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(91), Dim, 5), (Address(27), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(29), Dim, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(12)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(33), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(300)), Normal, 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(38), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jg", 304), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(139), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("je", 302), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(124), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(42), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294967246)), Normal, 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(45), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(200)), Normal, 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(50), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ja", 297), Normal, 10), (BranchDest(217), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(56), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movzx", 454), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("byte")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(448), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(63), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jmp", 308), Normal, 10), (Argument(Opaque("dword")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(424), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(70), Dim, 5), (Basic(" ~> "), Rotating(17), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(74), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(10)), Normal, 0), (Eol, Normal, 0)]
[(Line(57), Dim, 5), (Address(77), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(78), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(79), Dim, 5), (Basic(" ~> "), Rotating(19), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(83), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294967288)), Normal, 0), (Eol, Normal, 0)]
[(Line(63), Dim, 5), (Address(86), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(87), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(88), Dim, 5), (Basic(" ~> "), Rotating(20), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(92), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(94), Dim, 5), (Spacing(4), Normal, 0), (Opcode("imul", 277), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(97), Dim, 5), (Spacing(4), Normal, 0), (Opcode("imul", 277), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(66), Dim, 5), (Address(100), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(101), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(102), Dim, 5), (Basic(" ~> "), Rotating(21), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(106), Dim, 5), (Spacing(4), Normal, 0), (Opcode("and", 21), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(2147483651)), Normal, 0), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(111), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jns", 313), Normal, 10), (BranchDest(420), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(117), Dim, 5), (Spacing(4), Normal, 0), (Opcode("dec", 137), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(118), Dim, 5), (Spacing(4), Normal, 0), (Opcode("or", 467), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294967292)), Normal, 0), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(121), Dim, 5), (Spacing(4), Normal, 0), (Opcode("inc", 279), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(69), Dim, 5), (Address(122), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(123), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(124), Dim, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(128), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(130), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cdq", 61), Normal, 10), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(131), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(133), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sar", 678), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(135), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(72), Dim, 5), (Address(137), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(138), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(139), Dim, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294966946)), Normal, 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(144), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(150)), Normal, 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(149), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ja", 297), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(217), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(151), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movzx", 454), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("byte")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(672), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
[(Line(55), Dim, 5), (Address(158), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jmp", 308), Normal, 10), (Argument(Opaque("dword")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(652), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(9), 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(165), Dim, 5), (Basic(" ~> "), Rotating(22), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(169), Dim, 5), (Spacing(4), Normal, 0), (Opcode("neg", 464), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(171), Dim, 5), (Spacing(4), Normal, 0), (Opcode("shl", 712), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(75), Dim, 5), (Address(173), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(174), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(78), Dim, 5), (Address(175), Dim, 5), (Basic(" ~> "), Rotating(23), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(78), Dim, 5), (Address(179), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lea", 374), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(78), Dim, 5), (Address(183), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(184), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(185), Dim, 5), (Basic(" ~> "), Rotating(24), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(189), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(191), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cdq", 61), Normal, 10), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(192), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(197), Dim, 5), (Spacing(4), Normal, 0), (Opcode("idiv", 276), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(199), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(200), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Eol, Normal, 0)]
[(Line(81), Dim, 5), (Address(202), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(204), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(84), Dim, 5), (Address(205), Dim, 5), (Basic(" ~> "), Rotating(25), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(84), Dim, 5), (Address(209), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lea", 374), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Argument(Opaque("-")), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(84), Dim, 5), (Address(212), Dim, 5), (Spacing(4), Normal, 0), (Opcode("imul", 277), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(84), Dim, 5), (Address(215), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(216), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(87), Dim, 5), (Address(217), Dim, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(87), Dim, 5), (Address(221), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(222), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(223), Dim, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(12)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(227), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(400)), Normal, 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(232), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jg", 304), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(334), Normal, 0), (Basic(" ~>"), Rotating(10), 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(234), Dim, 5), (Spacing(4), Normal, 0), (Opcode("je", 302), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(323), Normal, 0), (Basic(" ~>"), Rotating(11), 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(236), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294967196)), Normal, 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(239), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(250)), Normal, 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(244), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ja", 297), Normal, 10), (BranchDest(418), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(250), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movzx", 454), Normal, 10), (Argument(Opaque("edx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("byte")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(852), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(13), 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(257), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jmp", 308), Normal, 10), (Argument(Opaque("dword")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(824), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(14), 0), (Eol, Normal, 0)]
[(Line(14), Dim, 5), (Address(264), Dim, 5), (Basic(" ~> "), Rotating(26), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(14), Dim, 5), (Address(268), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lea", 374), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(2)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(14), Dim, 5), (Address(271), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(272), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(17), Dim, 5), (Address(273), Dim, 5), (Basic(" ~> "), Rotating(27), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(17), Dim, 5), (Address(277), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(7)), Normal, 0), (Eol, Normal, 0)]
[(Line(17), Dim, 5), (Address(280), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(281), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(20), Dim, 5), (Address(282), Dim, 5), (Basic(" ~> "), Rotating(28), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(20), Dim, 5), (Address(286), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294967292)), Normal, 0), (Eol, Normal, 0)]
[(Line(20), Dim, 5), (Address(289), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(290), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(23), Dim, 5), (Address(291), Dim, 5), (Basic(" ~> "), Rotating(29), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(23), Dim, 5), (Address(295), Dim, 5), (Spacing(4), Normal, 0), (Opcode("imul", 277), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(23), Dim, 5), (Address(298), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(299), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(26), Dim, 5), (Address(300), Dim, 5), (Basic(" ~> "), Rotating(30), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(26), Dim, 5), (Address(304), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cdq", 61), Normal, 10), (Eol, Normal, 0)]
[(Line(26), Dim, 5), (Address(305), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Eol, Normal, 0)]
[(Line(26), Dim, 5), (Address(307), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sar", 678), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(26), Dim, 5), (Address(309), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(310), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(29), Dim, 5), (Address(311), Dim, 5), (Basic(" ~> "), Rotating(31), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(29), Dim, 5), (Address(315), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(29), Dim, 5), (Address(317), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sar", 678), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(29), Dim, 5), (Address(319), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(29), Dim, 5), (Address(321), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(322), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(32), Dim, 5), (Address(323), Dim, 5), (Basic(" ~> "), Rotating(11), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(32), Dim, 5), (Address(327), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lea", 374), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(32), Dim, 5), (Address(330), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(32), Dim, 5), (Address(332), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(333), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(334), Dim, 5), (Basic(" ~> "), Rotating(10), 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4294966846)), Normal, 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(339), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(200)), Normal, 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(344), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ja", 297), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(418), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(346), Dim, 5), (Spacing(4), Normal, 0), (Opcode("movzx", 454), Normal, 10), (Argument(Opaque("edx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("byte")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(1128), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(15), 0), (Eol, Normal, 0)]
[(Line(12), Dim, 5), (Address(353), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jmp", 308), Normal, 10), (Argument(Opaque("dword")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(1104), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(16), 0), (Eol, Normal, 0)]
[(Line(35), Dim, 5), (Address(360), Dim, 5), (Basic(" ~> "), Rotating(18), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(35), Dim, 5), (Address(364), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lea", 374), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(35), Dim, 5), (Address(367), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(368), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(369), Dim, 5), (Basic(" ~> "), Rotating(32), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(373), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(375), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cdq", 61), Normal, 10), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(376), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(381), Dim, 5), (Spacing(4), Normal, 0), (Opcode("idiv", 276), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(383), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(384), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Eol, Normal, 0)]
[(Line(38), Dim, 5), (Address(386), Dim, 5), (Spacing(4), Normal, 0), (Opcode("add", 7), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(388), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(389), Dim, 5), (Basic(" ~> "), Rotating(33), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(393), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(395), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cdq", 61), Normal, 10), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(396), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("edx")), Normal, 0), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(398), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sar", 678), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(400), Dim, 5), (Spacing(4), Normal, 0), (Opcode("sub", 740), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(402), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(41), Dim, 5), (Address(404), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(405), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(406), Dim, 5), (Basic(" ~> "), Rotating(34), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("ecx")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(16)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(410), Dim, 5), (Spacing(4), Normal, 0), (Opcode("lea", 374), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(1)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(413), Dim, 5), (Spacing(4), Normal, 0), (Opcode("imul", 277), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ecx")), Normal, 0), (Eol, Normal, 0)]
[(Line(44), Dim, 5), (Address(416), Dim, 5), (Spacing(4), Normal, 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(417), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(418), Dim, 5), (Basic(" ~> "), Rotating(12), 0), (Opcode("xor", 1518), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Line(50), Dim, 5), (Address(420), Dim, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("pop", 590), Normal, 10), (Argument(Opaque("esi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(421), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(422), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("edi")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("edi")), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(424), Dim, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(70), Normal, 0), (Basic(" ~>"), Rotating(17), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(428), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(360), Normal, 0), (Basic(" ~>"), Rotating(18), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(432), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(79), Normal, 0), (Basic(" ~>"), Rotating(19), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(436), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(88), Normal, 0), (Basic(" ~>"), Rotating(20), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(440), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(102), Normal, 0), (Basic(" ~>"), Rotating(21), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(444), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(217), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(448), Dim, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(449), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(450), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(451), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(452), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(453), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(454), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(455), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(456), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(457), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(458), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(459), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(460), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(461), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(462), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(463), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(464), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(465), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(466), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(467), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(468), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(469), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(470), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(471), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(472), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(473), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(474), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(475), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(476), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(477), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(478), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(479), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(480), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(481), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(482), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(483), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(484), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(485), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(486), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(487), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(488), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(489), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(490), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(491), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(492), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(493), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(494), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(495), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(496), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(497), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(498), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(499), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(500), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(501), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(502), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(503), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(504), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(505), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(506), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(507), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(508), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(509), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(510), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(511), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(512), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(513), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(514), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(515), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(516), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(517), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(518), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(519), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(520), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(521), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(522), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(523), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(524), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(525), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(526), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(527), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(528), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(529), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(530), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(531), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(532), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(533), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(534), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(535), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(536), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(537), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(538), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(539), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(540), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(541), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(542), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(543), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(544), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(545), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(546), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(547), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(548), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(549), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(550), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(551), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(552), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(553), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(554), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(555), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(556), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(557), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(558), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(559), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(560), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(561), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(562), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(563), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(564), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(565), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(566), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(567), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(568), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(569), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(570), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(571), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(572), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(573), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(574), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(575), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(576), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(577), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(578), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(579), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(580), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(581), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(582), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(583), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(584), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(585), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(586), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(587), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(588), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(589), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(590), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(591), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(592), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(593), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(594), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(595), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(596), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(597), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(598), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(599), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(600), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(601), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(602), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(603), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(604), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(605), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(606), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(607), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(608), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(609), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(610), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(611), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(612), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(613), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(614), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(615), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(616), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(617), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(618), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(619), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(620), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(621), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(622), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(623), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(624), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(625), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(626), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(627), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(628), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(629), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(630), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(631), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(632), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(633), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(634), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(635), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(636), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(637), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(638), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(639), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(640), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(641), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(642), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(643), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(644), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(645), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(646), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(647), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(648), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(649), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(141)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(650), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(73)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(651), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(652), Dim, 5), (Basic(" ~> "), Rotating(9), 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(165), Normal, 0), (Basic(" ~>"), Rotating(22), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(656), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(175), Normal, 0), (Basic(" ~>"), Rotating(23), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(660), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(185), Normal, 0), (Basic(" ~>"), Rotating(24), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(664), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(205), Normal, 0), (Basic(" ~>"), Rotating(25), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(668), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(217), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(672), Dim, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(673), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(674), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(675), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(676), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(677), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(678), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(679), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(680), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(681), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(682), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(683), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(684), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(685), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(686), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(687), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(688), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(689), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(690), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(691), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(692), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(693), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(694), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(695), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(696), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(697), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(698), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(699), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(700), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(701), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(702), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(703), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(704), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(705), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(706), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(707), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(708), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(709), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(710), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(711), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(712), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(713), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(714), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(715), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(716), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(717), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(718), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(719), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(720), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(721), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(722), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(723), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(724), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(725), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(726), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(727), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(728), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(729), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(730), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(731), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(732), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(733), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(734), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(735), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(736), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(737), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(738), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(739), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(740), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(741), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(742), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(743), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(744), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(745), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(746), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(747), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(748), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(749), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(750), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(751), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(752), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(753), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(754), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(755), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(756), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(757), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(758), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(759), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(760), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(761), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(762), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(763), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(764), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(765), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(766), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(767), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(768), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(769), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(770), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(771), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(772), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(773), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(774), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(775), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(776), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(777), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(778), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(779), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(780), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(781), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(782), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(783), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(784), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(785), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(786), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(787), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(788), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(789), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(790), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(791), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(792), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(793), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(794), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(795), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(796), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(797), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(798), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(799), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(800), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(801), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(802), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(803), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(804), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(805), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(806), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(807), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(808), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(809), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(810), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(811), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(812), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(813), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(814), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(815), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(816), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(817), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(818), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(819), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(820), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(821), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(822), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(823), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(144)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(824), Dim, 5), (Basic(" ~> "), Rotating(14), 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(264), Normal, 0), (Basic(" ~>"), Rotating(26), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(828), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(273), Normal, 0), (Basic(" ~>"), Rotating(27), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(832), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(282), Normal, 0), (Basic(" ~>"), Rotating(28), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(836), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(291), Normal, 0), (Basic(" ~>"), Rotating(29), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(840), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(300), Normal, 0), (Basic(" ~>"), Rotating(30), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(844), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(311), Normal, 0), (Basic(" ~>"), Rotating(31), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(848), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(418), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(852), Dim, 5), (Basic(" ~> "), Rotating(13), 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(853), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(854), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(855), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(856), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(857), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(858), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(859), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(860), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(861), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(862), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(863), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(864), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(865), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(866), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(867), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(868), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(869), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(870), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(871), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(872), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(873), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(874), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(875), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(876), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(877), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(878), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(879), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(880), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(881), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(882), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(883), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(884), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(885), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(886), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(887), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(888), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(889), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(890), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(891), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(892), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(893), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(894), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(895), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(896), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(897), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(898), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(899), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(900), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(901), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(902), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(903), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(904), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(905), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(906), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(907), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(908), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(909), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(910), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(911), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(912), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(913), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(914), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(915), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(916), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(917), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(918), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(919), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(920), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(921), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(922), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(923), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(924), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(925), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(926), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(927), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(928), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(929), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(930), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(931), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(932), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(933), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(934), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(935), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(936), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(937), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(938), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(939), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(940), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(941), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(942), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(943), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(944), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(945), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(946), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(947), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(948), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(949), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(950), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(951), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(952), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(953), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(954), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(955), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(956), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(957), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(958), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(959), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(960), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(961), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(962), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(963), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(964), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(965), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(966), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(967), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(968), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(969), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(970), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(971), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(972), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(973), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(974), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(975), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(976), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(977), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(978), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(979), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(980), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(981), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(982), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(983), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(984), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(985), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(986), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(987), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(988), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(989), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(990), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(991), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(992), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(993), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(994), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(995), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(996), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(997), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(998), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(999), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1000), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1001), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1002), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1003), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1004), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1005), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1006), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1007), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1008), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1009), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1010), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1011), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1012), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1013), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1014), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1015), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1016), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1017), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1018), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1019), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1020), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1021), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1022), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1023), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1024), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1025), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1026), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1027), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1028), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1029), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1030), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1031), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1032), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1033), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1034), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1035), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1036), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1037), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1038), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1039), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1040), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1041), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1042), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1043), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1044), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1045), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1046), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1047), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1048), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1049), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1050), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1051), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1052), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1053), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1054), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1055), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1056), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1057), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1058), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1059), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1060), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1061), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1062), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1063), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1064), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1065), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1066), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1067), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1068), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1069), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1070), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1071), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1072), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1073), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1074), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1075), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1076), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1077), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1078), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1079), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1080), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1081), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1082), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1083), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1084), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1085), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1086), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1087), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1088), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1089), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1090), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1091), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1092), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1093), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1094), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1095), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1096), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1097), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1098), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1099), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1100), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1101), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1102), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1103), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(144)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1104), Dim, 5), (Basic(" ~> "), Rotating(16), 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(360), Normal, 0), (Basic(" ~>"), Rotating(18), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1108), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(369), Normal, 0), (Basic(" ~>"), Rotating(32), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1112), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(389), Normal, 0), (Basic(" ~>"), Rotating(33), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1116), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(406), Normal, 0), (Basic(" ~>"), Rotating(34), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1120), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(70), Normal, 0), (Basic(" ~>"), Rotating(17), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1124), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(418), Normal, 0), (Basic(" ~>"), Rotating(12), 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1128), Dim, 5), (Basic(" ~> "), Rotating(15), 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(0)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1129), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1130), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1131), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1132), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1133), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1134), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1135), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1136), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1137), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1138), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1139), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1140), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1141), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1142), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1143), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1144), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1145), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1146), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1147), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1148), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1149), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1150), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1151), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1152), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1153), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1154), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1155), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1156), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1157), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1158), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1159), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1160), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1161), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1162), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1163), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1164), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1165), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1166), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1167), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1168), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1169), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1170), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1171), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1172), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1173), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1174), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1175), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1176), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1177), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1178), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(1)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1179), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1180), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1181), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1182), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1183), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1184), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1185), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1186), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1187), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1188), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1189), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1190), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1191), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1192), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1193), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1194), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1195), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1196), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1197), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1198), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1199), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1200), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1201), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1202), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1203), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1204), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1205), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1206), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1207), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1208), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1209), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1210), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1211), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1212), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1213), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1214), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1215), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1216), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1217), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1218), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1219), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1220), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1221), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1222), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1223), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1224), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1225), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1226), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1227), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1228), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1229), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1230), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1231), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1232), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1233), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1234), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1235), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1236), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1237), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1238), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1239), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1240), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1241), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1242), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1243), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1244), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1245), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1246), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1247), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1248), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1249), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1250), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1251), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1252), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1253), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1254), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1255), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1256), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1257), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1258), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1259), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1260), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1261), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1262), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1263), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1264), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1265), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1266), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1267), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1268), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1269), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1270), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1271), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1272), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1273), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1274), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1275), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1276), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1277), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1278), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1279), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1280), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1281), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1282), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1283), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1284), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1285), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1286), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1287), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1288), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1289), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1290), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1291), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1292), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1293), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1294), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1295), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1296), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1297), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1298), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1299), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1300), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1301), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1302), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1303), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1304), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1305), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1306), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1307), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1308), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1309), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1310), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1311), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1312), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1313), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1314), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1315), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1316), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1317), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1318), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1319), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1320), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1321), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1322), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1323), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1324), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1325), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1326), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1327), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Line(94), Dim, 5), (Address(1328), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".byte", 65534), Normal, 10), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]

View File

@@ -0,0 +1,959 @@
---
source: objdiff-core/tests/arch_x86.rs
expression: obj
---
Object {
arch: ArchX86 {
arch: X86,
endianness: Little,
},
endianness: Little,
symbols: [
Symbol {
name: "C:\\Dev\\Projects\\calineva-legacy\\src\\game\\control\\bridge.cpp",
demangled_name: None,
address: 0,
size: 0,
kind: Unknown,
section: None,
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "@comp.id",
demangled_name: None,
address: 0,
size: 0,
kind: Object,
section: None,
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.drectve]",
demangled_name: None,
address: 0,
size: 44,
kind: Section,
section: Some(
0,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.debug$S]",
demangled_name: None,
address: 0,
size: 271,
kind: Section,
section: Some(
1,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.text]",
demangled_name: None,
address: 0,
size: 0,
kind: Section,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.debug$S]",
demangled_name: None,
address: 0,
size: 620,
kind: Section,
section: Some(
3,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "c:\\dev\\projects\\calineva-legacy\\src\\game\\control\\bridge.cpp",
demangled_name: None,
address: 0,
size: 0,
kind: Unknown,
section: None,
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "?process@@YAHHHH@Z",
demangled_name: Some(
"int __cdecl process(int, int, int)",
),
address: 0,
size: 1329,
kind: Function,
section: Some(
2,
),
flags: FlagSet(Global),
align: None,
virtual_address: None,
},
Symbol {
name: "$L296",
demangled_name: None,
address: 418,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L312",
demangled_name: None,
address: 217,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L294",
demangled_name: None,
address: 406,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L293",
demangled_name: None,
address: 389,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L292",
demangled_name: None,
address: 369,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L291",
demangled_name: None,
address: 360,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L332",
demangled_name: None,
address: 1104,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L327",
demangled_name: None,
address: 1128,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L289",
demangled_name: None,
address: 311,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L288",
demangled_name: None,
address: 300,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L287",
demangled_name: None,
address: 291,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L286",
demangled_name: None,
address: 282,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L285",
demangled_name: None,
address: 273,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L284",
demangled_name: None,
address: 264,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L331",
demangled_name: None,
address: 824,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L326",
demangled_name: None,
address: 852,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L311",
demangled_name: None,
address: 205,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L310",
demangled_name: None,
address: 185,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L309",
demangled_name: None,
address: 175,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L308",
demangled_name: None,
address: 165,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L330",
demangled_name: None,
address: 652,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L325",
demangled_name: None,
address: 672,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L306",
demangled_name: None,
address: 102,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L305",
demangled_name: None,
address: 88,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L304",
demangled_name: None,
address: 79,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L302",
demangled_name: None,
address: 70,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L329",
demangled_name: None,
address: 424,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "$L324",
demangled_name: None,
address: 448,
size: 0,
kind: Object,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: ".bf",
demangled_name: None,
address: 0,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: ".lf",
demangled_name: None,
address: 0,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: ".ef",
demangled_name: None,
address: 0,
size: 0,
kind: Unknown,
section: Some(
2,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.debug$F]",
demangled_name: None,
address: 0,
size: 16,
kind: Section,
section: Some(
4,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
Symbol {
name: "[.debug$T]",
demangled_name: None,
address: 0,
size: 104,
kind: Section,
section: Some(
5,
),
flags: FlagSet(Local),
align: None,
virtual_address: None,
},
],
sections: [
Section {
id: ".drectve-0",
name: ".drectve",
address: 0,
size: 44,
kind: Unknown,
data: SectionData(
0,
),
flags: FlagSet(),
align: Some(
1,
),
relocations: [],
line_info: {},
virtual_address: None,
},
Section {
id: ".debug$S-0",
name: ".debug$S",
address: 0,
size: 271,
kind: Unknown,
data: SectionData(
0,
),
flags: FlagSet(),
align: Some(
1,
),
relocations: [],
line_info: {},
virtual_address: None,
},
Section {
id: ".text-0",
name: ".text",
address: 0,
size: 1344,
kind: Code,
data: SectionData(
1344,
),
flags: FlagSet(),
align: Some(
16,
),
relocations: [
Relocation {
flags: Coff(
6,
),
address: 59,
target_symbol: 35,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 66,
target_symbol: 34,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 154,
target_symbol: 29,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 161,
target_symbol: 28,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 253,
target_symbol: 23,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 260,
target_symbol: 22,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 349,
target_symbol: 15,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 356,
target_symbol: 14,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 424,
target_symbol: 33,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 428,
target_symbol: 13,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 432,
target_symbol: 32,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 436,
target_symbol: 31,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 440,
target_symbol: 30,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 444,
target_symbol: 9,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 652,
target_symbol: 27,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 656,
target_symbol: 26,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 660,
target_symbol: 25,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 664,
target_symbol: 24,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 668,
target_symbol: 9,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 824,
target_symbol: 21,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 828,
target_symbol: 20,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 832,
target_symbol: 19,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 836,
target_symbol: 18,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 840,
target_symbol: 17,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 844,
target_symbol: 16,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 848,
target_symbol: 8,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 1104,
target_symbol: 13,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 1108,
target_symbol: 12,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 1112,
target_symbol: 11,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 1116,
target_symbol: 10,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 1120,
target_symbol: 33,
addend: 0,
},
Relocation {
flags: Coff(
6,
),
address: 1124,
target_symbol: 8,
addend: 0,
},
],
line_info: {
0: 9,
21: 91,
28: 94,
29: 55,
70: 57,
78: 94,
79: 63,
87: 94,
88: 66,
101: 94,
102: 69,
123: 94,
124: 72,
138: 94,
139: 55,
165: 75,
174: 94,
175: 78,
184: 94,
185: 81,
204: 94,
205: 84,
216: 94,
217: 87,
222: 94,
223: 12,
264: 14,
272: 94,
273: 17,
281: 94,
282: 20,
290: 94,
291: 23,
299: 94,
300: 26,
310: 94,
311: 29,
322: 94,
323: 32,
333: 94,
334: 12,
360: 35,
368: 94,
369: 38,
388: 94,
389: 41,
405: 94,
406: 44,
417: 94,
418: 50,
421: 94,
},
virtual_address: None,
},
Section {
id: ".debug$S-1",
name: ".debug$S",
address: 0,
size: 620,
kind: Unknown,
data: SectionData(
0,
),
flags: FlagSet(),
align: Some(
1,
),
relocations: [],
line_info: {},
virtual_address: None,
},
Section {
id: ".debug$F-0",
name: ".debug$F",
address: 0,
size: 16,
kind: Unknown,
data: SectionData(
0,
),
flags: FlagSet(),
align: Some(
1,
),
relocations: [],
line_info: {},
virtual_address: None,
},
Section {
id: ".debug$T-0",
name: ".debug$T",
address: 0,
size: 104,
kind: Unknown,
data: SectionData(
0,
),
flags: FlagSet(),
align: Some(
1,
),
relocations: [],
line_info: {},
virtual_address: None,
},
],
split_meta: None,
path: None,
timestamp: None,
flow_analysis_results: {},
}

View File

@@ -2,30 +2,30 @@
source: objdiff-core/tests/arch_x86.rs
expression: output
---
[(Address(0), Normal, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Normal, 5), (Spacing(4), Normal, 0), (Opcode("dec", 137), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Address(5), Normal, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ja", 297), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(58), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(10), Normal, 5), (Spacing(4), Normal, 0), (Opcode("jmp", 308), Normal, 10), (Argument(Opaque("dword")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(60), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(17), Normal, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(8)), Normal, 0), (Eol, Normal, 0)]
[(Address(22), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(23), Normal, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(7)), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(29), Normal, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Address(34), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(35), Normal, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(41), Normal, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(46), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(47), Normal, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Normal, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(53), Normal, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(58), Normal, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(59), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
[(Address(60), Normal, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(17), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Address(64), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(23), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Address(68), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(29), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Address(72), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(35), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Address(76), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(41), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(80), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(47), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(53), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
[(Address(0), Dim, 5), (Spacing(4), Normal, 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("esp")), Normal, 0), (Argument(Opaque("+")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Basic("]"), Normal, 0), (Eol, Normal, 0)]
[(Address(4), Dim, 5), (Spacing(4), Normal, 0), (Opcode("dec", 137), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Eol, Normal, 0)]
[(Address(5), Dim, 5), (Spacing(4), Normal, 0), (Opcode("cmp", 93), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Address(8), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ja", 297), Normal, 10), (Argument(Opaque("short")), Normal, 0), (Spacing(1), Normal, 0), (BranchDest(58), Normal, 0), (Basic(" ~>"), Rotating(0), 0), (Eol, Normal, 0)]
[(Address(10), Dim, 5), (Spacing(4), Normal, 0), (Opcode("jmp", 308), Normal, 10), (Argument(Opaque("dword")), Normal, 0), (Spacing(1), Normal, 0), (Argument(Opaque("ptr")), Normal, 0), (Spacing(1), Normal, 0), (Basic("["), Normal, 0), (Argument(Opaque("eax")), Normal, 0), (Argument(Opaque("*")), Normal, 0), (Argument(Signed(4)), Normal, 0), (Argument(Opaque("+")), Normal, 0), (BranchDest(60), Normal, 0), (Basic("]"), Normal, 0), (Basic(" ~>"), Rotating(1), 0), (Eol, Normal, 0)]
[(Address(17), Dim, 5), (Basic(" ~> "), Rotating(2), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(8)), Normal, 0), (Eol, Normal, 0)]
[(Address(22), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(23), Dim, 5), (Basic(" ~> "), Rotating(3), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(7)), Normal, 0), (Eol, Normal, 0)]
[(Address(28), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(29), Dim, 5), (Basic(" ~> "), Rotating(4), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(6)), Normal, 0), (Eol, Normal, 0)]
[(Address(34), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(35), Dim, 5), (Basic(" ~> "), Rotating(5), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(5)), Normal, 0), (Eol, Normal, 0)]
[(Address(40), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(41), Dim, 5), (Basic(" ~> "), Rotating(6), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(4)), Normal, 0), (Eol, Normal, 0)]
[(Address(46), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(47), Dim, 5), (Basic(" ~> "), Rotating(7), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(3)), Normal, 0), (Eol, Normal, 0)]
[(Address(52), Dim, 5), (Spacing(4), Normal, 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(53), Dim, 5), (Basic(" ~> "), Rotating(8), 0), (Opcode("mov", 414), Normal, 10), (Argument(Opaque("eax")), Normal, 0), (Basic(","), Normal, 0), (Spacing(1), Normal, 0), (Argument(Unsigned(2)), Normal, 0), (Eol, Normal, 0)]
[(Address(58), Dim, 5), (Basic(" ~> "), Rotating(0), 0), (Opcode("ret", 662), Normal, 10), (Eol, Normal, 0)]
[(Address(59), Dim, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
[(Address(60), Dim, 5), (Basic(" ~> "), Rotating(1), 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(17), Normal, 0), (Basic(" ~>"), Rotating(2), 0), (Eol, Normal, 0)]
[(Address(64), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(23), Normal, 0), (Basic(" ~>"), Rotating(3), 0), (Eol, Normal, 0)]
[(Address(68), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(29), Normal, 0), (Basic(" ~>"), Rotating(4), 0), (Eol, Normal, 0)]
[(Address(72), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(35), Normal, 0), (Basic(" ~>"), Rotating(5), 0), (Eol, Normal, 0)]
[(Address(76), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(41), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
[(Address(80), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(47), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
[(Address(84), Dim, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(53), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]

View File

@@ -25,12 +25,14 @@ wsl = []
[dependencies]
anyhow = "1.0"
argp = "0.4"
cfg-if = "1.0"
const_format = "0.2"
cwdemangle = "1.0"
dirs = "6.0"
egui = "0.32"
egui_extras = "0.32"
egui = "0.33"
egui_extras = "0.33"
egui-notify = "0.21"
filetime = "0.2"
float-ord = "0.3"
font-kit = "0.14"
@@ -38,21 +40,21 @@ globset = { version = "0.4", features = ["serde1"] }
log = "0.4"
objdiff-core = { path = "../objdiff-core", features = ["all"] }
open = "5.3"
png = "0.17"
png = "0.18"
pollster = "0.4"
regex = "1.11"
regex = "1.12"
rfd = { version = "0.15" } #, default-features = false, features = ['xdg-portal']
rlwinmdec = "1.1"
ron = "0.10"
ron = "0.12"
serde = { version = "1.0", features = ["derive"] }
time = { version = "0.3", features = ["formatting", "local-offset"] }
typed-path = "0.11"
typed-path = "0.12"
winit = { version = "0.30", features = ["default"] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
# Keep version in sync with egui
[dependencies.eframe]
version = "0.32"
version = "0.33"
features = [
"default_fonts",
"glow",
@@ -64,7 +66,7 @@ default-features = false
# Keep version in sync with eframe
[dependencies.wgpu]
version = "25.0"
version = "27.0"
features = [
"dx12",
"metal",

View File

@@ -11,14 +11,15 @@ use std::{
time::Instant,
};
use egui::text::LayoutJob;
use filetime::FileTime;
use globset::Glob;
use objdiff_core::{
build::watcher::{Watcher, create_watcher},
config::{
DEFAULT_WATCH_PATTERNS, ProjectConfig, ProjectConfigInfo, ProjectObject, ScratchConfig,
build_globset, default_watch_patterns, path::platform_path_serde_option,
save_project_config,
ProjectConfig, ProjectConfigInfo, ProjectObject, ScratchConfig, apply_project_options,
build_globset, default_ignore_patterns, default_watch_patterns,
path::platform_path_serde_option, save_project_config,
},
diff::DiffObjConfig,
jobs::{Job, JobQueue, JobResult},
@@ -164,7 +165,7 @@ pub struct AppState {
pub selecting_left: Option<String>,
/// The left object symbol name that we're selecting a right symbol for
pub selecting_right: Option<String>,
pub config_error: Option<String>,
pub top_left_toasts: egui_notify::Toasts,
}
impl Default for AppState {
@@ -183,11 +184,23 @@ impl Default for AppState {
last_mod_check: Instant::now(),
selecting_left: None,
selecting_right: None,
config_error: None,
top_left_toasts: create_toasts(egui_notify::Anchor::TopLeft),
}
}
}
pub fn create_toasts(anchor: egui_notify::Anchor) -> egui_notify::Toasts {
egui_notify::Toasts::default()
.with_anchor(anchor)
.with_margin(egui::vec2(10.0, 32.0))
.with_shadow(egui::Shadow {
offset: [0, 0],
blur: 0,
spread: 1,
color: egui::Color32::GRAY,
})
}
#[derive(Clone, serde::Deserialize, serde::Serialize)]
pub struct AppConfig {
// TODO: https://github.com/ron-rs/ron/pull/455
@@ -219,6 +232,8 @@ pub struct AppConfig {
#[serde(default = "default_watch_patterns")]
pub watch_patterns: Vec<Glob>,
#[serde(default)]
pub ignore_patterns: Vec<Glob>,
#[serde(default)]
pub recent_projects: Vec<String>,
#[serde(default)]
pub diff_obj_config: DiffObjConfig,
@@ -239,7 +254,8 @@ impl Default for AppConfig {
build_target: false,
rebuild_on_changes: true,
auto_update_check: true,
watch_patterns: DEFAULT_WATCH_PATTERNS.iter().map(|s| Glob::new(s).unwrap()).collect(),
watch_patterns: default_watch_patterns(),
ignore_patterns: default_ignore_patterns(),
recent_projects: vec![],
diff_obj_config: Default::default(),
}
@@ -318,6 +334,24 @@ impl AppState {
self.selecting_right = None;
}
pub fn effective_diff_config(&self) -> DiffObjConfig {
let mut config = self.config.diff_obj_config.clone();
if let Some(project) = self.current_project_config.as_ref() {
if let Some(options) = project.options.as_ref() {
// Ignore errors here, we display them when loading the project config
let _ = apply_project_options(&mut config, options);
}
if let Some(selected) = self.config.selected_obj.as_ref()
&& let Some(units) = project.units.as_deref()
&& let Some(unit) = units.iter().find(|unit| unit.name() == selected.name)
&& let Some(options) = unit.options()
{
let _ = apply_project_options(&mut config, options);
}
}
config
}
pub fn set_selecting_left(&mut self, right: &str) {
let Some(object) = self.config.selected_obj.as_mut() else {
return;
@@ -398,11 +432,22 @@ impl AppState {
match save_project_config(config, info) {
Ok(new_info) => *info = new_info,
Err(e) => {
log::error!("Failed to save project config: {e}");
self.config_error = Some(format!("Failed to save project config: {e}"));
log::error!("Failed to save project config: {e:#}");
self.show_error_toast("Failed to save project config", &e);
}
}
}
pub fn show_error_toast(&mut self, context: &str, e: &anyhow::Error) {
let mut job = LayoutJob::default();
job.append(context, 0.0, Default::default());
job.append("\n", 0.0, Default::default());
job.append(&format!("{e:#}"), 0.0, egui::TextFormat {
color: egui::Color32::LIGHT_RED,
..Default::default()
});
self.top_left_toasts.error(job).closable(true).duration(None);
}
}
pub type AppStateRef = Arc<RwLock<AppState>>;
@@ -431,6 +476,7 @@ impl App {
app_path: Option<PathBuf>,
graphics_config: GraphicsConfig,
graphics_config_path: Option<PathBuf>,
project_dir: Option<Utf8PlatformPathBuf>,
) -> Self {
// Load previous app state (if any).
// Note that you must enable the `persistence` feature for this to work.
@@ -440,18 +486,26 @@ impl App {
app.appearance = appearance;
}
if let Some(config) = deserialize_config(storage) {
let mut state = AppState { config, ..Default::default() };
if state.config.project_dir.is_some() {
state.config_change = true;
state.watcher_change = true;
}
if state.config.selected_obj.is_some() {
state.queue_build = true;
}
app.view_state.config_state.queue_check_update = state.config.auto_update_check;
let state = AppState { config, ..Default::default() };
app.state = Arc::new(RwLock::new(state));
}
}
{
let mut state = app.state.write().unwrap();
if let Some(project_dir) = project_dir
&& state.config.project_dir.as_ref().is_none_or(|p| *p != project_dir)
{
state.set_project_dir(project_dir);
}
if state.config.project_dir.is_some() {
state.config_change = true;
state.watcher_change = true;
}
if state.config.selected_obj.is_some() {
state.queue_build = true;
}
app.view_state.config_state.queue_check_update = state.config.auto_update_check;
}
app.appearance.init_fonts(&cc.egui_ctx);
app.appearance.utc_offset = utc_offset;
app.app_path = app_path;
@@ -536,12 +590,9 @@ impl App {
if state.config_change {
state.config_change = false;
match load_project_config(state) {
Ok(()) => state.config_error = None,
Err(e) => {
log::error!("Failed to load project config: {e}");
state.config_error = Some(e.to_string());
}
if let Err(e) = load_project_config(state) {
log::error!("Failed to load project config: {e:#}");
state.show_error_toast("Failed to load project config", &e);
}
}
@@ -551,17 +602,26 @@ impl App {
if let Some(project_dir) = &state.config.project_dir {
match build_globset(&state.config.watch_patterns)
.map_err(anyhow::Error::new)
.and_then(|globset| {
.and_then(|patterns| {
build_globset(&state.config.ignore_patterns)
.map(|ignore_patterns| (patterns, ignore_patterns))
.map_err(anyhow::Error::new)
})
.and_then(|(patterns, ignore_patterns)| {
create_watcher(
self.modified.clone(),
project_dir.as_ref(),
globset,
patterns,
ignore_patterns,
egui_waker(ctx),
)
.map_err(anyhow::Error::new)
}) {
Ok(watcher) => self.watcher = Some(watcher),
Err(e) => log::error!("Failed to create watcher: {e}"),
Err(e) => {
log::error!("Failed to create watcher: {e:#}");
state.show_error_toast("Failed to create file watcher", &e);
}
}
state.watcher_change = false;
}
@@ -788,7 +848,7 @@ impl eframe::App for App {
let mut action = None;
egui::CentralPanel::default().show(ctx, |ui| {
let state = state.read().unwrap();
action = diff_view_ui(ui, diff_state, appearance, &state.config.diff_obj_config);
action = diff_view_ui(ui, diff_state, appearance, &state.effective_diff_config());
});
project_window(ctx, state, show_project_config, config_state, appearance);
@@ -800,6 +860,10 @@ impl eframe::App for App {
graphics_window(ctx, show_graphics, frame_history, graphics_state, appearance);
jobs_window(ctx, show_jobs, jobs, appearance);
if let Ok(mut state) = self.state.write() {
state.top_left_toasts.show(ctx);
}
self.post_update(ctx, action);
}

View File

@@ -6,7 +6,7 @@ use objdiff_core::{
config::ScratchConfig,
diff::{
ArmArchVersion, ArmR9Usage, DiffObjConfig, FunctionRelocDiffs, MipsAbi, MipsInstrCategory,
X86Formatter,
ShowSymbolSizes, X86Formatter,
},
};
use typed_path::{Utf8PlatformPathBuf, Utf8UnixPathBuf};
@@ -227,6 +227,7 @@ pub struct DiffObjConfigV1 {
pub relax_reloc_diffs: bool,
#[serde(default = "bool_true")]
pub space_between_args: bool,
pub show_symbol_sizes: ShowSymbolSizes,
pub combine_data_sections: bool,
// x86
pub x86_formatter: X86Formatter,
@@ -248,6 +249,7 @@ impl Default for DiffObjConfigV1 {
Self {
relax_reloc_diffs: false,
space_between_args: true,
show_symbol_sizes: Default::default(),
combine_data_sections: false,
x86_formatter: Default::default(),
mips_abi: Default::default(),
@@ -272,6 +274,7 @@ impl DiffObjConfigV1 {
FunctionRelocDiffs::default()
},
space_between_args: self.space_between_args,
show_symbol_sizes: self.show_symbol_sizes,
combine_data_sections: self.combine_data_sections,
x86_formatter: self.x86_formatter,
mips_abi: self.mips_abi,

View File

@@ -0,0 +1,63 @@
// Originally from https://gist.github.com/suluke/e0c672492126be0a4f3b4f0e1115d77c
//! Extend `argp` to be better integrated with the `cargo` ecosystem
//!
//! For now, this only adds a --version/-V option which causes early-exit.
use std::ffi::OsStr;
use argp::{EarlyExit, FromArgs, TopLevelCommand, parser::ParseGlobalOptions};
struct ArgsOrVersion<T>(T)
where T: FromArgs;
impl<T> TopLevelCommand for ArgsOrVersion<T> where T: FromArgs {}
impl<T> FromArgs for ArgsOrVersion<T>
where T: FromArgs
{
fn _from_args(
command_name: &[&str],
args: &[&OsStr],
parent: Option<&mut dyn ParseGlobalOptions>,
) -> Result<Self, EarlyExit> {
/// Also use argp for catching `--version`-only invocations
#[derive(FromArgs)]
struct Version {
/// Print version information and exit.
#[argp(switch, short = 'V')]
pub version: bool,
}
match Version::from_args(command_name, args) {
Ok(v) => {
if v.version {
println!(
"{} {}",
command_name.first().unwrap_or(&""),
env!("CARGO_PKG_VERSION"),
);
std::process::exit(0);
} else {
// Pass through empty arguments
T::_from_args(command_name, args, parent).map(Self)
}
}
Err(exit) => match exit {
EarlyExit::Help(_help) => {
// TODO: Chain help info from Version
// For now, we just put the switch on T as well
T::from_args(command_name, &["--help"]).map(Self)
}
EarlyExit::Err(_) => T::_from_args(command_name, args, parent).map(Self),
},
}
}
}
/// Create a `FromArgs` type from the current processs `env::args`.
///
/// This function will exit early from the current process if argument parsing was unsuccessful or if information like `--help` was requested.
/// Error messages will be printed to stderr, and `--help` output to stdout.
pub fn from_env<T>() -> T
where T: TopLevelCommand {
argp::parse_args_or_exit::<ArgsOrVersion<T>>(argp::DEFAULT).0
}

View File

@@ -1,6 +1,11 @@
use anyhow::Result;
use globset::Glob;
use objdiff_core::config::{DEFAULT_WATCH_PATTERNS, try_project_config};
use objdiff_core::{
config::{
apply_project_options, default_ignore_patterns, default_watch_patterns, try_project_config,
},
diff::DiffObjConfig,
};
use typed_path::{Utf8UnixComponent, Utf8UnixPath};
use crate::app::{AppState, ObjectConfig};
@@ -96,8 +101,15 @@ pub fn load_project_config(state: &mut AppState) -> Result<()> {
.map(|s| Glob::new(s))
.collect::<Result<Vec<Glob>, globset::Error>>()?;
} else {
state.config.watch_patterns =
DEFAULT_WATCH_PATTERNS.iter().map(|s| Glob::new(s).unwrap()).collect();
state.config.watch_patterns = default_watch_patterns();
}
if let Some(ignore_patterns) = &project_config.ignore_patterns {
state.config.ignore_patterns = ignore_patterns
.iter()
.map(|s| Glob::new(s))
.collect::<Result<Vec<Glob>, globset::Error>>()?;
} else {
state.config.ignore_patterns = default_ignore_patterns();
}
state.watcher_change = true;
state.objects = project_config
@@ -117,6 +129,38 @@ pub fn load_project_config(state: &mut AppState) -> Result<()> {
state.object_nodes = build_nodes(&mut state.objects);
state.current_project_config = Some(project_config);
state.project_config_info = Some(info);
if let Some(options) =
state.current_project_config.as_ref().and_then(|project| project.options.as_ref())
{
let mut diff_config = DiffObjConfig::default();
if let Err(e) = apply_project_options(&mut diff_config, options) {
log::error!("Failed to apply project config options: {e:#}");
state.show_error_toast("Failed to apply project config options", &e);
}
}
if let Some(project) = state.current_project_config.as_ref()
&& let Some(units) = project.units.as_deref()
{
let mut unit_option_errors = Vec::new();
for unit in units {
if let Some(options) = unit.options() {
let mut diff_config = DiffObjConfig::default();
if let Err(e) = apply_project_options(&mut diff_config, options) {
unit_option_errors.push((unit.name().to_string(), e));
}
}
}
for (unit_name, error) in unit_option_errors {
log::error!(
"Failed to apply project config options for unit {}: {error:#}",
unit_name
);
state.show_error_toast(
&format!("Failed to apply project config options for unit {unit_name}"),
&error,
);
}
}
// Reload selected object
if let Some(selected_obj) = &state.config.selected_obj {

View File

@@ -106,7 +106,7 @@ pub fn create_objdiff_config(state: &AppState) -> objdiff::ObjDiffConfig {
.as_ref()
.and_then(|obj| obj.base_path.as_ref())
.cloned(),
diff_obj_config: state.config.diff_obj_config.clone(),
diff_obj_config: state.effective_diff_config(),
mapping_config: MappingConfig {
mappings: state
.config

View File

@@ -3,6 +3,7 @@
mod app;
mod app_config;
mod argp_version;
mod config;
mod fonts;
mod hotkeys;
@@ -11,23 +12,88 @@ mod update;
mod views;
use std::{
ffi::OsStr,
fmt::Display,
io::Cursor,
path::PathBuf,
process::ExitCode,
rc::Rc,
str::FromStr,
sync::{Arc, Mutex},
};
use anyhow::{Result, ensure};
use anyhow::{Context, Result, ensure};
use argp::{FromArgValue, FromArgs};
use cfg_if::cfg_if;
use objdiff_core::config::path::check_path_buf;
use time::UtcOffset;
use tracing_subscriber::EnvFilter;
use tracing_subscriber::{EnvFilter, filter::LevelFilter};
use typed_path::Utf8PlatformPathBuf;
use crate::views::graphics::{GraphicsBackend, GraphicsConfig, load_graphics_config};
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
enum LogLevel {
Error,
Warn,
Info,
Debug,
Trace,
}
impl FromStr for LogLevel {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"error" => Self::Error,
"warn" => Self::Warn,
"info" => Self::Info,
"debug" => Self::Debug,
"trace" => Self::Trace,
_ => return Err(()),
})
}
}
impl Display for LogLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
LogLevel::Error => "error",
LogLevel::Warn => "warn",
LogLevel::Info => "info",
LogLevel::Debug => "debug",
LogLevel::Trace => "trace",
})
}
}
impl FromArgValue for LogLevel {
fn from_arg_value(value: &OsStr) -> Result<Self, String> {
String::from_arg_value(value)
.and_then(|s| Self::from_str(&s).map_err(|_| "Invalid log level".to_string()))
}
}
#[derive(FromArgs, PartialEq, Debug)]
/// A local diffing tool for decompilation projects.
struct TopLevel {
#[argp(option, short = 'L')]
/// Minimum logging level. (Default: info)
/// Possible values: error, warn, info, debug, trace
log_level: Option<LogLevel>,
#[argp(option, short = 'p')]
/// Path to the project directory.
project_dir: Option<PathBuf>,
/// Print version information and exit.
#[argp(switch, short = 'V')]
version: bool,
}
fn load_icon() -> Result<egui::IconData> {
let decoder = png::Decoder::new(include_bytes!("../assets/icon_64.png").as_ref());
let decoder = png::Decoder::new(Cursor::new(include_bytes!("../assets/icon_64.png").as_ref()));
let mut reader = decoder.read_info()?;
let mut buf = vec![0; reader.output_buffer_size()];
let mut buf = vec![0; reader.output_buffer_size().context("Buffer too large")?];
let info = reader.next_frame(&mut buf)?;
ensure!(info.bit_depth == png::BitDepth::Eight);
ensure!(info.color_type == png::ColorType::Rgba);
@@ -38,23 +104,63 @@ fn load_icon() -> Result<egui::IconData> {
const APP_NAME: &str = "objdiff";
fn main() -> ExitCode {
// Log to stdout (if you run with `RUST_LOG=debug`).
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::builder()
// Default to info level
.with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())
.from_env_lossy()
// This module is noisy at info level
.add_directive("wgpu_core::device::resource=warn".parse().unwrap()),
)
.init();
let args: TopLevel = argp_version::from_env();
let builder = tracing_subscriber::fmt();
if let Some(level) = args.log_level {
builder
.with_max_level(match level {
LogLevel::Error => LevelFilter::ERROR,
LogLevel::Warn => LevelFilter::WARN,
LogLevel::Info => LevelFilter::INFO,
LogLevel::Debug => LevelFilter::DEBUG,
LogLevel::Trace => LevelFilter::TRACE,
})
.init();
} else {
builder
.with_env_filter(
EnvFilter::builder()
// Default to info level
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy()
// This module is noisy at info level
.add_directive("wgpu_core::device::resource=warn".parse().unwrap()),
)
.init();
}
// Because localtime_r is unsound in multithreaded apps,
// we must call this before initializing eframe.
// https://github.com/time-rs/time/issues/293
let utc_offset = UtcOffset::current_local_offset().unwrap_or(UtcOffset::UTC);
// Resolve project directory if provided
let project_dir = if let Some(path) = args.project_dir {
match path.canonicalize() {
Ok(path) => {
// Ensure the path is a directory
if path.is_dir() {
match check_path_buf(path) {
Ok(path) => Some(path),
Err(e) => {
log::error!("Failed to convert project directory to UTF-8 path: {}", e);
None
}
}
} else {
log::error!("Project directory is not a directory: {}", path.display());
None
}
}
Err(e) => {
log::error!("Failed to canonicalize project directory: {}", e);
None
}
}
} else {
None
};
let app_path = std::env::current_exe().ok();
let exec_path: Rc<Mutex<Option<PathBuf>>> = Rc::new(Mutex::new(None));
let mut native_options = eframe::NativeOptions {
@@ -113,6 +219,7 @@ fn main() -> ExitCode {
app_path.clone(),
graphics_config.clone(),
graphics_config_path.clone(),
project_dir.clone(),
) {
eframe_error = Some(e);
}
@@ -139,6 +246,7 @@ fn main() -> ExitCode {
app_path.clone(),
graphics_config.clone(),
graphics_config_path.clone(),
project_dir.clone(),
) {
eframe_error = Some(e);
} else {
@@ -161,6 +269,7 @@ fn main() -> ExitCode {
app_path,
graphics_config,
graphics_config_path,
project_dir,
) {
eframe_error = Some(e);
} else {
@@ -204,6 +313,7 @@ fn run_eframe(
app_path: Option<PathBuf>,
graphics_config: GraphicsConfig,
graphics_config_path: Option<PathBuf>,
project_dir: Option<Utf8PlatformPathBuf>,
) -> Result<(), eframe::Error> {
eframe::run_native(
APP_NAME,
@@ -216,6 +326,7 @@ fn run_eframe(
app_path,
graphics_config,
graphics_config_path,
project_dir,
)))
}),
)

View File

@@ -11,6 +11,7 @@ pub struct Appearance {
pub ui_font: FontId,
pub code_font: FontId,
pub diff_colors: Vec<Color32>,
pub diff_bg_color: Option<Color32>,
pub theme: egui::Theme,
// Applied by theme
@@ -67,6 +68,7 @@ impl Default for Appearance {
replace_color: Color32::LIGHT_BLUE,
insert_color: Color32::GREEN,
delete_color: Color32::from_rgb(200, 40, 41),
diff_bg_color: None,
utc_offset: UtcOffset::UTC,
fonts: FontState::default(),
next_ui_font: None,
@@ -103,6 +105,9 @@ impl Appearance {
match self.theme {
egui::Theme::Dark => {
style.visuals = egui::Visuals::dark();
if let Some(diff_bg_color) = self.diff_bg_color {
style.visuals.faint_bg_color = diff_bg_color;
}
self.text_color = Color32::GRAY;
self.emphasized_text_color = Color32::LIGHT_GRAY;
self.deemphasized_text_color = Color32::DARK_GRAY;
@@ -114,6 +119,9 @@ impl Appearance {
}
egui::Theme::Light => {
style.visuals = egui::Visuals::light();
if let Some(diff_bg_color) = self.diff_bg_color {
style.visuals.faint_bg_color = diff_bg_color;
}
self.text_color = Color32::GRAY;
self.emphasized_text_color = Color32::DARK_GRAY;
self.deemphasized_text_color = Color32::LIGHT_GRAY;
@@ -294,6 +302,21 @@ pub fn appearance_window(ctx: &egui::Context, show: &mut bool, appearance: &mut
appearance,
);
ui.separator();
ui.horizontal(|ui| {
ui.label("Diff fill color:");
let mut diff_bg_color =
appearance.diff_bg_color.unwrap_or_else(|| match appearance.theme {
egui::Theme::Dark => egui::Visuals::dark().faint_bg_color,
egui::Theme::Light => egui::Visuals::light().faint_bg_color,
});
if ui.color_edit_button_srgba(&mut diff_bg_color).changed() {
appearance.diff_bg_color = Some(diff_bg_color);
}
if ui.button("Reset").clicked() {
appearance.diff_bg_color = None;
}
});
ui.separator();
ui.label("Diff colors:");
if ui.button("Reset").clicked() {
appearance.diff_colors = DEFAULT_COLOR_ROTATION.to_vec();

View File

@@ -10,7 +10,7 @@ use egui::{
};
use globset::Glob;
use objdiff_core::{
config::{DEFAULT_WATCH_PATTERNS, path::check_path_buf},
config::{default_ignore_patterns, default_watch_patterns, path::check_path_buf},
diff::{
CONFIG_GROUPS, ConfigEnum, ConfigEnumVariantInfo, ConfigPropertyId, ConfigPropertyKind,
ConfigPropertyValue,
@@ -41,6 +41,7 @@ pub struct ConfigViewState {
pub build_running: bool,
pub queue_build: bool,
pub watch_pattern_text: String,
pub ignore_pattern_text: String,
pub object_search: String,
pub filter_diffable: bool,
pub filter_incomplete: bool,
@@ -518,8 +519,7 @@ fn format_path(path: &Option<Utf8PlatformPathBuf>, appearance: &Appearance) -> R
RichText::new(text).color(color).family(FontFamily::Monospace)
}
pub const CONFIG_DISABLED_TEXT: &str =
"Option disabled because it's set by the project configuration file.";
pub const CONFIG_DISABLED_TEXT: &str = "Value is overridden by the project configuration.";
fn pick_folder_ui(
ui: &mut egui::Ui,
@@ -532,8 +532,13 @@ fn pick_folder_ui(
let response = ui.horizontal(|ui| {
subheading(ui, label, appearance);
ui.link(HELP_ICON).on_hover_ui(tooltip);
ui.add_enabled(enabled, egui::Button::new("Select"))
.on_disabled_hover_text(CONFIG_DISABLED_TEXT)
let button = ui
.add_enabled(enabled, egui::Button::new("Select"))
.on_disabled_hover_text(CONFIG_DISABLED_TEXT);
if !enabled {
project_override_badge(ui).on_hover_text(CONFIG_DISABLED_TEXT);
}
button
});
ui.label(format_path(dir, appearance));
response.inner
@@ -551,17 +556,6 @@ pub fn project_window(
egui::Window::new("Project").open(show).show(ctx, |ui| {
split_obj_config_ui(ui, &mut state_guard, config_state, appearance);
});
if let Some(error) = &state_guard.config_error {
let mut open = true;
egui::Window::new("Error").open(&mut open).show(ctx, |ui| {
ui.label("Failed to load project config:");
ui.colored_label(appearance.delete_color, error);
});
if !open {
state_guard.config_error = None;
}
}
}
fn split_obj_config_ui(
@@ -622,6 +616,9 @@ fn split_obj_config_ui(
job.append(".", 0.0, text_format.clone());
ui.label(job);
});
if state.project_config_info.is_some() {
project_override_badge(ui).on_hover_text(CONFIG_DISABLED_TEXT);
}
});
let mut custom_make_str = state.config.custom_make.clone().unwrap_or_default();
if ui
@@ -790,20 +787,52 @@ fn split_obj_config_ui(
state.watcher_change = true;
};
state.watcher_change |= patterns_ui(
ui,
"File patterns",
&mut state.config.watch_patterns,
&mut config_state.watch_pattern_text,
appearance,
state.project_config_info.is_some(),
default_watch_patterns,
);
state.watcher_change |= patterns_ui(
ui,
"Ignore patterns",
&mut state.config.ignore_patterns,
&mut config_state.ignore_pattern_text,
appearance,
state.project_config_info.is_some(),
default_ignore_patterns,
);
}
fn patterns_ui(
ui: &mut egui::Ui,
text: &str,
patterns: &mut Vec<Glob>,
pattern_text: &mut String,
appearance: &Appearance,
has_project_config: bool,
on_reset: impl FnOnce() -> Vec<Glob>,
) -> bool {
let mut change = false;
ui.horizontal(|ui| {
ui.label(RichText::new("File patterns").color(appearance.text_color));
ui.label(RichText::new(text).color(appearance.text_color));
if ui
.add_enabled(state.project_config_info.is_none(), egui::Button::new("Reset"))
.add_enabled(!has_project_config, egui::Button::new("Reset"))
.on_disabled_hover_text(CONFIG_DISABLED_TEXT)
.clicked()
{
state.config.watch_patterns =
DEFAULT_WATCH_PATTERNS.iter().map(|s| Glob::new(s).unwrap()).collect();
state.watcher_change = true;
*patterns = on_reset();
change = true;
}
if has_project_config {
project_override_badge(ui).on_hover_text(CONFIG_DISABLED_TEXT);
}
});
let mut remove_at: Option<usize> = None;
for (idx, glob) in state.config.watch_patterns.iter().enumerate() {
for (idx, glob) in patterns.iter().enumerate() {
ui.horizontal(|ui| {
ui.label(
RichText::new(glob.to_string())
@@ -811,7 +840,7 @@ fn split_obj_config_ui(
.family(FontFamily::Monospace),
);
if ui
.add_enabled(state.project_config_info.is_none(), egui::Button::new("-").small())
.add_enabled(!has_project_config, egui::Button::new("-").small())
.on_disabled_hover_text(CONFIG_DISABLED_TEXT)
.clicked()
{
@@ -820,26 +849,27 @@ fn split_obj_config_ui(
});
}
if let Some(idx) = remove_at {
state.config.watch_patterns.remove(idx);
state.watcher_change = true;
patterns.remove(idx);
change = true;
}
ui.horizontal(|ui| {
ui.add_enabled(
state.project_config_info.is_none(),
egui::TextEdit::singleline(&mut config_state.watch_pattern_text).desired_width(100.0),
!has_project_config,
egui::TextEdit::singleline(pattern_text).desired_width(100.0),
)
.on_disabled_hover_text(CONFIG_DISABLED_TEXT);
if ui
.add_enabled(state.project_config_info.is_none(), egui::Button::new("+").small())
.add_enabled(!has_project_config, egui::Button::new("+").small())
.on_disabled_hover_text(CONFIG_DISABLED_TEXT)
.clicked()
&& let Ok(glob) = Glob::new(&config_state.watch_pattern_text)
&& let Ok(glob) = Glob::new(pattern_text)
{
state.config.watch_patterns.push(glob);
state.watcher_change = true;
config_state.watch_pattern_text.clear();
patterns.push(glob);
change = true;
pattern_text.clear();
}
});
change
}
pub fn arch_config_window(
@@ -854,20 +884,64 @@ pub fn arch_config_window(
});
}
fn project_override_badge(ui: &mut egui::Ui) -> egui::Response {
ui.add(egui::Label::new(RichText::new("").color(ui.visuals().warn_fg_color)).selectable(false))
}
fn config_property_ui(
ui: &mut egui::Ui,
state: &mut AppState,
property_id: ConfigPropertyId,
) -> bool {
let mut changed = false;
let current_value = state.config.diff_obj_config.get_property_value(property_id);
match (property_id.kind(), current_value) {
(ConfigPropertyKind::Boolean, ConfigPropertyValue::Boolean(mut checked)) => {
let mut response = ui.checkbox(&mut checked, property_id.name());
if let Some(description) = property_id.description() {
response = response.on_hover_text(description);
}
if response.changed() {
let is_overridden = state.current_project_config.as_ref().is_some_and(|config| {
let key = property_id.name();
if let Some(selected) = state.config.selected_obj.as_ref()
&& let Some(units) = config.units.as_deref()
&& let Some(unit) = units.iter().find(|unit| unit.name() == selected.name)
&& let Some(options) = unit.options()
&& options.contains_key(key)
{
return true;
}
if let Some(options) = config.options.as_ref()
&& options.contains_key(key)
{
return true;
}
false
});
let override_value =
is_overridden.then(|| state.effective_diff_config().get_property_value(property_id));
let base_value = state.config.diff_obj_config.get_property_value(property_id);
match (property_id.kind(), base_value, override_value) {
(
ConfigPropertyKind::Boolean,
ConfigPropertyValue::Boolean(base_checked),
override_value,
) => {
let mut checked = match override_value {
Some(ConfigPropertyValue::Boolean(value)) => value,
_ => base_checked,
};
let response = ui
.horizontal(|ui| {
let mut response = ui
.add_enabled(
!is_overridden,
egui::widgets::Checkbox::new(&mut checked, property_id.name()),
)
.on_disabled_hover_text(CONFIG_DISABLED_TEXT);
if let Some(description) = property_id.description() {
response = response.on_hover_text(description);
}
if is_overridden {
project_override_badge(ui).on_hover_text(CONFIG_DISABLED_TEXT);
}
response
})
.inner;
if !is_overridden && response.changed() {
state
.config
.diff_obj_config
@@ -876,7 +950,11 @@ fn config_property_ui(
changed = true;
}
}
(ConfigPropertyKind::Choice(variants), ConfigPropertyValue::Choice(selected)) => {
(
ConfigPropertyKind::Choice(variants),
ConfigPropertyValue::Choice(base_selected),
override_value,
) => {
fn variant_name(variant: &ConfigEnumVariantInfo) -> String {
if variant.is_default {
format!("{} (default)", variant.name)
@@ -884,36 +962,51 @@ fn config_property_ui(
variant.name.to_string()
}
}
let display_selected = match override_value {
Some(ConfigPropertyValue::Choice(value)) => value,
_ => base_selected,
};
let selected_variant = variants
.iter()
.find(|v| v.value == selected)
.find(|v| v.value == display_selected)
.or_else(|| variants.iter().find(|v| v.is_default))
.expect("Invalid choice variant");
let response = egui::ComboBox::new(property_id.name(), property_id.name())
.selected_text(variant_name(selected_variant))
.show_ui(ui, |ui| {
for variant in variants {
let mut response =
ui.selectable_label(selected == variant.value, variant_name(variant));
if let Some(description) = variant.description {
response = response.on_hover_text(description);
}
if response.clicked() {
state
.config
.diff_obj_config
.set_property_value(
property_id,
ConfigPropertyValue::Choice(variant.value),
)
.expect("Failed to set property value");
changed = true;
}
}
})
.response;
if let Some(description) = property_id.description() {
response.on_hover_text(description);
let mut new_value: Option<&'static str> = None;
ui.horizontal(|ui| {
let inner = ui.add_enabled_ui(!is_overridden, |ui| {
egui::ComboBox::new(property_id.name(), property_id.name())
.selected_text(variant_name(selected_variant))
.show_ui(ui, |ui| {
for variant in variants {
let mut response = ui.selectable_label(
display_selected == variant.value,
variant_name(variant),
);
if let Some(description) = variant.description {
response = response.on_hover_text(description);
}
if response.clicked() {
new_value = Some(variant.value);
}
}
});
});
let mut response = inner.response.on_disabled_hover_text(CONFIG_DISABLED_TEXT);
if let Some(description) = property_id.description() {
response = response.on_hover_text(description);
}
if is_overridden {
project_override_badge(ui).on_hover_text(CONFIG_DISABLED_TEXT);
}
response
});
if !is_overridden && let Some(value) = new_value {
state
.config
.diff_obj_config
.set_property_value(property_id, ConfigPropertyValue::Choice(value))
.expect("Failed to set property value");
changed = true;
}
}
_ => panic!("Incompatible property kind and value"),

View File

@@ -1,11 +1,11 @@
use std::{cmp::min, default::Default, mem::take};
use std::default::Default;
use egui::{Label, Sense, Widget, text::LayoutJob};
use objdiff_core::{
diff::{
DataDiff, DataDiffKind, DataRelocationDiff,
data::resolve_relocation,
display::{ContextItem, HoverItem, HoverItemColor, relocation_context, relocation_hover},
DataDiffKind, DataDiffRow,
data::BYTES_PER_ROW,
display::{data_row_context, data_row_hover},
},
obj::Object,
};
@@ -13,84 +13,30 @@ use objdiff_core::{
use super::diff::{context_menu_items_ui, hover_items_ui};
use crate::views::{appearance::Appearance, write_text};
pub(crate) const BYTES_PER_ROW: usize = 16;
fn data_row_hover(obj: &Object, diffs: &[(DataDiff, Vec<DataRelocationDiff>)]) -> Vec<HoverItem> {
let mut out = Vec::new();
let reloc_diffs = diffs.iter().flat_map(|(_, reloc_diffs)| reloc_diffs);
let mut prev_reloc = None;
let mut first = true;
for reloc_diff in reloc_diffs {
let reloc = &reloc_diff.reloc;
if prev_reloc == Some(reloc) {
// Avoid showing consecutive duplicate relocations.
// We do this because a single relocation can span across multiple diffs if the
// bytes in the relocation changed (e.g. first byte is added, second is unchanged).
continue;
}
prev_reloc = Some(reloc);
if first {
first = false;
} else {
out.push(HoverItem::Separator);
}
let color = get_hover_item_color_for_diff_kind(reloc_diff.kind);
let reloc = resolve_relocation(&obj.symbols, reloc);
out.append(&mut relocation_hover(obj, reloc, Some(color)));
}
out
}
fn data_row_context(
obj: &Object,
diffs: &[(DataDiff, Vec<DataRelocationDiff>)],
) -> Vec<ContextItem> {
let mut out = Vec::new();
let reloc_diffs = diffs.iter().flat_map(|(_, reloc_diffs)| reloc_diffs);
let mut prev_reloc = None;
for reloc_diff in reloc_diffs {
let reloc = &reloc_diff.reloc;
if prev_reloc == Some(reloc) {
// Avoid showing consecutive duplicate relocations.
// We do this because a single relocation can span across multiple diffs if the
// bytes in the relocation changed (e.g. first byte is added, second is unchanged).
continue;
}
prev_reloc = Some(reloc);
let reloc = resolve_relocation(&obj.symbols, reloc);
out.append(&mut relocation_context(obj, reloc, None));
}
out
}
fn data_row_hover_ui(
ui: &mut egui::Ui,
obj: &Object,
diffs: &[(DataDiff, Vec<DataRelocationDiff>)],
diff_row: &DataDiffRow,
appearance: &Appearance,
) {
ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend);
hover_items_ui(ui, data_row_hover(obj, diffs), appearance);
hover_items_ui(ui, data_row_hover(obj, diff_row), appearance);
});
}
fn data_row_context_menu(
ui: &mut egui::Ui,
obj: &Object,
diffs: &[(DataDiff, Vec<DataRelocationDiff>)],
diff_row: &DataDiffRow,
column: usize,
appearance: &Appearance,
) {
ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend);
context_menu_items_ui(ui, data_row_context(obj, diffs), column, appearance);
context_menu_items_ui(ui, data_row_context(obj, diff_row), column, appearance);
});
}
@@ -103,31 +49,23 @@ fn get_color_for_diff_kind(diff_kind: DataDiffKind, appearance: &Appearance) ->
}
}
fn get_hover_item_color_for_diff_kind(diff_kind: DataDiffKind) -> HoverItemColor {
match diff_kind {
DataDiffKind::None => HoverItemColor::Normal,
DataDiffKind::Replace => HoverItemColor::Special,
DataDiffKind::Delete => HoverItemColor::Delete,
DataDiffKind::Insert => HoverItemColor::Insert,
}
}
pub(crate) fn data_row_ui(
ui: &mut egui::Ui,
obj: Option<&Object>,
address: usize,
diffs: &[(DataDiff, Vec<DataRelocationDiff>)],
base_address: u64,
row_address: u64,
diff_row: &DataDiffRow,
appearance: &Appearance,
column: usize,
) {
if diffs.iter().any(|(dd, rds)| {
dd.kind != DataDiffKind::None || rds.iter().any(|rd| rd.kind != DataDiffKind::None)
}) {
if diff_row.segments.iter().any(|dd| dd.kind != DataDiffKind::None)
|| diff_row.relocations.iter().any(|rd| rd.kind != DataDiffKind::None)
{
ui.painter().rect_filled(ui.available_rect_before_wrap(), 0.0, ui.visuals().faint_bg_color);
}
let mut job = LayoutJob::default();
write_text(
format!("{address:08x}: ").as_str(),
format!("{row_address:08x}: ").as_str(),
appearance.text_color,
&mut job,
appearance.code_font.clone(),
@@ -135,21 +73,22 @@ pub(crate) fn data_row_ui(
// The offset shown on the side of the GUI, shifted by insertions/deletions.
let mut cur_addr = 0usize;
// The offset into the actual bytes of the section on this side, ignoring differences.
let mut cur_addr_actual = address;
for (diff, reloc_diffs) in diffs {
let mut cur_addr_actual = base_address + row_address;
for diff in diff_row.segments.iter() {
let base_color = get_color_for_diff_kind(diff.kind, appearance);
if diff.data.is_empty() {
let mut str = " ".repeat(diff.len);
let mut str = " ".repeat(diff.size);
let n1 = cur_addr / 8;
let n2 = (diff.len + cur_addr) / 8;
let n2 = (diff.size + cur_addr) / 8;
str.push_str(" ".repeat(n2 - n1).as_str());
write_text(str.as_str(), base_color, &mut job, appearance.code_font.clone());
cur_addr += diff.len;
cur_addr += diff.size;
} else {
for byte in &diff.data {
let mut byte_text = format!("{byte:02x} ");
let mut byte_color = base_color;
if let Some(reloc_diff) = reloc_diffs
if let Some(reloc_diff) = diff_row
.relocations
.iter()
.find(|reloc_diff| reloc_diff.range.contains(&cur_addr_actual))
{
@@ -178,11 +117,11 @@ pub(crate) fn data_row_ui(
write_text(str.as_str(), appearance.text_color, &mut job, appearance.code_font.clone());
}
write_text(" ", appearance.text_color, &mut job, appearance.code_font.clone());
for (diff, _) in diffs {
for diff in diff_row.segments.iter() {
let base_color = get_color_for_diff_kind(diff.kind, appearance);
if diff.data.is_empty() {
write_text(
" ".repeat(diff.len).as_str(),
" ".repeat(diff.size).as_str(),
base_color,
&mut job,
appearance.code_font.clone(),
@@ -203,69 +142,7 @@ pub(crate) fn data_row_ui(
let response = Label::new(job).sense(Sense::click()).ui(ui);
if let Some(obj) = obj {
response.context_menu(|ui| data_row_context_menu(ui, obj, diffs, column, appearance));
response.on_hover_ui_at_pointer(|ui| data_row_hover_ui(ui, obj, diffs, appearance));
response.context_menu(|ui| data_row_context_menu(ui, obj, diff_row, column, appearance));
response.on_hover_ui_at_pointer(|ui| data_row_hover_ui(ui, obj, diff_row, appearance));
}
}
pub(crate) fn split_diffs(
diffs: &[DataDiff],
reloc_diffs: &[DataRelocationDiff],
) -> Vec<Vec<(DataDiff, Vec<DataRelocationDiff>)>> {
let mut split_diffs = Vec::<Vec<(DataDiff, Vec<DataRelocationDiff>)>>::new();
let mut row_diffs = Vec::<(DataDiff, Vec<DataRelocationDiff>)>::new();
// The offset shown on the side of the GUI, shifted by insertions/deletions.
let mut cur_addr = 0usize;
// The offset into the actual bytes of the section on this side, ignoring differences.
let mut cur_addr_actual = 0usize;
for diff in diffs {
let mut cur_len = 0usize;
while cur_len < diff.len {
let remaining_len = diff.len - cur_len;
let mut remaining_in_row = BYTES_PER_ROW - (cur_addr % BYTES_PER_ROW);
let len = min(remaining_len, remaining_in_row);
let data_diff = DataDiff {
data: if diff.data.is_empty() {
Vec::new()
} else {
diff.data[cur_len..cur_len + len].to_vec()
},
kind: diff.kind,
len,
symbol: String::new(), // TODO
};
let row_reloc_diffs: Vec<DataRelocationDiff> = if diff.data.is_empty() {
Vec::new()
} else {
let diff_range = cur_addr_actual + cur_len..cur_addr_actual + cur_len + len;
reloc_diffs
.iter()
.filter_map(|reloc_diff| {
if reloc_diff.range.start < diff_range.end
&& diff_range.start < reloc_diff.range.end
{
Some(reloc_diff.clone())
} else {
None
}
})
.collect()
};
let row_diff = (data_diff, row_reloc_diffs);
row_diffs.push(row_diff);
remaining_in_row -= len;
cur_len += len;
cur_addr += len;
if remaining_in_row == 0 {
split_diffs.push(take(&mut row_diffs));
}
}
cur_addr_actual += diff.data.len();
}
if !row_diffs.is_empty() {
split_diffs.push(take(&mut row_diffs));
}
split_diffs
}

View File

@@ -1,10 +1,12 @@
use egui::TextStyle;
use objdiff_core::diff::{ConfigEnum, Demangler};
use crate::views::appearance::Appearance;
#[derive(Default)]
pub struct DemangleViewState {
pub text: String,
pub demangler: Demangler,
}
pub fn demangle_window(
@@ -14,9 +16,23 @@ pub fn demangle_window(
appearance: &Appearance,
) {
egui::Window::new("Demangle").open(show).show(ctx, |ui| {
egui::ComboBox::from_label("Demangler")
.selected_text(state.demangler.name().to_string())
.show_ui(ui, |ui| {
for demangler in Demangler::variants() {
if *demangler != Demangler::None {
let response =
ui.selectable_value(&mut state.demangler, *demangler, demangler.name());
if let Some(description) = demangler.description() {
response.on_hover_text(description);
}
}
}
});
ui.separator();
ui.text_edit_singleline(&mut state.text);
ui.add_space(10.0);
if let Some(demangled) = cwdemangle::demangle(&state.text, &Default::default()) {
if let Some(demangled) = state.demangler.demangle(&state.text) {
ui.scope(|ui| {
ui.style_mut().override_text_style = Some(TextStyle::Monospace);
ui.colored_label(appearance.replace_color, &demangled);

View File

@@ -1,11 +1,18 @@
use std::cmp::Ordering;
use egui::{Id, Layout, RichText, ScrollArea, TextEdit, Ui, Widget, text::LayoutJob};
use objdiff_core::{
build::BuildStatus,
diff::{
DiffObjConfig, ObjectDiff, SectionDiff, SymbolDiff,
display::{ContextItem, HoverItem, HoverItemColor, SymbolFilter, SymbolNavigationKind},
DiffObjConfig, ObjectDiff, SymbolDiff,
data::BYTES_PER_ROW,
display::{
ContextItem, DiffText, HoverItem, HoverItemColor, SymbolFilter, SymbolNavigationKind,
display_row,
},
},
obj::{Object, Section, Symbol},
obj::{InstructionArgValue, Object, Symbol},
util::ReallySigned,
};
use time::format_description;
@@ -14,7 +21,7 @@ use crate::{
views::{
appearance::Appearance,
column_layout::{render_header, render_strips, render_table},
data_diff::{BYTES_PER_ROW, data_row_ui, split_diffs},
data_diff::data_row_ui,
extab_diff::extab_ui,
function_diff::{FunctionDiffContext, asm_col_ui},
symbol_diff::{
@@ -25,17 +32,10 @@ use crate::{
},
};
#[derive(Clone, Copy)]
enum SelectedSymbol {
Symbol(usize),
Section(usize),
}
#[derive(Clone, Copy)]
struct DiffColumnContext<'a> {
status: &'a BuildStatus,
obj: Option<&'a (Object, ObjectDiff)>,
section: Option<(&'a Section, &'a SectionDiff, usize)>,
symbol: Option<(&'a Symbol, &'a SymbolDiff, usize)>,
}
@@ -46,49 +46,73 @@ impl<'a> DiffColumnContext<'a> {
obj: Option<&'a (Object, ObjectDiff)>,
selected_symbol: Option<&SymbolRefByName>,
) -> Self {
let selected_symbol = match view {
let selected_symbol_idx = match view {
View::SymbolDiff => None,
View::FunctionDiff | View::ExtabDiff => match (obj, selected_symbol) {
(Some(obj), Some(s)) => {
obj.0.symbol_by_name(&s.symbol_name).map(SelectedSymbol::Symbol)
}
_ => None,
},
View::DataDiff => match (obj, selected_symbol) {
(Some(obj), Some(SymbolRefByName { section_name: Some(section_name), .. })) => {
find_section(&obj.0, section_name).map(SelectedSymbol::Section)
}
View::FunctionDiff | View::DataDiff | View::ExtabDiff => match (obj, selected_symbol) {
(Some(obj), Some(s)) => obj.0.symbol_by_name(&s.symbol_name),
_ => None,
},
};
let (section, symbol) = match (obj, selected_symbol) {
(Some((obj, obj_diff)), Some(SelectedSymbol::Symbol(symbol_ref))) => {
let symbol = match (obj, selected_symbol_idx) {
(Some((obj, obj_diff)), Some(symbol_ref)) => {
let symbol = &obj.symbols[symbol_ref];
(
symbol.section.map(|section_idx| {
(&obj.sections[section_idx], &obj_diff.sections[section_idx], section_idx)
}),
Some((symbol, &obj_diff.symbols[symbol_ref], symbol_ref)),
)
Some((symbol, &obj_diff.symbols[symbol_ref], symbol_ref))
}
(Some((obj, obj_diff)), Some(SelectedSymbol::Section(section_idx))) => (
Some((&obj.sections[section_idx], &obj_diff.sections[section_idx], section_idx)),
None,
),
_ => (None, None),
_ => None,
};
Self { status, obj, section, symbol }
Self { status, obj, symbol }
}
#[inline]
pub fn has_symbol(&self) -> bool { self.section.is_some() || self.symbol.is_some() }
pub fn has_symbol(&self) -> bool { self.symbol.is_some() }
#[inline]
pub fn id(&self) -> Option<&str> {
self.symbol
.map(|(symbol, _, _)| symbol.name.as_str())
.or_else(|| self.section.map(|(section, _, _)| section.name.as_str()))
pub fn id(&self) -> Option<&str> { self.symbol.map(|(symbol, _, _)| symbol.name.as_str()) }
}
/// Obtains the assembly text for a given symbol diff, suitable for copying to clipboard.
fn get_asm_text(
obj: &Object,
symbol_diff: &SymbolDiff,
symbol_idx: usize,
diff_config: &DiffObjConfig,
) -> String {
let mut asm_text = String::new();
for ins_row in &symbol_diff.instruction_rows {
let mut line = String::new();
let result = display_row(obj, symbol_idx, ins_row, diff_config, |segment| {
let text = match segment.text {
DiffText::Basic(text) => text.to_string(),
DiffText::Line(num) => format!("{num} "),
DiffText::Address(addr) => format!("{addr:x}:"),
DiffText::Opcode(mnemonic, _op) => format!("{mnemonic} "),
DiffText::Argument(arg) => match arg {
InstructionArgValue::Signed(v) => format!("{:#x}", ReallySigned(v)),
InstructionArgValue::Unsigned(v) => format!("{v:#x}"),
InstructionArgValue::Opaque(v) => v.into_owned(),
},
DiffText::BranchDest(addr) => format!("{addr:x}"),
DiffText::Symbol(sym) => sym.demangled_name.as_ref().unwrap_or(&sym.name).clone(),
DiffText::Addend(addend) => match addend.cmp(&0i64) {
Ordering::Greater => format!("+{addend:#x}"),
Ordering::Less => format!("-{:#x}", -addend),
_ => String::new(),
},
DiffText::Spacing(n) => " ".repeat(n.into()),
DiffText::Eol => "\n".to_string(),
};
line.push_str(&text);
Ok(())
});
if result.is_ok() {
asm_text.push_str(line.trim_end());
asm_text.push('\n');
}
}
asm_text
}
#[must_use]
@@ -133,10 +157,7 @@ pub fn diff_view_ui(
{
navigation.right_symbol = Some(target_symbol_ref);
}
} else if navigation.left_symbol.is_some()
&& left_ctx.obj.is_some()
&& left_ctx.section.is_none()
{
} else if navigation.left_symbol.is_some() && left_ctx.obj.is_some() {
// Clear selection if symbol goes missing
navigation.left_symbol = None;
}
@@ -147,10 +168,7 @@ pub fn diff_view_ui(
{
navigation.left_symbol = Some(target_symbol_ref);
}
} else if navigation.right_symbol.is_some()
&& right_ctx.obj.is_some()
&& right_ctx.section.is_none()
{
} else if navigation.right_symbol.is_some() && right_ctx.obj.is_some() {
// Clear selection if symbol goes missing
navigation.right_symbol = None;
}
@@ -195,6 +213,17 @@ pub fn diff_view_ui(
ret = Some(DiffViewAction::CreateScratch(symbol.name.clone()));
}
}
if state.current_view == View::FunctionDiff
&& let Some((_, symbol_diff, symbol_idx)) = left_ctx.symbol
&& let Some((obj, _)) = left_ctx.obj
&& ui
.button("📋 Copy")
.on_hover_text_at_pointer("Copy all rows to clipboard")
.clicked()
{
ui.ctx().copy_text(get_asm_text(obj, symbol_diff, symbol_idx, diff_config));
}
});
}
@@ -225,12 +254,6 @@ pub fn diff_view_ui(
{
ret = Some(action);
}
} else if let Some((section, _, _)) = left_ctx.section {
ui.label(
RichText::new(section.name.clone())
.font(appearance.code_font.clone())
.color(appearance.highlight_color),
);
} else if right_ctx.has_symbol() {
ui.label(
RichText::new("Choose target symbol")
@@ -247,16 +270,20 @@ pub fn diff_view_ui(
// Third row
if left_ctx.has_symbol() && right_ctx.has_symbol() {
if (state.current_view == View::FunctionDiff
&& ui
.button("Change target")
.on_hover_text_at_pointer("Choose a different symbol to use as the target")
.clicked()
|| hotkeys::consume_change_target_shortcut(ui.ctx()))
&& let Some(symbol_ref) = state.symbol_state.right_symbol.as_ref()
{
ret = Some(DiffViewAction::SelectingLeft(symbol_ref.clone()));
}
ui.horizontal(|ui| {
if (state.current_view == View::FunctionDiff
&& ui
.button("Change target")
.on_hover_text_at_pointer(
"Choose a different symbol to use as the target",
)
.clicked()
|| hotkeys::consume_change_target_shortcut(ui.ctx()))
&& let Some(symbol_ref) = state.symbol_state.right_symbol.as_ref()
{
ret = Some(DiffViewAction::SelectingLeft(symbol_ref.clone()));
}
});
} else if left_ctx.status.success && !left_ctx.has_symbol() {
ui.horizontal(|ui| {
let mut search = state.search.clone();
@@ -330,6 +357,15 @@ pub fn diff_view_ui(
{
ret = Some(DiffViewAction::OpenSourcePath);
}
if let Some((_, symbol_diff, symbol_idx)) = right_ctx.symbol
&& let Some((obj, _)) = right_ctx.obj
&& ui
.button("📋 Copy")
.on_hover_text_at_pointer("Copy all rows to clipboard")
.clicked()
{
ui.ctx().copy_text(get_asm_text(obj, symbol_diff, symbol_idx, diff_config));
}
});
// Second row
@@ -363,12 +399,6 @@ pub fn diff_view_ui(
{
ret = Some(action);
}
} else if let Some((section, _, _)) = right_ctx.section {
ui.label(
RichText::new(section.name.clone())
.font(appearance.code_font.clone())
.color(appearance.highlight_color),
);
} else if left_ctx.has_symbol() {
ui.label(
RichText::new("Choose base symbol")
@@ -509,29 +539,21 @@ pub fn diff_view_ui(
View::DataDiff,
Some((left_obj, _left_diff)),
Some((right_obj, _right_diff)),
Some((_left_section, left_section_diff, _left_symbol_idx)),
Some((_right_section, right_section_diff, _right_symbol_idx)),
Some((left_symbol, left_symbol_diff, _left_symbol_idx)),
Some((right_symbol, right_symbol_diff, _right_symbol_idx)),
) =
(state.current_view, left_ctx.obj, right_ctx.obj, left_ctx.section, right_ctx.section)
(state.current_view, left_ctx.obj, right_ctx.obj, left_ctx.symbol, right_ctx.symbol)
{
// Joint diff view
hotkeys::check_scroll_hotkeys(ui, true);
let left_total_bytes =
left_section_diff.data_diff.iter().fold(0usize, |accum, item| accum + item.len);
let right_total_bytes =
right_section_diff.data_diff.iter().fold(0usize, |accum, item| accum + item.len);
if left_total_bytes != right_total_bytes {
ui.label("Data size mismatch");
let total_rows = left_symbol_diff.data_rows.len();
if total_rows != right_symbol_diff.data_rows.len() {
ui.label("Row count mismatch");
return;
}
if left_total_bytes == 0 {
if total_rows == 0 {
return;
}
let total_rows = (left_total_bytes - 1) / BYTES_PER_ROW + 1;
let left_diffs =
split_diffs(&left_section_diff.data_diff, &left_section_diff.reloc_diff);
let right_diffs =
split_diffs(&right_section_diff.data_diff, &right_section_diff.reloc_diff);
render_table(
ui,
available_width,
@@ -540,14 +562,15 @@ pub fn diff_view_ui(
total_rows,
|row, column| {
let i = row.index();
let address = i * BYTES_PER_ROW;
let row_offset = i as u64 * BYTES_PER_ROW as u64;
row.col(|ui| {
if column == 0 {
data_row_ui(
ui,
Some(left_obj),
address,
&left_diffs[i],
left_symbol.address,
row_offset,
&left_symbol_diff.data_rows[i],
appearance,
column,
);
@@ -555,8 +578,9 @@ pub fn diff_view_ui(
data_row_ui(
ui,
Some(right_obj),
address,
&right_diffs[i],
right_symbol.address,
row_offset,
&right_symbol_diff.data_rows[i],
appearance,
column,
);
@@ -619,9 +643,7 @@ fn symbol_label_ui(
.font(appearance.code_font.clone())
.color(appearance.highlight_color),
)
.selectable(false)
// TODO .show_tooltip_when_elided(false)
// https://github.com/emilk/egui/commit/071e090e2b2601e5ed4726a63a753188503dfaf2
.show_tooltip_when_elided(false)
.ui(ui)
.on_hover_ui_at_pointer(|ui| symbol_hover_ui(ui, ctx, symbol_idx, appearance))
.context_menu(|ui| {
@@ -651,11 +673,39 @@ fn diff_col_ui(
if !ctx.status.success {
build_log_ui(ui, ctx.status, appearance);
} else if let Some((obj, diff)) = ctx.obj {
if let Some((_symbol, symbol_diff, symbol_idx)) = ctx.symbol {
if let Some((symbol, symbol_diff, symbol_idx)) = ctx.symbol {
hotkeys::check_scroll_hotkeys(ui, false);
let ctx = FunctionDiffContext { obj, diff, symbol_ref: Some(symbol_idx) };
if state.current_view == View::ExtabDiff {
extab_ui(ui, ctx, appearance, column);
} else if state.current_view == View::DataDiff {
hotkeys::check_scroll_hotkeys(ui, false);
let total_rows = symbol_diff.data_rows.len();
if total_rows == 0 {
return ret;
}
render_table(
ui,
available_width / 2.0,
1,
appearance.code_font.size,
total_rows,
|row, _column| {
let i = row.index();
let row_offset = i as u64 * BYTES_PER_ROW as u64;
row.col(|ui| {
data_row_ui(
ui,
Some(obj),
symbol.address,
row_offset,
&symbol_diff.data_rows[i],
appearance,
column,
);
});
},
);
} else {
render_table(
ui,
@@ -680,29 +730,6 @@ fn diff_col_ui(
},
);
}
} else if let Some((_section, section_diff, _section_idx)) = ctx.section {
hotkeys::check_scroll_hotkeys(ui, false);
let total_bytes =
section_diff.data_diff.iter().fold(0usize, |accum, item| accum + item.len);
if total_bytes == 0 {
return ret;
}
let total_rows = (total_bytes - 1) / BYTES_PER_ROW + 1;
let diffs = split_diffs(&section_diff.data_diff, &section_diff.reloc_diff);
render_table(
ui,
available_width / 2.0,
1,
appearance.code_font.size,
total_rows,
|row, _column| {
let i = row.index();
let address = i * BYTES_PER_ROW;
row.col(|ui| {
data_row_ui(ui, Some(obj), address, &diffs[i], appearance, column);
});
},
);
} else if let Some((_other_symbol, _other_symbol_diff, other_symbol_idx)) = other_ctx.symbol
{
if let Some(action) = symbol_list_ui(
@@ -713,6 +740,7 @@ fn diff_col_ui(
appearance,
column,
open_sections,
diff_config,
) {
match (column, action) {
(
@@ -751,6 +779,7 @@ fn diff_col_ui(
appearance,
column,
open_sections,
diff_config,
) {
ret = Some(result);
}
@@ -798,10 +827,6 @@ fn missing_obj_ui(ui: &mut Ui, appearance: &Appearance) {
});
}
fn find_section(obj: &Object, section_name: &str) -> Option<usize> {
obj.sections.iter().position(|section| section.name == section_name)
}
pub fn hover_items_ui(ui: &mut Ui, items: Vec<HoverItem>, appearance: &Appearance) {
for item in items {
match item {

View File

@@ -1,8 +1,7 @@
use core::any::Any;
use egui::ScrollArea;
use objdiff_core::{
arch::ppc::ExceptionInfo,
obj::{Object, Symbol},
};
use objdiff_core::{arch::ppc::ExceptionInfo, obj::Object};
use crate::views::{appearance::Appearance, function_diff::FunctionDiffContext};
@@ -26,19 +25,19 @@ fn decode_extab(extab: &ExceptionInfo) -> String {
text
}
fn find_extab_entry<'a>(_obj: &'a Object, _symbol: &Symbol) -> Option<&'a ExceptionInfo> {
// TODO
// obj.arch.ppc().and_then(|ppc| ppc.extab_for_symbol(symbol))
None
fn find_extab_entry(obj: &Object, symbol_index: usize) -> Option<&ExceptionInfo> {
(obj.arch.as_ref() as &dyn Any)
.downcast_ref::<objdiff_core::arch::ppc::ArchPpc>()
.and_then(|ppc| ppc.extab_for_symbol(symbol_index))
}
fn extab_text_ui(
ui: &mut egui::Ui,
ctx: FunctionDiffContext<'_>,
symbol: &Symbol,
symbol_index: usize,
appearance: &Appearance,
) -> Option<()> {
if let Some(extab_entry) = find_extab_entry(ctx.obj, symbol) {
if let Some(extab_entry) = find_extab_entry(ctx.obj, symbol_index) {
let text = decode_extab(extab_entry);
ui.colored_label(appearance.replace_color, &text);
return Some(());
@@ -58,10 +57,8 @@ pub(crate) fn extab_ui(
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend);
if let Some(symbol) =
ctx.symbol_ref.and_then(|symbol_ref| ctx.obj.symbols.get(symbol_ref))
{
extab_text_ui(ui, ctx, symbol, appearance);
if let Some(symbol_index) = ctx.symbol_ref {
extab_text_ui(ui, ctx, symbol_index, appearance);
}
});
});

View File

@@ -104,7 +104,7 @@ impl FrameHistory {
));
let cpu_usage = to_screen.inverse().transform_pos(pointer_pos).y;
let text = format!("{:.1} ms", 1e3 * cpu_usage);
shapes.push(ui.fonts(|f| {
shapes.push(ui.fonts_mut(|f| {
Shape::text(
f,
pos2(rect.left(), y),

View File

@@ -217,7 +217,7 @@ fn asm_row_ui(
if ins_diff.kind != InstructionDiffKind::None {
ui.painter().rect_filled(ui.available_rect_before_wrap(), 0.0, ui.visuals().faint_bg_color);
}
let space_width = ui.fonts(|f| f.glyph_width(&appearance.code_font, ' '));
let space_width = ui.fonts_mut(|f| f.glyph_width(&appearance.code_font, ' '));
display_row(obj, symbol_idx, ins_diff, diff_config, |segment| {
if let Some(action) =
diff_text_ui(ui, segment, appearance, ins_view_state, column, space_width, &response_cb)

View File

@@ -6,7 +6,7 @@ use egui::{
};
use objdiff_core::{
diff::{
ObjectDiff, SymbolDiff,
DiffObjConfig, ObjectDiff, ShowSymbolSizes, SymbolDiff,
display::{
HighlightKind, SectionDisplay, SymbolFilter, SymbolNavigationKind, display_sections,
symbol_context, symbol_hover,
@@ -142,6 +142,11 @@ impl DiffViewState {
JobResult::ObjDiff(result) => {
self.build = take(result);
// Clear reload flag so that we don't reload the view immediately
if let Ok(mut state) = state.write() {
state.queue_reload = false;
}
// TODO: where should this go?
if let Some(result) = self.post_build_nav.take() {
self.current_view = result.view;
@@ -228,7 +233,6 @@ impl DiffViewState {
let resolved_nav = resolve_navigation(nav.kind, resolved_left, resolved_right);
if (resolved_nav.left_symbol.is_some() && resolved_nav.right_symbol.is_some())
|| (resolved_nav.left_symbol.is_none() && resolved_nav.right_symbol.is_none())
|| resolved_nav.view != View::FunctionDiff
{
// Regular navigation
if state.is_selecting_symbol() {
@@ -411,14 +415,8 @@ fn resolve_navigation(
},
(SectionKind::Data, SectionKind::Data) => ResolvedNavigation {
view: View::DataDiff,
left_symbol: Some(SymbolRefByName {
symbol_name: "".to_string(),
section_name: Some(left.section.name.clone()),
}),
right_symbol: Some(SymbolRefByName {
symbol_name: "".to_string(),
section_name: Some(right.section.name.clone()),
}),
left_symbol: Some(left.symbol_ref),
right_symbol: Some(right.symbol_ref),
},
_ => ResolvedNavigation::default(),
},
@@ -433,14 +431,8 @@ fn resolve_navigation(
},
SectionKind::Data => ResolvedNavigation {
view: View::DataDiff,
left_symbol: Some(SymbolRefByName {
symbol_name: "".to_string(),
section_name: Some(left.section.name.clone()),
}),
right_symbol: Some(SymbolRefByName {
symbol_name: "".to_string(),
section_name: Some(left.section.name.clone()),
}),
left_symbol: Some(left.symbol_ref),
right_symbol: None,
},
_ => ResolvedNavigation::default(),
},
@@ -455,14 +447,8 @@ fn resolve_navigation(
},
SectionKind::Data => ResolvedNavigation {
view: View::DataDiff,
left_symbol: Some(SymbolRefByName {
symbol_name: "".to_string(),
section_name: Some(right.section.name.clone()),
}),
right_symbol: Some(SymbolRefByName {
symbol_name: "".to_string(),
section_name: Some(right.section.name.clone()),
}),
left_symbol: None,
right_symbol: Some(right.symbol_ref),
},
_ => ResolvedNavigation::default(),
},
@@ -539,6 +525,7 @@ fn symbol_ui(
state: &SymbolViewState,
appearance: &Appearance,
column: usize,
diff_config: &DiffObjConfig,
) -> Option<DiffViewAction> {
let mut ret = None;
let mut job = LayoutJob::default();
@@ -586,6 +573,21 @@ fn symbol_ui(
write_text(") ", appearance.text_color, &mut job, appearance.code_font.clone());
}
write_text(name, appearance.highlight_color, &mut job, appearance.code_font.clone());
if diff_config.show_symbol_sizes == ShowSymbolSizes::Decimal {
write_text(
&format!(" (size={})", symbol.size),
appearance.deemphasized_text_color,
&mut job,
appearance.code_font.clone(),
);
} else if diff_config.show_symbol_sizes == ShowSymbolSizes::Hex {
write_text(
&format!(" (size={:x})", symbol.size),
appearance.deemphasized_text_color,
&mut job,
appearance.code_font.clone(),
);
}
let response = egui::Button::selectable(selected, job)
.ui(ui)
.on_hover_ui_at_pointer(|ui| symbol_hover_ui(ui, ctx, symbol_idx, appearance));
@@ -660,6 +662,7 @@ pub fn symbol_list_ui(
appearance: &Appearance,
column: usize,
open_sections: Option<bool>,
diff_config: &DiffObjConfig,
) -> Option<DiffViewAction> {
let mut ret = None;
ScrollArea::both().auto_shrink([false, false]).show(ui, |ui| {
@@ -784,6 +787,7 @@ pub fn symbol_list_ui(
state,
appearance,
column,
diff_config,
) {
ret = Some(result);
}

View File

@@ -0,0 +1,6 @@
[build]
target = "wasm32-wasip2"
[unstable]
build-std = ["panic_abort", "core", "alloc"]
build-std-features = ["compiler-builtins-mem"]

View File

@@ -17,12 +17,13 @@ build = "build.rs"
crate-type = ["cdylib"]
[features]
default = ["std"]
default = []
std = ["objdiff-core/std"]
[dependencies]
log = { version = "0.4", default-features = false }
regex = { version = "1.11", default-features = false, features = ["unicode-case"] }
regex = { version = "1.12", default-features = false, features = ["unicode-case"] }
wit-bindgen = { version = "0.48", default-features = false, features = ["macros"] }
xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] }
[dependencies.objdiff-core]
@@ -33,8 +34,5 @@ features = ["arm", "arm64", "mips", "ppc", "superh", "x86", "dwarf"]
[target.'cfg(target_family = "wasm")'.dependencies]
talc = { version = "4.4", default-features = false, features = ["lock_api"] }
[target.'cfg(target_os = "wasi")'.dependencies]
wit-bindgen = { version = "0.43", default-features = false, features = ["macros"] }
[build-dependencies]
wit-deps = "0.5"

View File

@@ -1,12 +1,12 @@
{
"name": "objdiff-wasm",
"version": "3.0.0-beta.13",
"version": "3.4.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "objdiff-wasm",
"version": "3.0.0-beta.13",
"version": "3.4.1",
"license": "MIT OR Apache-2.0",
"devDependencies": {
"@biomejs/biome": "^1.9.3",
@@ -852,6 +852,7 @@
"integrity": "sha512-Y3b4Y7lGIvNPywspP38deHkp/EEkTXrJEHeX1K5yz8U/94PkWvPlDebjjiSvmI6TT+9iVzsq22qDlBEdDuJZhA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rspack/core": "1.2.3",
"@rspack/lite-tapable": "~1.0.1",
@@ -1083,6 +1084,7 @@
"integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"tslib": "^2.8.0"
}
@@ -2139,6 +2141,7 @@
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -2166,6 +2169,7 @@
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"

View File

@@ -1,6 +1,6 @@
{
"name": "objdiff-wasm",
"version": "3.0.0-beta.13",
"version": "3.4.1",
"description": "A local diffing tool for decompilation projects.",
"author": {
"name": "Luke Street",
@@ -19,8 +19,8 @@
"types": "dist/objdiff.d.ts",
"scripts": {
"build": "npm run build:wasm && npm run build:transpile && npm run build:lib",
"build:wasm": "cargo +nightly -Zbuild-std=panic_abort,core,alloc -Zbuild-std-features=compiler-builtins-mem build --target wasm32-wasip2 --release --no-default-features",
"build:transpile": "jco transpile ../target/wasm32-wasip2/release/objdiff_wasm.wasm --no-nodejs-compat --no-wasi-shim --no-namespaced-exports --map wasi:logging/logging=./wasi-logging.js --optimize -o pkg --name objdiff",
"build:wasm": "cargo build --profile release-min --no-default-features",
"build:transpile": "jco transpile ../target/wasm32-wasip2/release-min/objdiff_wasm.wasm --no-nodejs-compat --no-wasi-shim --no-namespaced-exports --map wasi:logging/logging=./wasi-logging.js --optimize -o pkg --name objdiff",
"build:lib": "rslib build"
},
"devDependencies": {

View File

@@ -0,0 +1,4 @@
[toolchain]
channel = "nightly"
components = ["rust-src"]
targets = ["wasm32-wasip2"]

View File

@@ -1,3 +1,4 @@
#![allow(clippy::derivable_impls)]
use alloc::{
format,
rc::{Rc, Weak},
@@ -23,15 +24,16 @@ wit_bindgen::generate!({
use exports::objdiff::core::{
diff::{
DiffConfigBorrow, DiffResult, Guest as GuestDiff, GuestDiffConfig, GuestObject,
DiffConfigBorrow, DiffResult, DiffSide, Guest as GuestDiff, GuestDiffConfig, GuestObject,
GuestObjectDiff, MappingConfig, Object, ObjectBorrow, ObjectDiff, ObjectDiffBorrow,
SymbolFlags, SymbolInfo, SymbolKind, SymbolRef,
SectionKind, SymbolFlags, SymbolInfo, SymbolKind, SymbolRef,
},
display::{
ContextItem, ContextItemCopy, ContextItemNavigate, DiffText, DiffTextColor, DiffTextOpcode,
DiffTextSegment, DiffTextSymbol, DisplayConfig, Guest as GuestDisplay, HoverItem,
HoverItemColor, HoverItemText, InstructionDiffKind, InstructionDiffRow, SectionDisplay,
SymbolDisplay, SymbolFilter, SymbolNavigationKind,
ContextItem, ContextItemCopy, ContextItemNavigate, DataDiff, DataDiffKind, DataDiffRow,
DataRelocationDiff, DiffText, DiffTextColor, DiffTextOpcode, DiffTextSegment,
DiffTextSymbol, DisplayConfig, Guest as GuestDisplay, HoverItem, HoverItemColor,
HoverItemText, InstructionDiffKind, InstructionDiffRow, SectionDisplay, SymbolDisplay,
SymbolFilter, SymbolNavigationKind,
},
};
@@ -137,6 +139,7 @@ impl GuestDisplay for Component {
size: d.size,
match_percent: d.match_percent,
symbols: d.symbols.into_iter().map(to_symbol_ref).collect(),
kind: d.kind.into(),
})
.collect()
}
@@ -161,6 +164,7 @@ impl GuestDisplay for Component {
} else {
obj_diff.symbols.get(symbol_display.symbol)
};
let section = symbol.section.and_then(|s| obj.sections.get(s));
SymbolDisplay {
info: SymbolInfo {
id: to_symbol_ref(symbol_display),
@@ -170,9 +174,8 @@ impl GuestDisplay for Component {
size: symbol.size,
kind: SymbolKind::from(symbol.kind),
section: symbol.section.map(|s| s as u32),
section_name: symbol
.section
.and_then(|s| obj.sections.get(s).map(|sec| sec.name.clone())),
section_name: section.map(|sec| sec.name.clone()),
section_kind: section.map_or(SectionKind::Unknown, |sec| sec.kind.into()),
flags: SymbolFlags::from(symbol.flags),
align: symbol.align.map(|a| a.get()),
virtual_address: symbol.virtual_address,
@@ -180,7 +183,8 @@ impl GuestDisplay for Component {
target_symbol: symbol_diff.and_then(|sd| sd.target_symbol.map(|s| s as u32)),
match_percent: symbol_diff.and_then(|sd| sd.match_percent),
diff_score: symbol_diff.and_then(|sd| sd.diff_score),
row_count: symbol_diff.map_or(0, |sd| sd.instruction_rows.len() as u32),
row_count: symbol_diff
.map_or(0, |sd| sd.instruction_rows.len().max(sd.data_rows.len()) as u32),
}
}
@@ -223,7 +227,7 @@ impl GuestDisplay for Component {
let symbol_display = from_symbol_ref(symbol_ref);
diff::display::symbol_context(obj, symbol_display.symbol as usize)
.into_iter()
.map(|item| ContextItem::from(item))
.map(ContextItem::from)
.collect()
}
@@ -235,7 +239,7 @@ impl GuestDisplay for Component {
let symbol_display = from_symbol_ref(symbol_ref);
diff::display::symbol_hover(obj, symbol_display.symbol as usize, addend, override_color)
.into_iter()
.map(|item| HoverItem::from(item))
.map(HoverItem::from)
.collect()
}
@@ -282,7 +286,7 @@ impl GuestDisplay for Component {
};
diff::display::instruction_context(obj, resolved, &ins)
.into_iter()
.map(|item| ContextItem::from(item))
.map(ContextItem::from)
.collect()
}
@@ -331,9 +335,123 @@ impl GuestDisplay for Component {
};
diff::display::instruction_hover(obj, resolved, &ins)
.into_iter()
.map(|item| HoverItem::from(item))
.map(HoverItem::from)
.collect()
}
fn display_data_row(
diff: ObjectDiffBorrow,
symbol_ref: SymbolRef,
row_index: u32,
) -> DataDiffRow {
let obj_diff = diff.get::<ResourceObjectDiff>();
let obj_diff = &obj_diff.1;
let symbol_display = from_symbol_ref(symbol_ref);
let symbol_diff = if symbol_display.is_mapping_symbol {
obj_diff
.mapping_symbols
.iter()
.find(|s| s.symbol_index == symbol_display.symbol)
.map(|s| &s.symbol_diff)
} else {
obj_diff.symbols.get(symbol_display.symbol)
};
let Some(symbol_diff) = symbol_diff else {
return DataDiffRow::default();
};
symbol_diff.data_rows.get(row_index as usize).map(DataDiffRow::from).unwrap_or_default()
}
fn data_hover(diff: ObjectDiffBorrow, symbol_ref: SymbolRef, row_index: u32) -> Vec<HoverItem> {
let obj_diff = diff.get::<ResourceObjectDiff>();
let obj = &obj_diff.0;
let obj_diff = &obj_diff.1;
let symbol_display = from_symbol_ref(symbol_ref);
let symbol_diff = if symbol_display.is_mapping_symbol {
obj_diff
.mapping_symbols
.iter()
.find(|s| s.symbol_index == symbol_display.symbol)
.map(|s| &s.symbol_diff)
} else {
obj_diff.symbols.get(symbol_display.symbol)
};
let Some(symbol_diff) = symbol_diff else {
return vec![];
};
let Some(diff_row) = symbol_diff.data_rows.get(row_index as usize) else {
return vec![];
};
diff::display::data_row_hover(obj, diff_row).into_iter().map(HoverItem::from).collect()
}
fn data_context(
diff: ObjectDiffBorrow,
symbol_ref: SymbolRef,
row_index: u32,
) -> Vec<ContextItem> {
let obj_diff = diff.get::<ResourceObjectDiff>();
let obj = &obj_diff.0;
let obj_diff = &obj_diff.1;
let symbol_display = from_symbol_ref(symbol_ref);
let symbol_diff = if symbol_display.is_mapping_symbol {
obj_diff
.mapping_symbols
.iter()
.find(|s| s.symbol_index == symbol_display.symbol)
.map(|s| &s.symbol_diff)
} else {
obj_diff.symbols.get(symbol_display.symbol)
};
let Some(symbol_diff) = symbol_diff else {
return vec![];
};
let Some(diff_row) = symbol_diff.data_rows.get(row_index as usize) else {
return vec![];
};
diff::display::data_row_context(obj, diff_row).into_iter().map(ContextItem::from).collect()
}
}
impl From<diff::DataDiffKind> for DataDiffKind {
fn from(kind: diff::DataDiffKind) -> Self {
match kind {
diff::DataDiffKind::None => DataDiffKind::None,
diff::DataDiffKind::Replace => DataDiffKind::Replace,
diff::DataDiffKind::Delete => DataDiffKind::Delete,
diff::DataDiffKind::Insert => DataDiffKind::Insert,
}
}
}
impl Default for DataDiffRow {
fn default() -> Self { Self { address: 0, segments: Vec::new(), relocations: Vec::new() } }
}
impl From<&diff::DataDiffRow> for DataDiffRow {
fn from(row: &diff::DataDiffRow) -> Self {
Self {
address: row.address,
segments: row.segments.iter().map(DataDiff::from).collect(),
relocations: row.relocations.iter().map(DataRelocationDiff::from).collect(),
}
}
}
impl From<&diff::DataDiff> for DataDiff {
fn from(diff: &diff::DataDiff) -> Self {
Self { data: diff.data.clone(), size: diff.size as u32, kind: diff.kind.into() }
}
}
impl From<&diff::DataRelocationDiff> for DataRelocationDiff {
fn from(diff: &diff::DataRelocationDiff) -> Self {
Self {
address: diff.reloc.address,
size: (diff.range.end - diff.range.start) as u32,
kind: diff.kind.into(),
}
}
}
impl From<obj::SymbolKind> for SymbolKind {
@@ -351,16 +469,17 @@ impl From<obj::SymbolFlagSet> for SymbolFlags {
fn from(flags: obj::SymbolFlagSet) -> SymbolFlags {
let mut out = SymbolFlags::empty();
for flag in flags {
out |= match flag {
obj::SymbolFlag::Global => SymbolFlags::GLOBAL,
obj::SymbolFlag::Local => SymbolFlags::LOCAL,
obj::SymbolFlag::Weak => SymbolFlags::WEAK,
obj::SymbolFlag::Common => SymbolFlags::COMMON,
obj::SymbolFlag::Hidden => SymbolFlags::HIDDEN,
obj::SymbolFlag::HasExtra => SymbolFlags::HAS_EXTRA,
obj::SymbolFlag::SizeInferred => SymbolFlags::SIZE_INFERRED,
obj::SymbolFlag::Ignored => SymbolFlags::IGNORED,
};
out = out
| match flag {
obj::SymbolFlag::Global => SymbolFlags::GLOBAL,
obj::SymbolFlag::Local => SymbolFlags::LOCAL,
obj::SymbolFlag::Weak => SymbolFlags::WEAK,
obj::SymbolFlag::Common => SymbolFlags::COMMON,
obj::SymbolFlag::Hidden => SymbolFlags::HIDDEN,
obj::SymbolFlag::HasExtra => SymbolFlags::HAS_EXTRA,
obj::SymbolFlag::SizeInferred => SymbolFlags::SIZE_INFERRED,
obj::SymbolFlag::Ignored => SymbolFlags::IGNORED,
};
}
out
}
@@ -469,8 +588,21 @@ unsafe impl Sync for ObjectCache {}
static OBJECT_CACHE: ObjectCache = ObjectCache::new();
impl From<DiffSide> for objdiff_core::diff::DiffSide {
fn from(value: DiffSide) -> Self {
match value {
DiffSide::Target => Self::Target,
DiffSide::Base => Self::Base,
}
}
}
impl GuestObject for ResourceObject {
fn parse(data: Vec<u8>, diff_config: DiffConfigBorrow) -> Result<Object, String> {
fn parse(
data: Vec<u8>,
diff_config: DiffConfigBorrow,
diff_side: DiffSide,
) -> Result<Object, String> {
let hash = xxh3_64(&data);
let mut cached = None;
OBJECT_CACHE.borrow_mut().retain(|c| {
@@ -486,7 +618,9 @@ impl GuestObject for ResourceObject {
return Ok(Object::new(ResourceObject(obj, hash)));
}
let diff_config = diff_config.get::<ResourceDiffConfig>().0.borrow();
let obj = Rc::new(obj::read::parse(&data, &diff_config).map_err(|e| e.to_string())?);
let obj = Rc::new(
obj::read::parse(&data, &diff_config, diff_side.into()).map_err(|e| e.to_string())?,
);
OBJECT_CACHE.borrow_mut().push(CachedObject(Rc::downgrade(&obj), hash));
Ok(Object::new(ResourceObject(obj, hash)))
}
@@ -507,6 +641,7 @@ impl GuestObjectDiff for ResourceObjectDiff {
}
})?;
let symbol = obj.symbols.get(symbol_idx)?;
let section = symbol.section.and_then(|s| obj.sections.get(s));
Some(SymbolInfo {
id: symbol_idx as SymbolRef,
name: symbol.name.clone(),
@@ -515,9 +650,8 @@ impl GuestObjectDiff for ResourceObjectDiff {
size: symbol.size,
kind: SymbolKind::from(symbol.kind),
section: symbol.section.map(|s| s as u32),
section_name: symbol
.section
.and_then(|s| obj.sections.get(s).map(|sec| sec.name.clone())),
section_name: section.map(|sec| sec.name.clone()),
section_kind: section.map_or(SectionKind::Unknown, |sec| sec.kind.into()),
flags: SymbolFlags::from(symbol.flags),
align: symbol.align.map(|a| a.get()),
virtual_address: symbol.virtual_address,
@@ -527,9 +661,8 @@ impl GuestObjectDiff for ResourceObjectDiff {
fn get_symbol(&self, symbol_ref: SymbolRef) -> Option<SymbolInfo> {
let obj = self.0.as_ref();
let symbol_display = from_symbol_ref(symbol_ref);
let Some(symbol) = obj.symbols.get(symbol_display.symbol) else {
return None;
};
let symbol = obj.symbols.get(symbol_display.symbol)?;
let section = symbol.section.and_then(|s| obj.sections.get(s));
Some(SymbolInfo {
id: to_symbol_ref(symbol_display),
name: symbol.name.clone(),
@@ -538,9 +671,8 @@ impl GuestObjectDiff for ResourceObjectDiff {
size: symbol.size,
kind: SymbolKind::from(symbol.kind),
section: symbol.section.map(|s| s as u32),
section_name: symbol
.section
.and_then(|s| obj.sections.get(s).map(|sec| sec.name.clone())),
section_name: section.map(|sec| sec.name.clone()),
section_kind: section.map_or(SectionKind::Unknown, |sec| sec.kind.into()),
flags: SymbolFlags::from(symbol.flags),
align: symbol.align.map(|a| a.get()),
virtual_address: symbol.virtual_address,
@@ -625,6 +757,7 @@ impl Default for SymbolInfo {
kind: Default::default(),
section: Default::default(),
section_name: Default::default(),
section_kind: Default::default(),
flags: Default::default(),
align: Default::default(),
virtual_address: Default::default(),
@@ -670,4 +803,20 @@ fn to_symbol_ref(display_symbol: diff::display::SectionDisplaySymbol) -> SymbolR
}
}
impl Default for SectionKind {
fn default() -> Self { Self::Unknown }
}
impl From<obj::SectionKind> for SectionKind {
fn from(kind: obj::SectionKind) -> Self {
match kind {
obj::SectionKind::Unknown => SectionKind::Unknown,
obj::SectionKind::Code => SectionKind::Code,
obj::SectionKind::Data => SectionKind::Data,
obj::SectionKind::Bss => SectionKind::Bss,
obj::SectionKind::Common => SectionKind::Common,
}
}
}
export!(Component);

View File

@@ -1,9 +1,7 @@
#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
#[cfg(target_os = "wasi")]
mod api;
#[cfg(target_os = "wasi")]
mod logging;
#[cfg(all(target_os = "wasi", not(feature = "std")))]

View File

@@ -19,6 +19,7 @@ interface diff {
parse: static func(
data: list<u8>,
config: borrow<diff-config>,
side: diff-side,
) -> result<object, string>;
hash: func() -> u64;
@@ -53,6 +54,7 @@ interface diff {
kind: symbol-kind,
section: option<u32>,
section-name: option<string>,
section-kind: section-kind,
%flags: symbol-flags,
align: option<u32>,
virtual-address: option<u64>,
@@ -80,6 +82,19 @@ interface diff {
config: borrow<diff-config>,
mapping: mapping-config,
) -> result<diff-result, string>;
enum diff-side {
target,
base,
}
enum section-kind {
unknown,
code,
data,
bss,
common,
}
}
interface display {
@@ -88,7 +103,8 @@ interface display {
object-diff,
diff-config,
symbol-info,
symbol-ref
symbol-ref,
section-kind
};
record display-config {
@@ -108,6 +124,7 @@ interface display {
size: u64,
match-percent: option<f32>,
symbols: list<symbol-ref>,
kind: section-kind,
}
record symbol-display {
@@ -232,6 +249,31 @@ interface display {
delete,
}
enum data-diff-kind {
none,
replace,
delete,
insert,
}
record data-diff {
data: list<u8>,
size: u32,
kind: data-diff-kind,
}
record data-relocation-diff {
address: u64,
size: u32,
kind: data-diff-kind,
}
record data-diff-row {
address: u64,
segments: list<data-diff>,
relocations: list<data-relocation-diff>,
}
display-sections: func(
diff: borrow<object-diff>,
filter: symbol-filter,
@@ -273,6 +315,24 @@ interface display {
row-index: u32,
config: borrow<diff-config>,
) -> list<hover-item>;
display-data-row: func(
diff: borrow<object-diff>,
symbol: symbol-ref,
row-index: u32,
) -> data-diff-row;
data-context: func(
diff: borrow<object-diff>,
symbol: symbol-ref,
row-index: u32,
) -> list<context-item>;
data-hover: func(
diff: borrow<object-diff>,
symbol: symbol-ref,
row-index: u32,
) -> list<hover-item>;
}
world api {