From ce0d1e17053f03878ffa2d6259cd2c48e5a816ae Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 7 Jan 2026 22:53:35 -0500 Subject: [PATCH 1/7] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 1d4c699..d5e7a06 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,14 @@ ## Description A MIPS64 (PS2 Emotion Engine) assembler / disassembler with extended pseudo-commands and directives for custom CDS scripts. Used to create custom patches for the playstation 2. Make sure to use github co-pilot with this vs code extension. +## Future plans in development +1. vscode disassembler windows that reflect pcsx2dis +2. pcsx2 integration +3. cheat engine +4. more pseudo syntax +5. better integration with github co pilot / custom LLM / code generation / code auto finder +6. Support other consoles / emulators + ## Projects and READMEs - CLI & tooling - [CodeDesigner.ConsoleApp](CodeDesigner.ConsoleApp/ReadMe.md) — Console front-end / CLI From bb9cd0a843f65263970e24db5cfd88eda6026129 Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 7 Jan 2026 22:55:48 -0500 Subject: [PATCH 2/7] Update README.md --- README.md | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d5e7a06..bf095af 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,28 @@ ## Description A MIPS64 (PS2 Emotion Engine) assembler / disassembler with extended pseudo-commands and directives for custom CDS scripts. Used to create custom patches for the playstation 2. Make sure to use github co-pilot with this vs code extension. -## Future plans in development -1. vscode disassembler windows that reflect pcsx2dis -2. pcsx2 integration -3. cheat engine -4. more pseudo syntax -5. better integration with github co pilot / custom LLM / code generation / code auto finder -6. Support other consoles / emulators +## Planned Enhancements / Future Work + +- **VS Code Disassembler Views** + - Add disassembler-style windows that mirror *PCSX2Dis*, including address, opcode bytes, labels, operations, and annotations. + +- **PCSX2 Integration** + - Native integration with PCSX2 for live memory inspection, breakpoint-style workflows, and runtime code injection. + +- **Cheat Engine Integration** + - Optional interoperability with Cheat Engine for scanning, validation, and memory manipulation workflows. + +- **Expanded Pseudo Syntax** + - Introduce richer, higher-level pseudo-instructions to simplify common patterns and improve readability. + +- **AI / Code Generation Integration** + - Deeper integration with GitHub Copilot and/or a custom LLM for: + - Code generation + - Pattern recognition + - Automatic code discovery and suggestion + +- **Multi-Platform Emulator Support** + - Extend support beyond PCSX2 to additional consoles and emulators as the architecture matures. ## Projects and READMEs - CLI & tooling From cd71362d5787b99e895c3a5ca05c9b3f8b9baf67 Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 7 Jan 2026 23:01:35 -0500 Subject: [PATCH 3/7] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bf095af..d29cd2e 100644 --- a/README.md +++ b/README.md @@ -59,3 +59,7 @@ Each project README contains sections marked with the letters above when applica - Add changelogs or release notes where appropriate. - Prefer small, focused PRs and include test or verification steps in the PR description. +## Branching Strategy + - Define and document a clear Git branching model (e.g., `main`, `dev`, `feature`, `bug`) + - Establish pull request requirements, review expectations, and CI validation rules + From 2cf47bc45335e4ff3494b3bc0552bf0ec6c2f475 Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 7 Jan 2026 23:04:55 -0500 Subject: [PATCH 4/7] Update README.md --- README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/README.md b/README.md index d29cd2e..6b6b908 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,55 @@ ## Description A MIPS64 (PS2 Emotion Engine) assembler / disassembler with extended pseudo-commands and directives for custom CDS scripts. Used to create custom patches for the playstation 2. Make sure to use github co-pilot with this vs code extension. +## Example CDS script +```asm +/* +This is a test cds script +*/ +address $20694d48 +hexcode $00010000 + +address $20c49788 +hexcode $ffffffff + +address $200c0000 +print "this is a string" +nop +___OnRoomExit: +addiu sp, sp, $FFd0 +sw ra, $0000(sp) +sw s0, $0004(sp) +sw s1, $0008(sp) +sw at, $000C(sp) + +setreg at, $002CED04 +setreg s1, $03e00008 +sw s1, $0000(at) + +setreg at, $000A0000 +sw zero, $0000(at) +sw zero, $0004(at) +sw zero, $0008(at) + +// load pointer +lui s0, $0044 +lw s0, $0c38(s0) +beq s0, zero, :EndOnRoomExit +nop +lw s1, $0010(at) +sw s1, $0014(s0) +lw s1, $000C(at) +sw s1, $0028(s0) + +EndOnRoomExit: +lw ra, $0000(sp) +lw s0, $0004(sp) +lw s1, $0008(sp) +lw at, $000C(sp) +j $00204438 +addiu sp sp, $0030 +``` + ## Planned Enhancements / Future Work - **VS Code Disassembler Views** From d8367c7b12cc20319c46d45d1803db3e64fe6fe0 Mon Sep 17 00:00:00 2001 From: Tyler Date: Thu, 8 Jan 2026 01:44:30 -0500 Subject: [PATCH 5/7] Update package.json --- vscode/cds-assembler/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vscode/cds-assembler/package.json b/vscode/cds-assembler/package.json index c362a76..cb11171 100644 --- a/vscode/cds-assembler/package.json +++ b/vscode/cds-assembler/package.json @@ -3,7 +3,7 @@ "displayName": "CDS Assembler", "description": "CDS Assembler sidebar panel with custom commands", "version": "0.0.1", - "publisher": "antix-fatality", + "publisher": "tylerdev888", "engines": { "vscode": "^1.107.0" }, From f5bad081c56cdc98a44a6d47cea35c15cd6ec32d Mon Sep 17 00:00:00 2001 From: TylerDev888 Date: Thu, 8 Jan 2026 07:01:32 -0500 Subject: [PATCH 6/7] Added a disassembler window when opening a .bin file --- vscode/cds-assembler/package-lock.json | 2 +- vscode/cds-assembler/src/extension.ts | 9 + vscode/cds-assembler/tsconfig.json | 4 +- vscode/cds-dis/cds-dis/.vscode-test.mjs | 5 + .../cds-dis/cds-dis/.vscode/extensions.json | 8 + vscode/cds-dis/cds-dis/.vscode/launch.json | 21 + vscode/cds-dis/cds-dis/.vscode/settings.json | 11 + vscode/cds-dis/cds-dis/.vscode/tasks.json | 20 + vscode/cds-dis/cds-dis/.vscodeignore | 11 + vscode/cds-dis/cds-dis/CHANGELOG.md | 9 + vscode/cds-dis/cds-dis/README.md | 71 + vscode/cds-dis/cds-dis/eslint.config.mjs | 27 + .../cds-dis/language-configuration.json | 8 + vscode/cds-dis/cds-dis/out/extension.js | 162 ++ vscode/cds-dis/cds-dis/out/extension.js.map | 1 + vscode/cds-dis/cds-dis/package-lock.json | 483 +++++ vscode/cds-dis/cds-dis/package.json | 52 + vscode/cds-dis/cds-dis/src/extension.ts | 147 ++ vscode/cds-dis/cds-dis/tsconfig.json | 17 + .../cds-dis/vsc-extension-quickstart.md | 44 + vscode/cds-dis/package-lock.json | 1873 +++++++++++++++++ vscode/cds-dis/package.json | 5 + vscode/cds-language/cds-language.esproj | 2 +- 23 files changed, 2989 insertions(+), 3 deletions(-) create mode 100644 vscode/cds-dis/cds-dis/.vscode-test.mjs create mode 100644 vscode/cds-dis/cds-dis/.vscode/extensions.json create mode 100644 vscode/cds-dis/cds-dis/.vscode/launch.json create mode 100644 vscode/cds-dis/cds-dis/.vscode/settings.json create mode 100644 vscode/cds-dis/cds-dis/.vscode/tasks.json create mode 100644 vscode/cds-dis/cds-dis/.vscodeignore create mode 100644 vscode/cds-dis/cds-dis/CHANGELOG.md create mode 100644 vscode/cds-dis/cds-dis/README.md create mode 100644 vscode/cds-dis/cds-dis/eslint.config.mjs create mode 100644 vscode/cds-dis/cds-dis/language-configuration.json create mode 100644 vscode/cds-dis/cds-dis/out/extension.js create mode 100644 vscode/cds-dis/cds-dis/out/extension.js.map create mode 100644 vscode/cds-dis/cds-dis/package-lock.json create mode 100644 vscode/cds-dis/cds-dis/package.json create mode 100644 vscode/cds-dis/cds-dis/src/extension.ts create mode 100644 vscode/cds-dis/cds-dis/tsconfig.json create mode 100644 vscode/cds-dis/cds-dis/vsc-extension-quickstart.md create mode 100644 vscode/cds-dis/package-lock.json create mode 100644 vscode/cds-dis/package.json diff --git a/vscode/cds-assembler/package-lock.json b/vscode/cds-assembler/package-lock.json index d4f1864..7816c07 100644 --- a/vscode/cds-assembler/package-lock.json +++ b/vscode/cds-assembler/package-lock.json @@ -14,7 +14,7 @@ "typescript": "^5.1.3" }, "engines": { - "vscode": "^1.70.0" + "vscode": "^1.107.0" } }, "node_modules/@types/node": { diff --git a/vscode/cds-assembler/src/extension.ts b/vscode/cds-assembler/src/extension.ts index dd2e6a2..3c05280 100644 --- a/vscode/cds-assembler/src/extension.ts +++ b/vscode/cds-assembler/src/extension.ts @@ -55,6 +55,14 @@ class CDSAssemblerPanelProvider implements vscode.WebviewViewProvider { }); } + private getWorkspaceRoot(): string | null { + const folders = vscode.workspace.workspaceFolders; + if (!folders || folders.length === 0) { + return null; + } + return folders[0].uri.fsPath; + } + private runCds(option: string) { const editor = vscode.window.activeTextEditor; @@ -73,6 +81,7 @@ class CDSAssemblerPanelProvider implements vscode.WebviewViewProvider { outputChannel.clear(); outputChannel.show(true); outputChannel.appendLine(`> ${command}\n`); + //outputChannel.appendLine(this.getWorkspaceRoot() ?? 'No workspace root'); exec(command, (error, stdout, stderr) => { diff --git a/vscode/cds-assembler/tsconfig.json b/vscode/cds-assembler/tsconfig.json index 6c9a9b5..ab7159e 100644 --- a/vscode/cds-assembler/tsconfig.json +++ b/vscode/cds-assembler/tsconfig.json @@ -6,7 +6,9 @@ "lib": ["ES2020"], "sourceMap": true, "rootDir": "src", - "strict": true + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true }, "exclude": ["node_modules", ".vscode-test"] } diff --git a/vscode/cds-dis/cds-dis/.vscode-test.mjs b/vscode/cds-dis/cds-dis/.vscode-test.mjs new file mode 100644 index 0000000..b62ba25 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode-test.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from '@vscode/test-cli'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', +}); diff --git a/vscode/cds-dis/cds-dis/.vscode/extensions.json b/vscode/cds-dis/cds-dis/.vscode/extensions.json new file mode 100644 index 0000000..186459d --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "dbaeumer.vscode-eslint", + "ms-vscode.extension-test-runner" + ] +} diff --git a/vscode/cds-dis/cds-dis/.vscode/launch.json b/vscode/cds-dis/cds-dis/.vscode/launch.json new file mode 100644 index 0000000..8880465 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/launch.json @@ -0,0 +1,21 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/vscode/cds-dis/cds-dis/.vscode/settings.json b/vscode/cds-dis/cds-dis/.vscode/settings.json new file mode 100644 index 0000000..afdab66 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/settings.json @@ -0,0 +1,11 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false // set this to true to hide the "out" folder with the compiled JS files + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} diff --git a/vscode/cds-dis/cds-dis/.vscode/tasks.json b/vscode/cds-dis/cds-dis/.vscode/tasks.json new file mode 100644 index 0000000..3b17e53 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/tasks.json @@ -0,0 +1,20 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/vscode/cds-dis/cds-dis/.vscodeignore b/vscode/cds-dis/cds-dis/.vscodeignore new file mode 100644 index 0000000..7d3e5c7 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscodeignore @@ -0,0 +1,11 @@ +.vscode/** +.vscode-test/** +src/** +.gitignore +.yarnrc +vsc-extension-quickstart.md +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/vscode/cds-dis/cds-dis/CHANGELOG.md b/vscode/cds-dis/cds-dis/CHANGELOG.md new file mode 100644 index 0000000..4153e0b --- /dev/null +++ b/vscode/cds-dis/cds-dis/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "cds-dis" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/README.md b/vscode/cds-dis/cds-dis/README.md new file mode 100644 index 0000000..58afdb0 --- /dev/null +++ b/vscode/cds-dis/cds-dis/README.md @@ -0,0 +1,71 @@ +# cds-dis README + +This is the README for your extension "cds-dis". After writing up a brief description, we recommend including the following sections. + +## Features + +Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. + +For example if there is an image subfolder under your extension project workspace: + +\!\[feature X\]\(images/feature-x.png\) + +> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. + +## Requirements + +If you have any requirements or dependencies, add a section describing those and how to install and configure them. + +## Extension Settings + +Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. + +For example: + +This extension contributes the following settings: + +* `myExtension.enable`: Enable/disable this extension. +* `myExtension.thing`: Set to `blah` to do something. + +## Known Issues + +Calling out known issues can help limit users opening duplicate issues against your extension. + +## Release Notes + +Users appreciate release notes as you update your extension. + +### 1.0.0 + +Initial release of ... + +### 1.0.1 + +Fixed issue #. + +### 1.1.0 + +Added features X, Y, and Z. + +--- + +## Following extension guidelines + +Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension. + +* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines) + +## Working with Markdown + +You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: + +* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). +* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). +* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. + +## For more information + +* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) +* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) + +**Enjoy!** diff --git a/vscode/cds-dis/cds-dis/eslint.config.mjs b/vscode/cds-dis/cds-dis/eslint.config.mjs new file mode 100644 index 0000000..7c51b0c --- /dev/null +++ b/vscode/cds-dis/cds-dis/eslint.config.mjs @@ -0,0 +1,27 @@ +import typescriptEslint from "typescript-eslint"; + +export default [{ + files: ["**/*.ts"], +}, { + plugins: { + "@typescript-eslint": typescriptEslint.plugin, + }, + + languageOptions: { + parser: typescriptEslint.parser, + ecmaVersion: 2022, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/naming-convention": ["warn", { + selector: "import", + format: ["camelCase", "PascalCase"], + }], + + curly: "warn", + eqeqeq: "warn", + "no-throw-literal": "warn", + semi: "warn", + }, +}]; \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/language-configuration.json b/vscode/cds-dis/cds-dis/language-configuration.json new file mode 100644 index 0000000..b9f454d --- /dev/null +++ b/vscode/cds-dis/cds-dis/language-configuration.json @@ -0,0 +1,8 @@ +{ + "comments": { + "lineComment": ";" + }, + "brackets": [], + "autoClosingPairs": [], + "surroundingPairs": [] +} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/extension.js b/vscode/cds-dis/cds-dis/out/extension.js new file mode 100644 index 0000000..104d1a8 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/extension.js @@ -0,0 +1,162 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.activate = activate; +exports.deactivate = deactivate; +const vscode = __importStar(require("vscode")); +const fs = __importStar(require("fs")); +function activate(context) { + context.subscriptions.push(vscode.window.registerCustomEditorProvider("cdsDisasm.binEditor", new BinEditorProvider(), { webviewOptions: { retainContextWhenHidden: true } })); +} +class BinEditorProvider { + async openCustomDocument(uri) { + return { uri, dispose() { } }; + } + async resolveCustomEditor(document, webviewPanel) { + webviewPanel.webview.options = { enableScripts: true }; + // Set a loading placeholder immediately + webviewPanel.webview.html = this.getHtml(); + // Async read binary + fs.readFile(document.uri.fsPath, (err, data) => { + if (err) { + webviewPanel.webview.postMessage({ type: "error", message: err.message }); + return; + } + const rows = disassemble(data); + webviewPanel.webview.postMessage({ type: "disasm", rows }); + }); + } + getHtml() { + const nonce = getNonce(); + return ` + + + + + + +
Loading BIN...
+ + + + +`; + } +} +/* ---------------- DISASSEMBLY ---------------- */ +function disassemble(buffer) { + const rows = []; + let addr = 0x00370F6C; + for (let i = 0; i < buffer.length; i += 4) { + const bytes = buffer.slice(i, i + 4); + if (bytes.length < 4) + break; + // Little-endian + const bytesLE = Array.from(bytes).reverse().map(b => b.toString(16).padStart(2, "0")).join(" "); + rows.push({ + addr: addr.toString(16).toUpperCase().padStart(8, "0"), + bytes: bytesLE, + label: i === 0 ? "FUNC_" + addr.toString(16).toUpperCase() : "", + op: "nop", + args: "", + comment: "" + }); + addr += 4; + } + return rows; +} +function getNonce() { + let text = ""; + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) + text += chars.charAt(Math.floor(Math.random() * chars.length)); + return text; +} +function deactivate() { } +//# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/extension.js.map b/vscode/cds-dis/cds-dis/out/extension.js.map new file mode 100644 index 0000000..1a30dbe --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/extension.js.map @@ -0,0 +1 @@ +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/package-lock.json b/vscode/cds-dis/cds-dis/package-lock.json new file mode 100644 index 0000000..2c59eae --- /dev/null +++ b/vscode/cds-dis/cds-dis/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "cds-dis", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cds-dis", + "version": "0.0.1", + "devDependencies": { + "@types/node": "^20.3.1", + "@types/vscode": "^1.107.0", + "@vscode/test-electron": "^2.3.0", + "typescript": "^5.1.3" + }, + "engines": { + "vscode": "^1.107.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.107.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.107.0.tgz", + "integrity": "sha512-XS8YE1jlyTIowP64+HoN30OlC1H9xqSlq1eoLZUgFEC8oUTO6euYZxti1xRiLSfZocs4qytTzR6xCBYtioQTCg==", + "dev": true + }, + "node_modules/@vscode/test-electron": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + } + } +} diff --git a/vscode/cds-dis/cds-dis/package.json b/vscode/cds-dis/cds-dis/package.json new file mode 100644 index 0000000..774b5e8 --- /dev/null +++ b/vscode/cds-dis/cds-dis/package.json @@ -0,0 +1,52 @@ +{ + "name": "cds-dis", + "displayName": "CDS Disassembler", + "description": "PS2 MIPS Disassembler", + "version": "0.0.1", + "engines": { + "vscode": "^1.107.0" + }, + "categories": ["Other"], + "activationEvents": [ + "onCustomEditor:cdsDisasm.binEditor", + "onView:cdsDisasm.panel" + ], + "main": "./out/extension.js", + "contributes": { + "viewsContainers": { + "activitybar": [ + { + "id": "cdsDisasm", + "title": "CDS Disasm", + "icon": "resources/disasm-icon.svg" + } + ] + }, + "views": { + "cdsDisasm": [ + { + "id": "cdsDisasm.panel", + "name": "Disassembler" + } + ] + }, + "customEditors": [ + { + "viewType": "cdsDisasm.binEditor", + "displayName": "CDS Disassembler", + "selector": [ + { "filenamePattern": "*.bin" } + ], + "priority": "default" + } + ] + }, + "scripts": { + "compile": "tsc -p ./" + }, + "devDependencies": { + "@types/node": "^20.3.1", + "@types/vscode": "^1.107.0", + "typescript": "^5.1.3" + } +} diff --git a/vscode/cds-dis/cds-dis/src/extension.ts b/vscode/cds-dis/cds-dis/src/extension.ts new file mode 100644 index 0000000..f0f69e5 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/extension.ts @@ -0,0 +1,147 @@ +import * as vscode from "vscode"; +import * as fs from "fs"; + +export function activate(context: vscode.ExtensionContext) { + + context.subscriptions.push( + vscode.window.registerCustomEditorProvider( + "cdsDisasm.binEditor", + new BinEditorProvider(), + { webviewOptions: { retainContextWhenHidden: true } } + ) + ); +} + +class BinEditorProvider implements vscode.CustomReadonlyEditorProvider { + + async openCustomDocument(uri: vscode.Uri): Promise { + return { uri, dispose() {} }; + } + + async resolveCustomEditor( + document: vscode.CustomDocument, + webviewPanel: vscode.WebviewPanel + ): Promise { + + webviewPanel.webview.options = { enableScripts: true }; + + // Set a loading placeholder immediately + webviewPanel.webview.html = this.getHtml(); + + // Async read binary + fs.readFile(document.uri.fsPath, (err, data) => { + if (err) { + webviewPanel.webview.postMessage({ type: "error", message: err.message }); + return; + } + + const rows = disassemble(data); + webviewPanel.webview.postMessage({ type: "disasm", rows }); + }); + } + + private getHtml(): string { + const nonce = getNonce(); + return ` + + + + + + +
Loading BIN...
+ + + + +`; + } +} + +/* ---------------- DISASSEMBLY ---------------- */ +function disassemble(buffer: Buffer) { + const rows: any[] = []; + let addr = 0x00370F6C; + for (let i = 0; i < buffer.length; i += 4) { + const bytes = buffer.slice(i, i + 4); + if (bytes.length < 4) break; + + // Little-endian + const bytesLE = Array.from(bytes).reverse().map(b => b.toString(16).padStart(2,"0")).join(" "); + + rows.push({ + addr: addr.toString(16).toUpperCase().padStart(8,"0"), + bytes: bytesLE, + label: i === 0 ? "FUNC_" + addr.toString(16).toUpperCase() : "", + op: "nop", + args: "", + comment: "" + }); + + addr += 4; + } + return rows; +} + +function getNonce(): string { + let text = ""; + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i=0;i<32;i++) text += chars.charAt(Math.floor(Math.random()*chars.length)); + return text; +} + +export function deactivate() {} diff --git a/vscode/cds-dis/cds-dis/tsconfig.json b/vscode/cds-dis/cds-dis/tsconfig.json new file mode 100644 index 0000000..356580f --- /dev/null +++ b/vscode/cds-dis/cds-dis/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "Node16", + "target": "ES2022", + "outDir": "out", + "lib": [ + "ES2022" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true, /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + } +} diff --git a/vscode/cds-dis/cds-dis/vsc-extension-quickstart.md b/vscode/cds-dis/cds-dis/vsc-extension-quickstart.md new file mode 100644 index 0000000..c912064 --- /dev/null +++ b/vscode/cds-dis/cds-dis/vsc-extension-quickstart.md @@ -0,0 +1,44 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your extension and command. + * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. +* `src/extension.ts` - this is the main file where you will provide the implementation of your command. + * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. + * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. + +## Get up and running straight away + +* Press `F5` to open a new window with your extension loaded. +* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. +* Set breakpoints in your code inside `src/extension.ts` to debug your extension. +* Find output from your extension in the debug console. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Install the [Extension Test Runner](https://marketplace.visualstudio.com/items?itemName=ms-vscode.extension-test-runner) +* Run the "watch" task via the **Tasks: Run Task** command. Make sure this is running, or tests might not be discovered. +* Open the Testing view from the activity bar and click the Run Test" button, or use the hotkey `Ctrl/Cmd + ; A` +* See the output of the test result in the Test Results view. +* Make changes to `src/test/extension.test.ts` or create new test files inside the `test` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + +* [Follow UX guidelines](https://code.visualstudio.com/api/ux-guidelines/overview) to create extensions that seamlessly integrate with VS Code's native interface and patterns. +* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). +* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. +* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). +* Integrate to the [report issue](https://code.visualstudio.com/api/get-started/wrapping-up#issue-reporting) flow to get issue and feature requests reported by users. diff --git a/vscode/cds-dis/package-lock.json b/vscode/cds-dis/package-lock.json new file mode 100644 index 0000000..0b02c47 --- /dev/null +++ b/vscode/cds-dis/package-lock.json @@ -0,0 +1,1873 @@ +{ + "name": "cds-dis", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "generator-code": "^1.11.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", + "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "dependencies": { + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/request": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", + "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", + "dependencies": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "dependencies": { + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==" + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "peer": true + }, + "node_modules/@types/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "peer": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@yeoman/namespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@yeoman/namespace/-/namespace-1.0.1.tgz", + "integrity": "sha512-XGdYL0HCoPvrzW7T8bxD6RbCY/B8uvR2jpOzJc/yEwTueKHwoVhjSLjVXkokQAO0LNl8nQFLVZ1aKfr2eFWZeA==", + "engines": { + "node": "^16.13.0 || >=18.12.0" + } + }, + "node_modules/@yeoman/types": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.9.1.tgz", + "integrity": "sha512-5BMdA/zMzLv/ahnL1ktaV46nSXorb4sU4kQPQKDhIcK8ERbx9TAbGAE+XAlCXKioNIiOrihYj6gW1d/GEfU9Zw==", + "peer": true, + "engines": { + "node": "^16.13.0 || >=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=16.18.26", + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1", + "mem-fs-editor": "^10.0.2 || >=10.0.2" + }, + "peerDependenciesMeta": { + "@yeoman/adapter": { + "optional": true + }, + "mem-fs": { + "optional": true + }, + "mem-fs-editor": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-differ": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + }, + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", + "dependencies": { + "version-range": "^4.15.0" + }, + "engines": { + "ecmascript": ">= es5", + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-plist": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.3.tgz", + "integrity": "sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A==" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/first-chunk-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", + "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/generator-code": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/generator-code/-/generator-code-1.11.15.tgz", + "integrity": "sha512-ZIQ9EGMDcg5RzIJr4V/9tfREWXgmokwjksIlCGVBxksKEhMQ5eoq/21xU9u5nbyn9JLc8wxizWvtWP0/5oQnFA==", + "dependencies": { + "chalk": "^5.6.2", + "fast-plist": "^0.1.3", + "request-light": "^0.8.0", + "which": "^6.0.0", + "yeoman-generator": "^7.5.1", + "yosay": "^3.0.0" + }, + "engines": { + "node": ">=20.5.0" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-username": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-9.0.0.tgz", + "integrity": "sha512-lY7+mymwQUEhRwWTLxieKkxcZkVNnUh8iAGnl30DMB1ZtYODHkMAckZk8Jx5dLQs1YKPYM2ibnzQu02aCLFcYQ==", + "dependencies": { + "@octokit/rest": "^21.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.3.tgz", + "integrity": "sha512-VR4gNjFaDP8csJQvzInG20JvBj8MaHYLxNOMXysxRbGM7tcsHZwCjhch3FubFtZBkuDbN55i4dUukGeIrzF+6g==", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/ky": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.2.tgz", + "integrity": "sha512-q3RBbsO5A5zrPhB6CaCS8ZUv+NWCXv6JJT4Em0i264G9W0fdPB8YRfnnEi7Dm7X7omAkBIPojzYJ2D1oHTHqug==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/latest-version": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", + "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", + "dependencies": { + "package-json": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/mem-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.2.tgz", + "integrity": "sha512-CMwusHK+Kz0tu1qjgbd0rwcJxzgg76jlkPpqK+pDTv8Hth8JyM7JlgxNWaAFRKe969HATPTz/sp8T63QflyI+w==", + "peer": true, + "dependencies": { + "@types/node": ">=18", + "@types/vinyl": "^2.0.8", + "vinyl": "^3.0.0", + "vinyl-file": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/mem-fs-editor": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-11.1.4.tgz", + "integrity": "sha512-Z4QX14Ev6eOVTuVSayS5rdiOua6C3gHcFw+n9Qc7WiaVTbC+H8b99c32MYGmbQN9UFHJeI/p3lf3LAxiIzwEmA==", + "dependencies": { + "@types/ejs": "^3.1.4", + "@types/node": ">=18", + "binaryextensions": "^6.11.0", + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.1.10", + "globby": "^14.0.2", + "isbinaryfile": "5.0.3", + "minimatch": "^9.0.3", + "multimatch": "^7.0.0", + "normalize-path": "^3.0.0", + "textextensions": "^6.11.0", + "vinyl": "^3.0.0" + }, + "acceptDependencies": { + "isbinaryfile": "^5.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "mem-fs": "^4.0.0" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multimatch": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-7.0.0.tgz", + "integrity": "sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==", + "dependencies": { + "array-differ": "^4.0.0", + "array-union": "^3.0.1", + "minimatch": "^9.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", + "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", + "dependencies": { + "ky": "^1.2.0", + "registry-auth-token": "^5.0.2", + "registry-url": "^6.0.1", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pad-component": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pad-component/-/pad-component-0.0.1.tgz", + "integrity": "sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==" + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/request-light": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.8.0.tgz", + "integrity": "sha512-bH6E4PMmsEXYrLX6Kr1vu+xI3HproB1vECAwaPSJeroLE1kpWE3HR27uB4icx+6YORu1ajqBJXxuedv8ZQg5Lw==" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-git": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-keys": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.1.0.tgz", + "integrity": "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom-buf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", + "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", + "peer": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-bom-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", + "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", + "peer": true, + "dependencies": { + "first-chunk-stream": "^5.0.0", + "strip-bom-buf": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/vinyl": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "dependencies": { + "clone": "^2.1.2", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", + "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", + "peer": true, + "dependencies": { + "@types/vinyl": "^2.0.7", + "strip-bom-buf": "^3.0.1", + "strip-bom-stream": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-generator": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-7.5.1.tgz", + "integrity": "sha512-MYncRvzSTd71BMwiUMAVhfX00sDD8DZDrmPzRxQkWuWQ0V1Qt4Rd0gS/Nee2QDTWvRjvCa+KBfiAVrtOySq+JA==", + "dependencies": { + "@types/lodash-es": "^4.17.9", + "@yeoman/namespace": "^1.0.0", + "chalk": "^5.3.0", + "debug": "^4.1.1", + "execa": "^8.0.1", + "github-username": "^9.0.0", + "json-schema": "^0.4.0", + "latest-version": "^9.0.0", + "lodash-es": "^4.17.21", + "mem-fs-editor": "^11.0.1", + "minimist": "^1.2.8", + "read-package-up": "^11.0.0", + "semver": "^7.5.4", + "simple-git": "^3.20.0", + "sort-keys": "^5.0.0", + "text-table": "^0.2.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "peerDependencies": { + "@types/node": ">=18.18.5", + "@yeoman/types": "^1.1.1", + "mem-fs": "^4.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/yosay": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/yosay/-/yosay-3.0.0.tgz", + "integrity": "sha512-ydCeqln4hPSPMA1ggS0ZsUnrXxDaatbmtigxF+4R2h/y2USVTaOIIZFPXANeq7tkmHo2bLEK8eal2wmrFMiwYA==", + "dependencies": { + "ansi-regex": "^6.0.1", + "ansi-styles": "^6.2.1", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "meow": "^12.1.1", + "pad-component": "0.0.1", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^8.1.0" + }, + "bin": { + "yosay": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/vscode/cds-dis/package.json b/vscode/cds-dis/package.json new file mode 100644 index 0000000..7f1a1a6 --- /dev/null +++ b/vscode/cds-dis/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "generator-code": "^1.11.15" + } +} diff --git a/vscode/cds-language/cds-language.esproj b/vscode/cds-language/cds-language.esproj index 2fbe60b..4a7406c 100644 --- a/vscode/cds-language/cds-language.esproj +++ b/vscode/cds-language/cds-language.esproj @@ -1,6 +1,6 @@ - npm start + npm compile Jasmine false From 9291a9727bd5b6dea6ff9ce30b4024dcc998f8fb Mon Sep 17 00:00:00 2001 From: TylerDev888 Date: Sat, 10 Jan 2026 04:55:23 -0500 Subject: [PATCH 7/7] Added a Disassembler extension --- README.md | 6 + Screenshot_2.png | Bin 0 -> 144088 bytes Screenshot_3.png | Bin 0 -> 133307 bytes Screenshot_4.png | Bin 0 -> 131417 bytes .../out/BaseProviders/BaseEditorProvider.js | 71 + .../BaseProviders/BaseEditorProvider.js.map | 1 + .../out/BaseProviders/BasePanelProvider.js | 83 + .../BaseProviders/BasePanelProvider.js.map | 1 + .../DisasmEditor/DisasmEditorProvider.html | 1154 ++++++++++ .../out/DisasmEditor/DisasmEditorProvider.js | 62 + .../DisasmEditor/DisasmEditorProvider.js.map | 1 + .../out/DisasmPanel/DisasmPanelProvider.html | 14 + .../out/DisasmPanel/DisasmPanelProvider.js | 53 + .../DisasmPanel/DisasmPanelProvider.js.map | 1 + vscode/cds-dis/cds-dis/out/analyzer.js | 903 ++++++++ vscode/cds-dis/cds-dis/out/analyzer.js.map | 1 + .../out/baseProvider/BaseEditorProvider.js | 71 + .../baseProvider/BaseEditorProvider.js.map | 1 + .../out/baseProvider/BasePanelProvider.js | 83 + .../out/baseProvider/BasePanelProvider.js.map | 1 + vscode/cds-dis/cds-dis/out/extension.js | 130 +- vscode/cds-dis/cds-dis/out/extension.js.map | 2 +- vscode/cds-dis/cds-dis/out/helpers.js | 1816 +++++++++++++++ vscode/cds-dis/cds-dis/out/helpers.js.map | 1 + .../BaseProvider/BaseEditorProvider.js | 71 + .../BaseProvider/BaseEditorProvider.js.map | 1 + .../BaseProvider/BasePanelProvider.js | 83 + .../BaseProvider/BasePanelProvider.js.map | 1 + .../DisasmEditor/DisasmEditorProvider.js | 274 +++ .../DisasmEditor/DisasmEditorProvider.js.map | 1 + .../DisasmPanel/DisasmPanelProvider.js | 53 + .../DisasmPanel/DisasmPanelProvider.js.map | 1 + vscode/cds-dis/cds-dis/package.json | 67 +- vscode/cds-dis/cds-dis/scripts/copy-html.js | 27 + vscode/cds-dis/cds-dis/src/extension.ts | 169 +- vscode/cds-dis/cds-dis/src/helpers.ts | 1956 +++++++++++++++++ .../BaseProvider/BaseEditorProvider.ts | 45 + .../BaseProvider/BasePanelProvider.ts | 53 + .../DisasmEditor/DisasmEditorProvider.html | 1154 ++++++++++ .../DisasmEditor/DisasmEditorProvider.ts | 331 +++ .../src/providers/DisasmEditor/Search.md | 394 ++++ .../DisasmPanel/DisasmPanelProvider.html | 14 + .../DisasmPanel/DisasmPanelProvider.ts | 17 + .../cds-dis/src/resources/cds-icon.svg | 4 + 44 files changed, 8885 insertions(+), 287 deletions(-) create mode 100644 Screenshot_2.png create mode 100644 Screenshot_3.png create mode 100644 Screenshot_4.png create mode 100644 vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/BaseProviders/BasePanelProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/BaseProviders/BasePanelProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.html create mode 100644 vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html create mode 100644 vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/analyzer.js create mode 100644 vscode/cds-dis/cds-dis/out/analyzer.js.map create mode 100644 vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/baseProvider/BasePanelProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/baseProvider/BasePanelProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/helpers.js create mode 100644 vscode/cds-dis/cds-dis/out/helpers.js.map create mode 100644 vscode/cds-dis/cds-dis/out/providers/BaseProvider/BaseEditorProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/providers/BaseProvider/BaseEditorProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/providers/BaseProvider/BasePanelProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/providers/BaseProvider/BasePanelProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/providers/DisasmEditor/DisasmEditorProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/providers/DisasmEditor/DisasmEditorProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/out/providers/DisasmPanel/DisasmPanelProvider.js create mode 100644 vscode/cds-dis/cds-dis/out/providers/DisasmPanel/DisasmPanelProvider.js.map create mode 100644 vscode/cds-dis/cds-dis/scripts/copy-html.js create mode 100644 vscode/cds-dis/cds-dis/src/helpers.ts create mode 100644 vscode/cds-dis/cds-dis/src/providers/BaseProvider/BaseEditorProvider.ts create mode 100644 vscode/cds-dis/cds-dis/src/providers/BaseProvider/BasePanelProvider.ts create mode 100644 vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.html create mode 100644 vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts create mode 100644 vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md create mode 100644 vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html create mode 100644 vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts create mode 100644 vscode/cds-dis/cds-dis/src/resources/cds-icon.svg diff --git a/README.md b/README.md index 6b6b908..3421cac 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ # CodeDesignerAI VSCode [![CI](https://github.com/TylerDev888/CodeDesignerAI/actions/workflows/ci.yml/badge.svg)](https://github.com/TylerDev888/CodeDesignerAI/actions/workflows/ci.yml) +CDS Assembler ![CodeDesigner screenshot](./Screenshot.png) +Disasm +![CodeDesigner screenshot](./Screenshot_2.png) +![CodeDesigner screenshot](./Screenshot_3.png) +![CodeDesigner screenshot](./Screenshot_4.png) + ## Description A MIPS64 (PS2 Emotion Engine) assembler / disassembler with extended pseudo-commands and directives for custom CDS scripts. Used to create custom patches for the playstation 2. Make sure to use github co-pilot with this vs code extension. diff --git a/Screenshot_2.png b/Screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c23ab6ce6db3c68f712b6cc71fd261f8d952e92a GIT binary patch literal 144088 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

A*c&szWEeg|T3@1cG(v~* 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

Ud_I5~PtL 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 z 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 z z{&LRF*m-OqRyUd6?MxUp(cVj~M#xFOtLH$ZtDU~b6$P0}xEbcv-wyJyBfI>Jcm1`> z#8Bkx8^N-uug>+1?5rKx-R&DRmMou>Co2ex1@TGQcLR&A=;P!V>tc8cuo0?IEs_n! z3)v4EDkVvCYwX?0vuw6zA!BVL*ycskRVMkJL)5iKhh6v5qRp4X*BX@~0>${S1cP#! zU^gwzi!O={{uAXE;ZE6d!+|8DygEFB&CMk^B=`9?PbC?+jJj7jSwh+`ote3zXePX* zV>B9k0--U&#Ly*qXNX#_`a z?5c4cV+$CWa8%x3#6CE5x=Jos#BTGh3Y7gf7)(t<1B9mf)W;lcNbWs<#k@wFZ_}UN zpVihIdgww4xdQ?by16#oQo3V*3iAhixO1_KLs=&n!f@kuCt{l^Dc7lGC7Th_yd~7)m;c5rQB4 zr+0IM`xj_$d3?!lV7`e*j^>LY*rlP=RfVFvck^AFoi24qnE z#_57j0Sz~xW+j_kGSme=h5Eqhat`;UC2 zESv3~*EeI2;NzEra|{+oFtS@uhOM@K{Y1G{yC@(Oz>w@laX)^w6X4hvP9I6QY;gq56mQ zflkk~Gn5ww%mZamH#`4;r(vH)4_xwCIrJ|s%26^|lo{o8C`{q3)4O3TtPYE~+^#TL z^t{e*!L=~M0i>c@_xrzzDI)s!(`3+(|3{p4(AN@nzekC4Y;PoViT&fpyL0L~oEON1NvYY?fcLc+; z_Qufhy`!IM+qLuKXR>qt-X(wjOK=A08wcR`|E?0q{ZAf{zq~j9G$vU6!ZklD5cjtd z(APQB)>DM>$Wye1Td+a{x<%{?!OPW90NklKhfs8=3#_)b?$AL%Z zdN7#t+x)v9lQ~^QR^Hic=gf@(Arwt&`1Gi|IMj!`9yrSJ$osL z-l31^D5H=?gV>c>>#5ss9PTjus@K{dEq#)eZViRJEqp`Fp$vTBHz6Oi;#KjO4Rg}o zkjbJ_3gmI-Mt1;yBD1Q~r}2K0#2<^X!InyaEGJoX7i~7-VPdenl6spPbUCe`Siz~E z#lTGV9;u6l?hyBD=qI4s^@j<7WBwmyEp<17^PMMN$YdF;}$NR+3 zIN8v?zmDP!dHj~Qzk1W5jK$29QG?eJ_~%GlyE|7jO$-bRC^ehQtcn6H%VA!SsyX7T zVe@WJ*eQC&TCPQO>`>Dvzg@-DJ3qgNHXO5MprCnoeZAt>aqfck(!~85_+hS`9Kb*4 zk5!!M!+KY+;5Fvlad`V|>20U4IH?L)F}IOX>LdTCJ@!BYqoCMjr8P!RUigVo;biHK z@s_;0`LA@wi9SUb2KYYQ(m?qhgIG#>GoXBfnK15+jNk||E;ilOcsN_ z!Bf4c5#Aeh%GqH^2_x*s_mna)l}fMYJic=u!{NP+y#i;LA2iI?thBy1iZu|xA1CLn zS+Beda$n~uq;lpPmw*E@l$p>lgzIl)zYIg#^vIyr8b=PN7N3-#T}#PjxT~5RN)Pc= zqS*M44OAkP{+Sw?=8r0bIL9K#E*X@D+!kWz!WI4#o;Xx{HGGl_nE^}I9+HaW4JsD9 z?D|@hyCX3Dt_GOBn|<+$KYD-@lNL-U-~W`-*ZXcX$!Q2fug6swt8sqfTj!Tu( zq=XLmP)>&Vs3QvpfMp8K-1di12pIIT05=2Lr;tshXLHSRCj zI|Dn}0DA3Yse~tvXE%vM6|dmJJ0<30$Y~kcy?H6MUd@L0U8<7|=J;1uTJ>p%P6wU} z=8;CP4CfL1I$QhJj6Zjq&?QNgVK~nzWqKl%zQ;2jP24`Y?`Ohq)#wt5 zn8ad#3DPUr3v?rK@=v;&^Vk<3U+7wr!OF|#@XaWqk^cplq#M5HFOQ9 zrnout2i&1J^MwS$X3J*0s%cN2jV4&|ko1y#?^UQ;?7m?WNnrj&C3=pCOXrO4TQ zYOg@n`78(G-H}w8kE5#>VUE(!^?HVLxan`c^Dd3B*~*=SxQgja1sk^F_xXOVmGEU9 zB$Cwf)+v49!?1EGQdGQ{7fzh;XxQoY-KZwhuFu)=G(UE4aC&OH*=zbInvx|m*Or8wagRwWx=LK>uLlXAOlr}Fx#kLc;bXbD@P}EA(qoU zC9yL>@Cx?(Zy)9a4_OzhAvPS?&bNw_0cB2xPuLBRlepRSCGl%6)jv>iaELh6tdM}| zYqv{VmS{9;Nln)T5>3O2NqwzEm2)@BWbOvPt)Sud=bNj`UIQp#Z$teqLQ_#tgAA%k zXOn4f)bl$@PV@<3y4b~|N`<;=gqvJc{+qv-a~e!MsDjpL3df`zp>$ zx`A2-_vwsg&(ANUr)zB^7)0PDeP)dZU~Um`l|KE^H3(sjN}Wp@24PK0En!1~vf)4@ za?~u$XkArD{xwBFaXDRyn@P|zQO9l4onHvCK-5nJDx;>!D`x%d+;9B?lVIXIcX{x9 zPw(!{;N{x|GItiu^uf>;tvIz9$L=ie(A@HEgt*gzfa>~pdTmpaocQNhoq8kHFC8MK zq49G1?YgL5IWR=Il)j_^hHjnrwyxex!ZggCYVSAx7Yae#NH#;LY`+h^{UivP64Xz< z*WH^Xzu9Nnqw$Aba=9hAGSBkFZ&K}n(q0dIA76JrI8n89hWIJTpt0t7*<<9#U^;&q zxqmh8yq1KwBIWwnp8ngS0Nb zYWZ=d9@jj*Aw3#Oo^QRs%+*O0{MxNJdr?LFOn?{brN|NIpw17N^Tj-ijt%x-0;N$V zS*`GAAC8rug&H9AZ+kCco~e}5hZ77k7gCZ8jIHBT4zK>?gCq$4PS;KHSh#`fX~>zu z8PZpJWlA3s?~WM?;?s4;F1PnFt<0QwRW7FYmCe;#SxihCE|rcT$HAeNfut2W0;4T= zt@z}yy3c#uP5SR~+De3B)4u!$%#p=+B%PWkDu5$CN;@t{FWbr_dmvK#chJA!19$}R zdC1B2>K(1iyIyt_k&jvX-53>}-*a?ZpPTxhVSQ66p`q{n$Yaaur>~RHpiL^k(joc8 zOphH&S0!oAmt=4BPYse+48FPl4K!NPtr<$+_Wp7y(v&W6CtkZ>k=D*^gj2806b!z{ zHgeAyl&-I5%=cjYS5_Cy8i`|a`x)~ML&o;Z0-jUnc&XZR=p(!=O8;iRr>P$&ybv@p+w+yuiiX;Gs^$>QfsQ8F}`jXS1a>M!6qEQ(Ts_tf-nAi7B~9xEIo=A)d=qd66dxN}hFW+Xhq zKDax}yk;}lD*PmE$1i{TPfT{(D?^V7nnmaN<)F$If4v z>LUcZ*Glg|P^(nwQPbxU-~zkfUKYPvK^h4^J+Aw@~O`-deg@bebecW(|n zhvuJx#2_#iezDU>*#?pjqV%G(r zE+u6AQ4uZcLuk8qrzV`6z7#j}0-Q(9Qav(YF3xaUV`AgZFkcwhl}M2*@BI`Wea<`a z(zr#G$2eS+ur^z)={MLY_4)6?Oz6DROU(*#tjQd8=zCg+@8Xzqzn>m83(0y6;s@=W zUgj!F0=OT^O?apWYX(7w=Hu_s< zXI{8=lN#<7e;fR=`Jn-~_Xp_c zCtV^yY9zR&e9JA5@iBO|ZLX7OJcU_=jJIsIDoCK)8Q7Q2&MD8lYt|f6k;#$eK z_IZL37<(Y9`9j%HbTjU<>Ym7gyd7pWkCmo!kwO<$Pvc8{cEV8aj+91FjOF=!(^{tR z4RzHa_Q+ZyZ??Gd6*|23=XZ-hIa(TCYPPs!KiOM~?r_w_b-&`b4nQZW=7dR6BOb2J zm;;_b#J_=fD!yQB8=D-~_Wl+unP+d=>|OvDX&K+LF4Nj%FF2t;>eV39ip8Gy9+NZzwpU^bf#~B-YffSi2ijGiiEq??Q1>a5(PK8Wy zZ(<#ek*y`%e28^n3#+hc3xi!xrddTu56fn!R(`SJWbf|rXAR?zylArnzJWj9x2&!w zXd*m$scN0Np7hQ}`r{}3f<*VkrTpAtxXmtZKW#x2^JBm|B&xz!f5H5?r{5Vbxf@vO zVM91wE|%*J#orluB>=@;3r=gd=+2|#mS!sYZ;m&H{*9Ecc+)S(dRUPRsaZ4-zsRiR zdX23)U)fkQBIr>Q2$5>*(sWLPY}oPr?evb}*^ zq^UAHD_4Fb!h5e|&7CO9<wv8o#zIyZN#G>DYDiHPR4e zcVC6-CNM}pD5Yx5>1kKi&Qp;w2#W4fSN&JVpD7I{cNo1h_BP76=Wls7W;%z4rXC3n zr-q+~NPY}foFSbs;PLNKYRT8W2D+!d1Gd?sJHvlUlJ394=g_8g8EK$IuQcmIP*jeO zgRv6ji2KEPF7Ta2f0!lzJ8}wy^Q)c4BflmMyM8w^nFi%ljD`)>?w4fmMVYGdYsSWZ ztnq=c(KT#=vvNh#>GEJ5K|5s0mRRQ7e0wwLtdBTDa%th6PuThfg^n&(%Z*RI1)+Zj zLkM?oJDrAjymc`MLSFDAtJKDHT`<;)=y@Wa(;WB+NUsQ0Bmj0D@3Dh7qzl&Ko4G1= z?UF`$L*6c-H4v%E6Ac`s4GGx15zuG1IBTGS?FqZifVowVz0z;{F|lnsp-19Sk7IngTKnms);nkra5%|Qtf=3B0ELU-fmzd1OA|hg0pv4|EEaY}N4nDL zXdM5hGQ{6$CSaGPEu`J8i?KPnY-QINY6E{w7wmcPX2(Oj&{elt(t*D{pzlnXvk$o; zRE_B4FZb=Jp>Dm8vN_WIgWw`Jmn~jBaop46{pWWw)t#Zi%}?*XFFKs2KT^FpVH2Q1 zew6SVuxB~9{(;8cLkay|jt*+FjkC3Vs<>?lGSI;i8`a!E(zwU>5xGBTZ#f|n;?+R- z1FJYJgDXeANg6hT7|1tuTR_lRz?mu6l*B0s=}J!%oNaYKkmsn_p~`n20?Z?!SqD+= z<(A|B&!MVE%gU!_A*qpXJPd@&#*niuAs?rivH>sv@n6n(x`W>Nuo>MkTyv-@H3I6U zqlwJjuVPh8Yp*}~nt=tte@pufsK=BWMnxxe!MUqF3j3qAMf8a|2bGHfloE?vExb{5 z1-U@a^K5rn#%g(~x$PS6JQ?Z31uY=w;(hg?-@HhT+?^w4+bxBR^` z&s4_kM?gQ{%4tEF?}uVHff=>!Y4MIh$|EI=%QF?VbRv%t`XZOvP!!aggm%)`7Q238 z=`Yw(j&C%O?Jb`2CvdiA8Kr%pha5n7ay?@OBg;$cA3K!X9+-QU*vTr>`4>V7-q! zi@@yp|A$cN5^nk)?VbkC>Ulc?HGd}X{m-arr7j5_`wJ-oncxTrwzKs7&DOidOx*f3c?B|NOwr?pFXd-u<5ddn4F= zYg5rb4S~xQ*}vNU_V1cNz#LA`r2Ge)(E96_ul&17*}WvR^#3tqIAck^Ly-G>5`XrU z1n`dkhr-zAoKpF>3YSdhtLpqZp6vg)e)4Y8@X5eIAiMNeISO6wr7u9vUxDOJ7 zAN?>-Z2?=THPX{sP}U|rV@|N;hchj>Ojy2?#bWR`ue3)<%{T@qjO7>CHy3(FHGZ); zD2Sod+u6gdPG6=EqSI<=JVAQ5LsaYU{H`P8PtymC)t*xNLBUE1*nh0s{9cklXy>6E z?2VfEP-1*zK=i`PojZKj@5=8rH!;4+{LS^fUyTPgs@C@X>YX6b7cVN(HakGKy>k!0 znQR=2Rf6){%TEQ64&~G(mh`w9d9|lL>bsHN45_fqSLNnM3>s?(Q6sNlYIL7iUO6@@oUg0=g!<&r#EFisAkp!Kslxbt)o0mkq>< z?w7AU3C|eQ(;7E8UB06x&;^q00=2Ok4e0iDAmP3th&1(C}yyFX*jM!iH|j$QIJbYZ7yT^l177R%J&6e3E< z=Qi`v5jt+yVwj5D#y*7xmk6EorlP8pdXubRe`x55;v3b_aNI_BjOay9v0S{~lOb3+ zS#is7AW%tSTdlby*B$zHYJagxWf|~4FDQMXn{CIc2Uu2~_S@ClvY>c`4_t6eF(zTPs7OZ^^7OIqtt72LN|e*3?ed-HH8`|xc%DUwi0 zo~-o74Z}XCWT~219 zGk>H-Ltfj(f~l1%W6Xl#3iTgw|w#n6)?iXyj$yS)q0SY9T>sihuHoY*2~4Kk zO!~54@jsk9ih5`#rLWtoTMNMfTN3}>bbM`Eh>S0Oy+;W{$);N_p)Ut_|J2m${(pmlOb(c6>7qRyW$us$l_F%y(ZbfdBQ?Pl>mxb-V8hNwh@ zfKDBU5Y5Eca{>Arle-_~i~A4s59u93o6Xvji^j4$cC8%DJBJJ-;~dJ{<2SXM+HM)d zp}x>j-%gcHk(4mK*pd)K`Z0u|w!27R*7A^BetYp_SVlA|{4nWUse8aJkQs4|nl6|c z*S)(o*AYTsQRpBh$G1?ZDsm4o9Hq=l*P$Yu9~l5D(!5tR%TYwnnoehF>)2~q{{2T$ zWT}M9wBfnKH)y-gfx%fn#o=@92EQhFXVZr6^#txL#Fq9kb3rf9&l%1np|Wrb?xH@- zXVzd;3v|xL(5-cx#k0ivHC!f(60W%YSs@e4KRb%lOI$)T4; zs;nZiLoY*zS1g9OcFfC=IH|%by1s$6EDswf_vKn-k= zTSp#g4usvSQR12lWXZy8^`;WVJC|BmI&rdYM;-lZ)@rPZL|Gwa*l#;!xi)do4?sUt zvd}Bxva`+5HEt#IeKKNOo(G_klJyjBZsrrzMT50`>p>{N}B$=;lQubw!)m z?JuSO%>12r#qC4Nbh%ufwdD*ZDXF(3)1*B=a6p<0MD@>Bq)Nj2P->6CKII$nEV}lNZ*i$a%~MAEUgn~ z=*p8`ZgvOJq-ao(8A9mUs!lHNJ<=^(0QPdQTIK@j-{)qmZ(^%7$lJs=s*~hj5D-{gy^zOk2~!I$;om%khJY#H*8Oo z0Lz)5y}gWcGE7Hg?7Y=B?-7gx5XV$i5mr+T?f5S~H)+_>3(H}YXkHcAGp8O3e)g&( zGTnz3h1mEdz6(1QN^4 z*=OmSudlLd^}##}`8(~JY-tlG<^GCiptlTG*?ehUeix(i%ku-a{Ex< z5rnrA;!sDF7nYf0y@RpF%{URpDLPB;t%2Mh!$F5B(rrh+)%1(hcV1k1(I~COnoRw$ zB{MJ`bt*m#HyxhM5UDx94dcW-YjjUMFJ0*!P#BfHexp2sG<2mhJuIrH#$5y=yS<{0 zZ~XEYR{pR%NlHnTq8&Km&Vf!-F}n_p=Pmj%WL#!b(h1dO&-}o2chw?H1T4D&`|t#$ zvbzx*lrhJMHc{qQEaCx9B*6Irq@t&hg;M^t*SpoZm>^9SO6o;}-q~WkAKd~~T*Vx( z#$~UYUm&7V#n^=c#;orrGig$qS;!J`4qQ_4&fHKD3lyUL&EQqo*Q9f_XON_J!Zq={jMNOGH(5~H&2jCTvAN=a`LsN@Dt~Jf?UN_YZqC+@Z}T`ozS(@>oO$^< z>y&aTA9wm}|XflXtEME2QCeikgPeGr38^~koqvwB6ns9IelZngAV z%Jy!)927&nn>aQPy}8JMj=2bl6b0|xyUJ<`i$hpuIoyv{a4X_? zm$_&9+?9F+6|vsS2^DzAwBInD$s)Ek2>6QNQ5`~fn%j6^_N|(qYu6$UORcY9RBJyC^af+c~aQiA`)xs{W zd|}ys0=uMjvZ*T=0~bfWsWC_koU>k(b^OXND|B;h;Z}GJr`sj&@*nfyU(am?=q&)b ztUm*?yt+g=n#DDtu6aIwLAF|E{Po96*e^#5w6b@%NTWC4I} z%k9=DO5^tZ&Nz5>p&9=2T>0#>BLJx~-)KtM7fK&oA!z_GV95^BN%`dLn zETrHJrp?Ps#oM^5{l4s+l6m^hj)_ywW|H@8(93iS{E0IUP}nX6hr(yNq;n*_j=g!uP4*^8dq>;KkPc9Z=jGL$juXGbT*texVe zNB$PgVPWGRwFBCa>*w6?VL4A5-Jfl}J;l|=F{^(YB4(7Q2hQBLSNwVHjDFD6|Bz*E zR*Wo9QHEx}dKc{SeH}kMH56gjoY%u!zj*?re6~BP$|?d(@TG3w|54f~Ak;RlRQaJ4 zj%?>Oga=juy{uv3l~C-fZsVeR>C!i>aW~+t$0DbWuU;0F`3-ht>g}oh@D1=b?yuQ=Iw|t%?rN-NJ9ELfU@)u7FIuXn*dnKU#VNQ1Sk{wp0(3 z{-T5B{7<PX9l$HoEc2)ZdqK)DT3ce3Bw>!d zJmgbf`NS;(m1XJ)I616wtD#u$jf;j@`_py{V?Hx9BcY%9j?b zxhD(r#AV{!cIs;;CPtG+1}nHH1NQ1w=Yr!GB_UFG;PW50?^f;N1Khp)iSx9c;7&`u z-m_e7aop<#>yuAem)3=C6L^VfZJW!<(Uu~z-b%_F<4rv@0e`(w|Hmo(FjUa^yTFuy zMV^>cN)s$|7c=0t4>F{=tS`Ri4=SWYG^qrAHOxhR=%ja_pUB(O3V2`3d6A|x^|8lk zD9{v+gGL3}c~-(*G&}7{v9$hgDan}1Z$mvb+n1`Q1p*pnWl)Tk`(J+x@{%W-^&58m z#1g0}qwu?mN~P<%_f5@vYJ7#^i#!Rr&R#`w-JqOYi-RtE#&z4nq!ME1Ybe(IvfM(F zq#PAn^x7{%;!VlKd+VZie={#u{q2x`xlFR^o<#TPiw>`K`yw#NLV`EL($V!Mo>!rRqv{88?>`_Oi|3%R&m2*<5Y%=m2(a)Ur*V zyG|$}C`f->X)9GVj<~nAIJLJ6AJPxv#<<)irTbcr?4au6Mg?_(cj^V)JCMm!pKL9k z7rDi^r_Hp(+swdcI=r@@GP!S>C$zmu?KJc0dedfqn;0B)-_)Cp77K(sf!xSs;Z*KQ zZ7I{iS_6V)vYbrf=tv4yS0&wf?k`MdVqH|)sqg~KlO{Z46h*y_VUjlMS9*_t zj$;klm;SHdrPendcRn(`!V-}BwW8CnGL{LlxBFqf`RH3KAqf8C@+`w)Jr?b~UDdXh zI-nyD`L` z4M_FEqbDs1QJ)uiqRpj{BA_q(mmVSNOWoHUFL0ja-W^R7c(3=6p`a_XfB2P6w`y# z$-^nu`UErz5h2kS@)rQoD#G37u68_+Sl24od2W)`!7Fg7GJ&5ra>4d=b&mBd@-x`N zU)Pl;{XF2Bm!OBiHJm-zKD!%(X30wX?!Ca(Ehl4eJzyWr8he0q3JXhQpIll^XkD4% zyxX*CZL_pASh@kU+T2==&nc4@5mwXMiDmafhuz#~lGbd`nb<={=GGjlfHYm#1C<}RaFWl=-*|1E_XO2A8TNmsfWOAL*8xHAb(-IK+*zpO!506-K ze5xFG>&qav%PL@jG7mo7$tc zgZMr)UYLz79}&@;-kRAB>_$*Tct6|*fRB*!pvA33wMJ4=bFf)CDnDFAu8_wC2 z_i8$bURzJ>fcT^P zh^&v2^V7T%^g0br)3kWj9~qlsK9}$lDz#{eFdzi`x3BMovUtW8^uHI3@|r&?NN*y1 zO^4n%ZIlH~xu;8I z*k>*l99J}ID3^hkB8F9MVE}WzQ8zL(4#fS9u=bT1%z+A`jxf`F@{mEsEWbX`E7f82 zCZ@_t%HZPzP!#V-CBCdunQ#QXaJq>omVBO5=iBQtd(_)gN+WOih1<^TtumUhRB39< z&a?A3m(*=(DY&A_KKw9{Z1dpX;{+G~$eZ8$>M|MYQzsrV|0Bm-S#We`P;#nkWJk9@ z-heQ&ww>Nqr@Hx~kT$CbF7|xWUg7mp+guu`W2SH5Hge9nuO_^Q;sz{$j?pnXq=2Wo zx>K>k4ZWXWO!)&@&d(-pw#d2t98zL>=j$eUn}A_UC5Az+qqH(bb#}1 zfl~Xc9E)xP9n6CRts2W-7mfJGtMHy$@{4pq#C6A-dk&usByW4XN>B%RoM1rL=wDAp znc*Lm>d?W8-0^HS0&ANk)4@FQf9u^IwV!%onQCnaH&t$uH;ZhFESgeVflr&Ozgwe$ zPu~z)|9AxBtX3twwcApp%Fp1FE}!Am#mk5R91a2hpv0q?P1^`)DIGOUV98D5mDgd? zJ=4JuP)!18|LaHlUsrL0Uf}~yg_n%&tCoIVE4Ly6wHdxF=f>KIgJ6OEGAzu`g6f2G z@3|%IKXO-Lt{@{nWd&uhVlwe_1)saB8fS&ml z>Akhf?wXz~oVPq`{g2YYlz+CVSneLaUw+p>z0>K%1mhEqq8V=kdBkCW-an6jgh>Jb zm_Yl&0@nct(Q4L!K(_9Weaw712KnVEH!ffQ#}0_G!kFMR7#8(o7Mvc|3PWCUez4Xc z7q4PZAoKTqyvnMfZf(ma{n+Wd-h<1u9U;Kaz$Vr{HXt~~6`$EO=QsN-Sm?FR?WMhU zcL#yeL^cF{Az#=(+B4~{w%pK(BgpHTQ;v`!E_@-EH-TS{$wqxbv8!`6T9WfUNrAs5 zO?2*>Jpmx8^~&QoXWldq3zvT=QAk)G0-KM^gL?;Rb*IuffamY5O4dS$b?^0Qm7 z9sM9$e6Xm+94oH?V)2;}jB0=hCdhY+o2H28I>pPck=BG^Vs0mXK7bHFI32QfoaMfK zv)J@LsE^sE}j6cix>i6D`> zcE*woQtaZ2io!%79&j@Fda`OQoC9q!s`Bu9a_(c;Sly`D<>hO!)WKT7Nr##eBqUzV&E z92LG}_2IMSHF5hmPIlKzohW=sySI$}oDs_BDKIA$TWpJ6T}wK~e1>;yrwPCy%=KhA5}X6J9m5W@P(C z+48l55wwEDONYdoOK4$rfX3VVfVZ?7hkkE+B(_AF8vkv?z^-LJ5$L3uz{<8ksWeY8 zdi5?C9r)x``d=Nnjc|YmyWh(uygh<+6GZSkHd-N&?yI5?sk?8POqbygy`CrM0s3sX zgQbfK4kWoEULCb?iZL5}G?iZwWUf4?5^Olt_?%vMy}H2c3xY^wf?IbObyaqy%f?dW=QCUC3|bm^4(8h@Uq6)1#Z^(Zs#AE+=yA)F*J;(^5^K2g_?+S_{0K-1@XEejnzUwveZDx_==0 z>23nZkx+xKq}c)7(iii=GMfoXOH@Kcqfhg!n`wAaunDDh)$Z1QU|GWtc2OVQVH# z5ZVU|HppYTb`~z~e**~zb@sEygQmlwmEcH~P^@r@GNSScwkkEC=fpYLN&)%w`mkS2 zgcG+j`O*KWF8}X{1kiVX6#`QK)ud<0>SiPTCrIHJEKu0(`)jKo3fYa`H#JK>phJY- z|39t&f03sj*I)WSg)V+^1U^1Gvvu9{*RuZ;&cMONcCe)GJ%HkK4084V4j<$H9=k!{ z*QXGB$2s6Do!@yk@{>Rsg=h<71H8b|9j}u?wy@;*j$;e|9j8#VAJTE}lPS0S;pK@k zcb|;a1M-*jxA=u!bB#&%;k}kqgEI>#(Q{p^y+uh>4R0L04GjP4TZ|gE^b)uA0^kiy zoswl$m!tQ5{8P)U6@PZ1*WC)qt$791mx;9+-sZ38=iUlO+gWq@k1Qi-4Aia6!1=Yv zg{e*5(NxJGvohp83Z24Q$yH~W+|FfcO4gk3xUshd3Q4BAq7=4*UUb519p>KBYoyM> zAkMa13jpZA!`nB%N($KOP5b8comMXG9a-z2-b?)cd_IaaPV1*PtXfQ;Seirvn)-DM znbGLd0Ju$8#nNJ1bEss{TR;<7Gw)gi@F>#a^r~ZrQ9kK!I-}-;I52pQ;Rv6V)ho-2 z5_-e4W-b6(h<^Qm$?#1x@(9`*m3o2bRQ2GjIJYEc;u!ltY`3d3A6dnLcPg}Pht6sUz9kRAs06=j$ff1x=h2q~^L%S7f0&Yf4Hl7nu zvfTQ7Bxq)6SS9epSv(Rok2EPrpNLo=gmR&2DEATQ^m~x(iqti?K@fDL7u@8D{2YNGit0d@mQ|x^0&^AIhbc z>@jDS;)ivQ#B42WWb!B#i~0v&d~E&gU6SX>AWfOSTZp1N;t_cijoC6B&5aJNclGH$ zv}O#@C5qRc&x10jXMJk{gkXJ;4_Y393>-K2;05{O)z$_cn|5HC?nC#x`L|G14UH^X z!V%PragVnZ(BbT6^&2s>Jl&e4X1I6@O+_aLKbiu1Grx|IklIYZL&Z?S{HlS(&iDy% z;M^B!x4Wm&NgtO1%%Jg^`{P~R_NOIfQ?1W{sOsi63T%z$_PN{^Ss%Ta%Us1tqxBjS zUKSF>;LTonwT>N&peJTQMu59y5Oq%lnCg)f%>?~fYw~h;5V_?NY3*%qa8(m$dOQkW zEY$aZ;~T&YoHQn5+vEKr#$OxKla7iCw>^zm4FZ_zzgzn3sfVh7j^=*gW^lMwz#S&U zQQ-D{HarC*YOze0&mVu=-Kv0ndy67RX^v{^u}0h&u?c!cw2EHj6Ke05>V2B__+HsC z9Wt2jYLM9`*vsiPZo44%I18BmCI2lMXAiK3i?yd$p8*{rrS1n~I(vJ;vrQ?|dYl=aG*to*6-Qhckn_1A8p)IE`Ky_AW zDjVZh{MLNot^V|HV-c)|HT>Qx#uHU&L@+g zWs7(d!?wreGBQ~B1T{KqePtoabgJcp_-qBGg#7yac51M#QcdgiEObx@RpZVrtxB!nP5a&@zvZd{bhb z8dUF!9t`m=)Sj!p#;VqVo1o5#l-aDcGuu8fJd|q%GjyneY;K^pK&sIvQ_0!V0+k~r ziY`i$xp#>yw!)GCZS9;iw0`4T<@j;(?2mw7v^Sa0$k(!#E+#_h-Eyx;-28 zxGyb;ow&K|^xW~rXKw~{=W3M)y1jPNzcsuCc5hwwvidaf7O_7^ndY`78d|*y4;bj+n;oWZ*~?$#@5;mP6(8Wl2lYVK>^lJ zFTy)|zjz%suF;DOYwakFL-KV~dK-6F&D!5M$o5}2-!D#yKJe2|w&;)y@#`J0!64sAEM-*w zdZS*YTBCT{1tZiun_52jE#zwhhhvHw&I1k!EZ*^qg!Aa>(@k8g#W8GqI zSTatqo=QI#pKZ-y5zbphl^IYGL5FG5WKr02Xev*U8xS)vU+Nx5fT{|{O~ zI8wQlM3ypKbUEF~KnCRagEhrgPG`Hr$iI7h-JEgEkg~6RVy1;-1rk3HZ9IC3Vw;q* z&bNaO289w4fw=a)_w3UnDz_vOLAnwq*VKz}J|=($O#3LT*JUukAm%xfTYYopnLrDQB2nnnj(l%v$D?^`SIH;-kZpTkrtI6a$=KWXH7> zO6Tn9rk-k;E21eO*wD#rxL|Rn^NQv-uHo>F&Eg)~uw}12ObZKjPY~CQ(rFm>eKFx` z+5*s0f|Kqfh8gS2=8V6<3Jy!i zzFKO~6AAfk*gM$|Vp<7GHZ8VUljyH*R3gCjFv{d&%>M~7H1q-x1NU*goqMvZZlP8V zQr}l86GrnQE)rfvSsD+Y!8>=)(wmfGwVHa|Bzli)6Q$!X zId>FYJAT{*UYoDrf)Cd|=LWPCS|O$hDp7zHN#E-$wF#>?zBsz6InZmeZzUFkoaMB{ zl*q$633Ia7%?vV#wSfJilOmlbSMyBm?RW)Un{|n9ROWFLy^JS@i~4%uWsS2NLD`RU z7_w))A0Qn?gLMY-uUEi}oJs=URhh6>Qy->p!CY+j!Q7d$e`2k@#L9R(27{vt&7%gK zIqx;)V%Rx^%JEU=wO7mn~MUJDJNsh4MjPF@eJ?2yNOC$=&wJh z`^~Y7OePa|4ORPJh2Arrnhh(oQy4>AetL@BR1qr7uX@Fq)WxQx^BO`Cm@Xl$VFe^B;V1}x{4c#XPd zc3j2ARf0i5@YIt%N8$$uBA=E8P35w{VF3%(%71k>S~-9uMOkg>`aJIkXc8@SG;Icyx0y*PWd5WJ(t_3*&^17&YUbUuH#ZnLCI%DmhdLgIel z>KSnHZQSILd-NS>ckdK4k{`~@vPHxR1qNN0XjRt2-d5udWPkawazKP zvs9ofX0oLS!R=e7u)Ux}AE}HQ`G-u`EaQi~OSCJTlf(c~5@!!(Qt>*10sW;bgLje+ z*5t+g;la#XupLe2oPur1P>C$7WBEv}u~2m0LZ3tp-*3U}p+k?lF9SAeCxmML>K4-F zy%38s6*b*Am4YJ*EkQ=N;RFX4_TPXmkWR120Q`P`)eMY^(%tEzyJ>n=@QA{cz6P|Lddz%AXMbygfp_)iq7x5P2E0I%>K-U2biRpsjLpywztfZwS9&X5Z=dgx*wD}v z_g{3_5H&KoE9%YBav#lX=re5=Ou~P8ftgys?43l6W2mQt?EIRBN-lc^D05<}wWK)0iC-D<2k(>g^4zLCyWTV!?Q)M6ec*<`GDeY*O zl^QP$6x2KQFD`IM`>Z%Pm;zG!-*gS&{$m%+$2W%jN`bLGcX`Q#*6I(vYv>*i+o>Fz zJ>dBKAt+GL1Uvk%dlxc7pmt?YE1dT|j;9*;mFscbw(#t~xr^qWNAXJNyYyNE9?`Y8 z3_H&W<{oW?8u}bT>*r`Q?l1o571G0DYJXR1o<2ZnBBDTP|~lHodJCh19obu_eIlW zcZa$yq_{>iF4cYfvz3CM^wO;RIYk-Q6O}Dz6smplop?#pM9+`%T6PP@mm<#IUboMv zkrdW_o2?|&>eoOIJ6Pk^(|g}d3?bEj1Fg3P+oks$rQYgB!y#B`g9*3=va;Y$khAA`|Lvy_I{7%GO@ql|+-&XN874qAedqLqz zi&pj-oNIbS1o|=m4DM=7-b_CR>56r6snSSG<*e=GcAkB^z7BiMRyEzyoAz$5ntO6% z#ov&(#o$HhVU?s(jex#NOhQ8{Y=&IeyzjLO(2% zXYVG;Dg@WYSSE=gFz^J{(?6)ORoi5Rl}a# z6F!eGCNPwc;=@Wg7h;KjXc274K}(MABsKYyq?~C;`i}c0*C-QWj|__y^jYF9SY&f# zpCCe|`Nlo=!1!z73Tyb>P?(>8RO6?9-+A^@g)`krn;I~ds2BCGfJFA$TyAskRCy~+ z`E>WRsM*A_UdPd#$OzOTaw^MqqdMFDT4h?nA;MrTB~U*a4`X>yZd>oTJJ4+gt4Ic% zqYf{o{#c%jtkG3-!a|Sq7?GCQ+&V2iRo^TZStbD>%oQlkv9geGysvve=y|F{to!wE zU}@{7IO(fQwmKWQt8@I}HN5U4t)de<4MVj>SC%%zYur5f_L%^b_QNDc@Ye!sv3ADt z`a^Q8evCHHq<-B|sY6en5CLKqhl5mxvQDEpsw)He%bXAIpyc(Ty~-Q`6)hdxa&tE+ zvZSp-)Sy5Kb^=d*2{;hHF7y5ZRXLDTtheRZD6s_XEGK)|G#Qk6EOp)oy3VzBD?q~a zS7A~sk-b!^fBG_iw+b(-2~?AEa@KxbmT&7HslE{J@`nIoX!*_kGfwcu1Xi7qKVn@& zMNwXubIU1s^PGYe4PJcT@I(ir4*Wt!jTKIxclM!eB|dvvo`nHm7j#x#Fk&hgbNH?T zQJXbFg2ec{cWpNPq{WmI!U`8wh2pT&DM8I#F2VN@1#+CzXOE!$%_J@otd$T8xTS^( ze>&KZia6{04zt4)wt_OWn^eZ?#U|~wD9uo^2_1~o#r%&B2kbuJDdk;OU`mXWrv0sPPq(28c}R}6q;-{LwB_%K8?42t`>yp~`AA_~Cp04QVzsii>(l>n?3XsAYz z)d4kkEUHIB88D>cD4m{*q}jv{Q^E?cH@tOKAUacr2Y@kbVF$%|&;ZzQkOf?Jd}LeU zI7(oKdq0$*4g8kGGuPQPN5L*C3;;^94i*apy@~mnJRdNABC`7= zfyHR}r3ni5rDiEJ45xWMXKXH9_tBgS8NOrn!Wuskg7rQ>Q-&`T9~IEg<_fRJb@wAJ zFmXtuj@a_{+RIB$TqBM3)G{L-k2Qq}4fnY67G)L*w|S#>$4A^9;-;v01P-d>gmgV-BFMv*-#HK)3hY@ZE>^szv6WDB_aw*YZ9 zIQeMlEugohV1Sbqu`H|AEe7z;uUxEBPCl7)pPrAYa05!^1R#lB<+WS!>s|O~A=Zp9bo=yM@~5 z7De+?BHu}sPR$Np3m8G)9SF-d5|3N=xQ+};J%Sc0_6jA2LWjz0KV%kj`pW@>S`Kj=j|{NfHZ>on5;qdT-XuVQ-@4G(%Y~S*Q(^3o=zAdMys5rUOr-xFMkgCJH8 zIb%OKw!maR+&Y|Hi7o>JTyJ1hq*3KVw?IpGEiM`!74zLJf}T`;d8r1XO%o#rCUaK% z_ZAF)I4*}Q^sR(iF7Q-y?fkanNEvp+<8VF37i0u~)^A`iXDM}C!d>iebLf9oDw zmLP6W^5DGGQ;hLrB0cZ1iq%peiDy-wM#E;zCeC{z z(geVK@_;7F*sa(x%?N;BzT^EE3KNsd3SFtVcoxVq1>q=JkRhwZMa-+F0(yL%4U?0d z1z01%iS0;%y?7tWaJ8_MXhI8M|8{cwBtpa- zMJEk%rbToc3=p;n0-alvq5XlTW!FXM#7Vc*jeHWvNspaYy;r51Q1dTIVM6tVWuxDy z8HVb;=)+f;ceJJE3~U@RP!Li6(W~@0#Sgd7Pix&6_S6=(Y3~q-WmW`6{Vp3Z3mTLz zyu;P5agBpi#bhry<)!E6=&UJ?;~K4}7tFaP0W-7>EA@F`JbV{PWe_g=xMW#T*)XdV z`y*scED)Xw%AcU9 zWfz#g1+KWvYl(Qqe8cu2r>JRQvF}o#qzv^os=)b>RsC*2ItOHmAwg}(B5_UztO!C8 z$=iDrlHqS3blFzkGk^TOZ4~2EU#7{V>oULoNQlK019}(u1Lm_E^JQIUO>h0Y>wu@u zUP)Y`ro0ls_)Z?QCxB|J-EJn__Kp|5jj2$?WNe|+uNu_QZye+|A-kO{5RGU)aUc(7 z3M;!yKXkS0+Ery08H-cmdzWeJMSd=+It%h9(?*V13L0}q|v`e@_fuV zd)%V!{}72QCzs39SkLo169;j zrpKlDOsL>Gp;gW;ZO`DaDpjICtiyO?mVdG*_JvV;C&{o{JYatJb6Ti5t`;-d_{wQy z3{Za;uyJwg=_qc@4ZVv_+Xgc07&Oge=PN96a+NK>1XQ*2)`M+(&Ua;!3H)x3O-7W} zM4gUWx)a^}!YF}w%$cSKOd8cmUD~Z>S+XKt1C#C@8x~`^zZk=o<)IQ_Q1ztWseJ&s z)co0Z9>}1Nl2qh^(yB{{4q6M>uL%dYH}5CcLs`p{Wb#5wbn@J9sl)eYzY;Tm`Xb1x zUnZrm-j^^n#ykOI_g19K55s_-`kJ68~}H`(?K$7SX^yYCm-e zH5h^o1{CT6lRK;WHZx16Q#)zLAWdDda_f$2inr2+1N4#)ljOzV&`roW6_a zNRaICeJ*`8ML?-2DOLX~&odY`hWR4-Om|o)e&GZpLY;W+u!(0Z$9ikH@VM=($byfu zC%d=cr}=qP*!lGbFAF#_5;U^!8Q1hguaonNn~dN}$fsoI;R z0u&djUVOT6LyAWn8)Qc<{*N4lbooqmJjc(&lF9j5;imtD%An0UF0%mnIyIKfL?3qu zd+FM06wA@iJ!=hsQgyJm#rdeqs=`YWsexJ4)OdWru$5qOwxT73kQf2*C#fAB`cn<0 z0>LOP$<$Z%y6IOKMIq``AVqPEn=e~_8Txq*m=0m#O*jTZ0xLabpZ`yAJMbHQ zwl5K6o#tfh7Y}V3waS1`3w4(XE2ys=cQnj(@h2wGJM_BU+Ntzf|sqEF1UbuJzb9fvx%;t^P^6;*HsU( zEO@v4-+?&f_J1r+fazv~0nkw7Dsb(P)SM5`d>kUfxn_qik?;t_Z+I7OEZ(cj;$~~s zmn9FCBpC>FI~f6{|LX~-oMkhR>}k_!Nb;e@Bqm6Yw0XR7D2WZ!`Z7~J6}!vdoii;S znZV0>qy%O;E+1oCDYgWS`yG>@j@IP)&}&>Yb9N!)O=w6_LBWkdjr3Ru7>VO3BHD&`>iV=b6csVNy z{XtY@ME-2gpRqhuaV#$eWwt5`>$_{vwvTES*cqGbPciMS-3=^EV}c;k<{U3t6);_2 zhE09CyND|SCOkHdNlvPw#yYCg3A`84Yop=&^I7%4f4vINif`{e6 z6S(`Qqc^{O=sqi7)Zl(z^UR9&EilDF64v^KO%2snFQ`>+UNsJ5dvE%Mtkp zE8E7u9`T`{)r9S{M$ult^C6$N^eYzmAphY9cgx&%B{^5^e@oB~q1AsynV9Lrq*D_% zjVU{8EVbv7@M;t8-OTnkBJ3$R7f9zTsqR z0o$Hoj{G6)&3LEppTLMOum9tC0?c@ne%I>q0IsG>Ptr}~fOvGw7JiOHXSxy`FMRl8 zVGF!dH|xPot(40UKW;D1-8)iq=XMwg`k#bn|9Vl)zCI4UDI_**;;7B}KdzRl#p7bE z2o7T;A;+#7wGyZtGy6c~5fb!I8vdW&+3&@~_-jH~SzN$bt)_fD70AKqPH>4X#Ifn| z#7DDs#$>9~Q)^pw6;AO6FWF4ur>1@bJ%^;8ADkjHK$Yr|rfpHsWE75ekgv-8;cB=F zaC1>S1=}~HgjhRT%3VxiF}&s;s6KDxwdyO-09XsAeh0r(I9biT-r{9J_R_MDn1_-* zJW|V4=k&8IuL|*QW3Krxv6Zlm#A^zY9p~N{@Lz=AfcvC0m)C5eiK=39oD;-S$6JKj z?*_TZ$#+E+!9nfYW;LLUSGVa&pMM5_75?rt;n5NA=xa(Yc_)xPYh$%6jizlHK6{u~ z>B24xkzMO!wWd=sFEagpOxIX~vYTc$2EAl- z=}8l>-F7tn8HI?;f%!+7P}l&i)~QvG>C$o7 zpgxA$$@@)ZM>(TrEJxSRV>8cpS4f_^@X_-nk9U_hRu@7DS~^r7iy!3CT9$-_nwqve(2oQD%mD7P_w zc9We4Qnz}n2r$6AzKFef`i5n;NAAnBw(a}LB)g=3imz=`w~UkQ7^3fNK@kgJ2)*rw zc4#VdA-s2Ts|CvIj9NM6V;Hm#en{j;zklM53JQKw)6n z0bnGUj{H`Zqi9@7$|EE48wJC3fe|dAx}EDPyRUg3*I?dC412pzTNZrxsBaCJIMjF@ zhC5EWma3I^7sOZRv|1QeJ6M7zCNMvv1Vr3c><6$9~_@j-T(XiqU15qD_wK+HR%Al z=e4||OpoYy+J6|-yFFrMDT^!8RZB9AJc|(|XDig(1Y0v!cx5rnCed2i$G-9dAg^i^Lh#9#w#zliu|>)wajGj$)EClnwK?-o1#j@KST=w zgzreHiGl1_I%;!E7j$2n;R%opW*c`p>dSyBb>Y{M=^A8U-eASu z)!a-GgR*T`fL9-0&hOn3n|*(D=|TYmO3QZcGi19eh0?Rt#@|(SJ*tX)aMwcUME`UC z@S*ZTZmUtzRvgxW17Z7#5Xf(E^%C+|Q#4p5p8v2$_3Y52^FvQp{E8p90!RqSX%+S< zxYKD#%n0H1Ez#7u0&;o$VHUn9NG-XJHBC9fZc~eA&b#vS4+QsAH)GJFIf>xHri<5M zfLa@Nk~XH|1vTk$OrwXcDZG&aEpQuE1XZAZ*!MN!O9yeiAfWNMe5&(+VfpdVsoyoj z*+W~^gYMsz7tf)koVx*s^y5G!{Oeje2)%&2ubL%A+=1tsU2%y)`Ok9u0G&N_Nbt{Y zIT}*i{IqoN^p}TS2XAu-kSZTUZysPACqR)~ErmR+7#88^jxs*)15pd0=D7yY{j0rr zhxtp|gr&%Jo^qjQw%}3j(|0F-a zzw++{MCH#ER^SJJBL2U_t5n{9{6_~j0+8MRfBB|3)k5Ln<_jJjo}^fpQM3?LsdCyP zmulkYYfV@qy@7_(5HxU$pWH(1Ts3wszS?Ynh~?~*?H+lh$rvmS)XM7fq2;y@TCo4< zwb_v+OZ_wkvHvhzc5Eqc&GzB2Ih0BuxLDIt_iO4gtemRRpXGYi{Ym7qKLgzw8%N02 zzq&Pt`v3Rcn%A;_x;36r?}Iu9-2UdYOM2bMkbVmWU&NG~@j#A5HR z`Xb+|8Js^w&Wg$ehLDodMgJ_r|Ms5`ueA2S%+sVw^O6frDuv<&z8&GEfZxp(x`m*@ zw@$hBsNf)vsQC&L26=w(}EI4IMRbzuh|i>$7Y-n$78)vzS5n^&t5Ia!+8p zaYq-P&AkJQd<*k0`d{q5cUY6zx<0H}5EW2Sai}`ZfQWzygkIDcu>mRq(nSOUAwcLz zR}e+Yj0i{#ih$Arq|k&YRX`GILK2D)>4Z=dAP~Nn>g;{?Df|4+_dEN$uJ1puS7TPz zde>9#`+lD1)4JtWcAt_}_L(V|ZvCu$!5!RIIbg9k_1nijX9{};XqOr_ICGs`Y3g}U z`0Qmj>Q=Y*!?+ijejZOrKRW{D zRGf?0g>P1!sC*0Zig0imv9Dx*gBrh{kOcaOy&o{d0F9G;CJI=I@Ep@nNSt2OkQGxw z-RRS9RM_BmPC=X6mN(Z&HVSL|@z zzKn7AcbTjy&N|8f&_CPbi3#BDB_T*H%$fCKHN~SXLv^l?&7n7jM&Q*?n|hA4B&M}< zE6tCuuM*US3eGA=to1bu2N3*YIf5N3JE44Tk=0#UI<g2Y{;UHa~-|mTU@(1V;@yj7@qYoPbs{@x-TnzUBb1b@&4C>1O*FdEd4qz_> zPQunqQ_0ETzQi~AxwU3F5Uz83953UmFb`F4?jnLU*e|PX%NI)%KXu;iCi~-D8+7o; zeq8pntj*9IKx=A0-0Fn#y|bkl-^-!Et|mGqS+BT&RHZ4RVI@xclK1Zg(z8pSa{{A& z`J^N1NU28blgd8sK?(Qi%n>`6cbk+5k&NTjrk?C{QdBq6{Nf?$Zu(ksZ~5aOg5^LL z1;>d(4u11px=DV&J!f}EP}=r&viTKgTl?o&NcxpEpckc+b5Dv7GsJp7c1ZE|R&sbw zGp(5stKz)t=Ialg9~uuR0MTN?`F6(qrRKMoOPD*LA)_LYI`JLw2f(4J8y$4ovop^L zVlV+r4!$tmh&vb58AO0K8MJSi(V(+G61e+8A4~?e`#T=pzme#y%?{sn@JCV+$@QN< z-@2yvZvo8ETDJ7p0p$NX4|jdt#QmCD-t>EJE$|QiEoX&6`3~M16nB+}fpshW+Y@tv zdSl-d3}moB(wG9dkeq>prw2Rw8 z(hhmC%_zNi4=OA5Q8w4@%TQViAkGqcwB9m6rm330jsnR4s|>c}|GxbiK2o&d=!D%l z!7j{}L|{;F9#_b&H_-W#-=T}+V4e8frEk1Ni=BL>_uE5q%Ak)Mfe~ml=4UQau5~%k zayK=xP>@SQ;VRoho(Ohw(n^Xki&nSe8Zt>AClkj%-yVVSvie-QiBBa`%UyJug#(V>>(7GZ8?d;=~sqhnfa z7d}5s2Y%nXe3Smrj9@qL;24lCjCvmSbyOMtBugs24BeTzWQf3z69>#>UrPa~jha}P zlgQc2IhgtJ9@mj?)~++(t*Gfw+}gB2{4Mz6SQL>gu`EdR{>V#0_@t zJwfxTFW8yeqX-a}@gcdFV?bFmga~WgVa_U*%1KsB$Y(P1Pj4YX4(w6}IB@RbT>w|* z2$tS@(ftiJkrE6isyd8U5$ITn%rQd5K`EGq?oziW^_aJc9P74!O>O+)%D=JwTZPIr z*-~pNrfPhO6`R@r5Oy+Q()kyl4{!S+q&Xlg&LRngvucLV@wJU9kzl(~;P^*7p?R2J z?s-VwZCV!#z-%u%dQ@mHao-Y@v@}kfPMX*Q?Ca|e49{4{(vbr(g@pQ1?w>7n*yS16{Tw2 zg(d%KHv(4sL58_Z0A`*j32{f-SK+iqjBQEx`68ay<)U8|re@t85fqSn>z|Y?*#dMa zA9FQ^O%=Z50AWL5)SY?Kk-5;O!Pt0@?jBcg{guTpIp2POHgiUsW|Rz&zb7Hp#u?%# z07lcXud;%Me@kl(A|P%lTy(&s@G4Uaj6# z;sq7*&xfvNvINZrl=RoIIz(hNFzt=}abQ2$b~ya=)yu@{#lf)ljOR^zP;Y<|YfepXl-GOTn1?($Gadv$o3f z9r|wmCar*t*;Zaw8v@Epqxa+$3BK2W6LQ((`0i|)4kN?AXVDvI7`q>l&bsw+>z^ZKaC8@{gRvV2YfK6-Eg>`9bLeYAsYc$& z^fvmxW5=hUqnn|<6fhm*cKY{VPLVHrPyr`=tGN}w)I|zX41eFAl?&X6ZR8In)Z*~% z5z*WWs1sFqG&j->vxEC%xL{d&@Kj14(3p7Z`t10TJq!kU_I~s+=yx%g;$^ z`gsf22bQ#rDJJd*hw%uXH7$0^+ixpnzNFNFADftXH9t<|q%{6}pBVm{z<1ELGfv9% zvA-F=h4&j}&#Dlv&x{NIFc-??Apdz8(ueG%>u~h=E=-) zZQck#a;~{Ds+Y9?9$aUgee6H^4#pbojsB1Y^kV&Q1O$&O0S{_Z&*d}sUDOps z{{nRPA463vxmP-K#qhAp9KJ3q2TJ7_DsALDBtM4GMB_TQ*(SS-_G=9>5w1766vuZc#P&TMDeoT1Od2P3@>rhYg(gafexUl%cm z_wP$#eqmvtEAl^0no;K!J#3-ovk&b%;&Ar8+^&AkZ5ZbdK;z9mGf_m|n4g93?IeqO zIh@DG`Ha?1H}vdiqG+>%s@+eU>Oc7@0r;f_h!(MHUZxf%0Jxc^5n?B z=J^bnFWKql{&B_ieJ{+${@&7O%7qVxKwBjZsU*Ee7a{7lfBPRgMU$M^&4 z3KKe)iO1`>WG~L-w3-2On)Hh@T3RgS(k(>*E1#Xe}!}wF8ApWvVdEm5(|5D!Qg%4*Rb_UG}>3jILH~Im6tvAGhHuE@e zx78v@@m}XQ_YXA0DaX9)#6)PoxA8Bb)piXLjXUxVZB_v64cgpmsXeGh^D*z0rTJ0z z;nP>X48~hZuQ~nveChT|o2KK&W$qtU2Sc2}5)$gyY#;Jc->P<+_iL2oMNNK2+a zEg1RK+Xf&E3BbNKru_`0^h5v%13=K|}TamZ0PJ)YI^ zTK~vC+>2eG#u%>IlD`>LR&^MD^wid3#S9KN6wECxrzw3vDZ~~T?+_@irHI~bR_G5Y z6>waOVKW`DLmVb~spe;ys>6gsAPtb9<|My!`5TvjbCxL?kxzE!9W!cO+L>pQZ3s+G z$el=)%xn%nH;CzX^zSZz3I9h&;UvZQgLtOxjWrNYI4Z}^>fMjiQ>)){wB4MVeqhAGif+N6!ydb z`#HUxsrJM&tjsi#9%KaeXXP~Rrv4S zptK5y4a~{5+XehG7<-r7Cuw|t?r06^BNXsKP zG*CMR^w_?acXl3UA1C3t3;!G22PtLPB6bm4@<@@({K-W~niT)Hz1eo{0d6*#g8Mh$ zw-LVO7W8320gw7M&7k@zcT8)#b}{-o=4v$169|@bx956?k~g!no|-ePA?)0?)a4hci%)js-PFVsmL* zMmRORv-@S8Q!VsDz9=q}MXm&h9d*W(THbr^bM}r^-OFZ>?87ZXWQrjWx#qCtz(&pj z`sIP6m|swxL7)?3Wb3VfA*k}qW|m9gAg2=2*V^&_P9fe< zdLLLpD-!o1Ha)UO)fal%W_-^2lWRLgk$Vl-X<%BG{>FC8P(PW=TQJ?vdiK3V%n2P*OAV1Y3N`m zL8c9I5h`>w6R#Rs^5#9)VlwD7m%!`_`VLUX+YZRG^SczNo%Zxy_B5p5u@NU9w| zh1z-agd9;Zkk?TO!Wy0orr__ki?M_st=fjb!g~r#}ID(Mt`{J<@y$feiN&0QQkHN zcznm+l9nU&yK1@Zf3-V(43+mK+f1+w4h)l4{{1QUCt{jZexe9x{H`T-O=r2n6Yyq` zSFx?RklJz3W!Hr?^tPBUVSk%{^Eqds){H;h@S&kH77itAYCg$Fshc!^Q13P>wD#@6 zW*1)s{}!)OdB;{)BnWTUX_IJ7-h|0U+BcJxzXr7@I{sB2e$rZ#SLq7H#fYCqNXG-5 zef?H?5_ESPK>ue2dcl>!u%1dc#xUjauw(bTC)hY`J@zTaTA=mNv@pvCN#iGdOm{Rb z3`N+ki1^Qsnwh$}HRCfJx`o9Zig)&a*GpSYrsbhUH&+w%dHcAa60nhk&?14v%5%Jy zC!CYgI=EC6a?uxaF&S?rLRsI@D7dEWk=(siJ(nR2qpevU)H3&8mW_T{UcK#F70Ahy z^X(zYpb$U^+X2*pxI8i9zPJ{5cR(bE;Fi^7bdwq1FI^O>PRnP0+KAf>oQ%$v(?|XhNf*Gwu|NB&L?#fzqi?<3<@Ow!D z1eE2N-&@k4fB|hWJzDA8FLB(r^`3>3F*=@b!EEw=lJa7jLhOP2moH}XG0N(natwf3 zR(8gNZ!=<63P9$YRJl0yliMuM1|5)STH)|l0%J|OU|oHC)>4P9^7bi#;v zE#AQMiA`D%ml05PRAy$;dTYLOuxQ|$H88H^p_Zv#pmRALr|a|3&y!oRyF3O)lS{GKL8(08I+?!o9u9>VP1z5rv~n9CSSy8ZRv@#(apF97J?DwL zo5r(j`nSNbH0>W00HDbe>vCT!OZUjR?RGKum=VF&%Ko-i4pi5`=}cO4t{WE1iPTr-gu?e2uAj0F)SqD{w=T;5qoOwNZ2f zfMU;s?s90l)N#(w+_T`3rO-acY7pb8O^T~`s_N>kT8Emw2mzqP1YH{7bWh+XO}*Z3 zO4M2M>%EnwrB|q{4-ty^s~#uEIcrQj0QFwkY@2m4TJh#)UZqMJ; zr|(^(PjdS071lI-8{k;>x03gk#=#ju?JdanK%cl@3mjofAG_XevnMlOa7XHOnmdOX zIRd9O^f0e390I)u98>AQvY$M-LO~Q&_DC{KCr%P)P~xCvdNljUR;j2K{KsmJA})3A zP9b@&i}fC@i}m)6g{8xujX(YL;r_RAyto+`B>o}DzrrW%3AJvqGw1i%JSS6G#3SHi z3TI8-ptUm>orL1Zw4vd|_;DkJVx?ci(tcM5l<(C51NTO(qZ{Dj8eG3D?kKW7WC~b4 zjdgu;Go5}+|GUePt4mPZ(!Trq1U~>xO>G_{KN0&3ZAsR}jp$d7`JERb0UrjE6L;oe zYYMTOZ6$Y%NNk3y`@l`t9}`Mmc5*8l2w}))jj(NmNxg(m@_pK!2e1FdNn2qBf?fD- zp7}w|xB%1)P~W>r&Gdj2iSI5H8)DxL5VI{u4|E&=$1q~T1|NP;f6@dH@5Wl=m<-p8 z>tVf|J!LIRs%lE*<9xZ85!{na8e=$;zL9rA4Y1!!%#>8)XBJ|VA zTT0c3+Xi5ZEZVW-U&pm=`LX|WNpYV4oZgIQjyqy}9xxXJmN))hZWgXCl?26p84|Xk zgiHA;j59}a^oGfaspH|rHqkV%89;azO6grT+XAt7w5)7zV%*HC9X&dLRx(pl$z%%$ zyw*?;lB2#zz39TNQ?9&ACtBFl>Oq-*^X~8~Wxp}|!C-m8^DU>Jsk{SvI|(rU1Z)py zmB`hvAxg@bpZ1j$?EJI-(BnV5JDT2KYvOIFp8o9Lbi?B3llwS!KPB`)3_9}-&_s*e z3ZE~>OEtOuzUiYq^Rk;k-Fqt+I-TCyiC(alui(qqBnoBSO04ZXp;dlJkT`UkQ3~m& zE_zVaDFr6a%2~tCai<}t$kLPLC5DxghbKgM9@vH_n=j<%8JP17PY%n- z%;-W!PeoJnG#Rf_78s5W>vuOXT{Yg=2k#5l`#rMT0u(rCN5!>+Q&AZKZvGQ4wPW$uZaTJ*B4Ph>Irn zmd#!)DK8hE#1Rosd-C!M6uLG-kC9hZ<99Pw9CnkrX1GXmOdQ&!P&Hl~?{tar{pBH* zeeW{|WS20;zAvgDzeI<9Nw?!ulc9MIJ3tmiUd)Unuqy*)lAZ9K zgcwS2uh5cSlH-5VEi@Al^HHc!(*9K&6Pih$eiLPZ?vgE0xYv?q>I zEp=$ev&BcjoW3?z#jLO2kj*Ci@uD}!HZkwD>>O@q;iaE{RO5!BP0?Tt3*6w0>Giff~1?v0qeL~Fl6&W4Z+~}+~x4n|1 z&_lGWyR&@>&?<<16`J=ARY~v|2kj(-C+oiI=2}aO zb&JfYv)`m284}6Vq7!Czc)5T<7Zrmm->lj~f_O$_5=)jQ-?S`%N_<)zw>Aw;9Bo$P9{Z^8OhGl1fB$MrIo6 zpEJKeQn{BSSl24{&a)n(Ij;15h_5VqD%Y_Lc*n2<-tKA#Q8FPFc&c+7j<9ZM@UVFR-1Zdj>91x_NrB(^?Cz~|H#I25cpr*Zx`^8(@MIvB0W6X zdF9T`ouIvBKj?X#4c_3~nXND1fqxxpB(#AF7-UST7}x{O<@mRsPH%YEPYzp$A@xb_ z$_CIM)VZ~1o4m#S^w`bU`~T8|AiJ-;PL=#TyqIc&q0hz~$rIcA8DqYWWu(CcM>F(z zh%%{kqK0bVDN|orv%XQHM!;h2z+&yV3eDduKQ#UdM5e;eZV@f+%z!+BjQ3GnyZ6UO zRqm(vVfl64hdp_#S<_}iZB7Br7vif+S=Hk+{(7PZiJ7znWnY<(f(Z2zw0C|?VD$6E z;iU`7s+3gI1vW`QO^jnB#mmh+YLRu8W^}qmx2>i_!?x~=kGNT2zOwEc`2+7{37)4w z`OWDQZp5nk+3`AG%xBCYFDAavY#&NuAOBluM+haUf1t`_#aAs+?7fAGlG#BNBm}n@ zpkFoK$b5Ecv5ABXP(Fy-CE1Pjcpx+B^_n5Fn>>vTyV_(e_V>p}I|>s}h<-zJci^+A z|I=-;X8imgQP!h3_m}wJO9|_nUTIgqz7rJAl761wN&nN|iCZW6qXEy$Xyq0h-Ta>9 zbNzh!q51pD6p*!t!G%F?b%KWL7auyyD`j$4;+8OA6;_Dx zPjPMQ^$nj`ydDfnfiP1ka*lKT8=7mc2UGU zh=!{;#L#d)J#JVYr_-D1-=>~;QivHnEb{Jz5W*ip%6jpMGf-YtlO_6A(mAa9Qp>uT z4MODH@lMG`Sw?E9UgQV0Lqh8dkq1853n=iSsX)IdLX@Sw84oI5qU+Zf#0r{PP`+SV zJdNz6x6&$#PKb|RbX_1J2rptJ=A;wAIuQMzp%Gat!((qyJ_LzBL6hx)x@m(YYUf&{ zO(E3|8aq|{kk1PiQP9BTJ;cdb=)wxg5sEc0FJc0PFy|vMI%&<5XmyqKs6Gf$y1laB z1%I10+R4PqQ9_7qA>&iAHPjQP`%q81D7x6FcX*izIL+W$^{ic9Ks0++@)``4^icS0 zMXL9TlJb7|uJo%Pe=GCqSI+5YzQHHz%|z8e4g?bv zui5uo_k(j%d;6wm-EU)1&P>u0Q|Wl!;TtdyQl-QZ#8e{HQ2n?bJWV)T zuLbm{_q?4AU+u^v--V_A#hm9^d&q5&7xA3r8M|_7$*?x3QPMEUUsdh(%F6Fdi(nANt;fzrZXR*AQn<2=#$_{Z7R>wCf1qX^;4)hQ zczt0Erg3~dxc+o&dut~ybzx_&E##sDT}uL{{jdzu;sFx*MgNj6mNDHVa~v;YLA0lr zyGebNH}M@ERBb}2`yefI%v9MT(L;tM?sEp-tLzGw2LY3=N?w7U(y7rrPB!qsXGmsM zd5?#-Rvz-u!?l9wA64?WJ7m?$Hc%J5`i<(rh2% zHlL;Q(-)!WU+O3+NmhX_tJ<9*%{Ms1o@gaqayTwYoi6u{AFgkzU0HgaP&Eebvu7R5 z@Q=GPAco4XbpGgM?41|L>n*eyF5J`E*d^NxE#JY$*!paDyiF=NP3NNAiw&a=7&6eb zN<R7|cIbf~=c(iI(*c z2;j__r0ihNhjZ%pOaE0&c^rrR@ikMtEbPFf_b9y0e)6*~TS z1J3a?-!@NNWm-uVlF4CYwU*2eWVMc{T~Ik=3TLZHny}92I1bu<1gy(^Igc_&^6pV1 zh!_En8=^R9=Phs=#l>~69J<|(-Y2G{2@6!Vl{~K``5&)rlGoWSy_;Ia3>p+U4vx=5 zTPeVUQs|`Ly8Or(P26J$a}l)6cEn)%^36%Us@>`*u295UY?)*c;q^%F6LHgA+0wLF zS%FJg{qW_Oz$0wRDg(EWuZ$j#oyNxTh#JHHyf#h&YBJeHF=EUHy^~fOVVh`~rijc31E*D+Cx` zURC_*Tozk~)?o8Jr)ddNCqC$BRTX1bXj9SbR?X|f(&lBaqE>Nzi>eZhSElLSld64- zx(n5s%hf(#r6kstF94q1^cCIpWbf{pwndm~Ynjpq6&{pMP4np~GueeGc-D)e41d6x zALE#Yz1K;}KOqsX`xYkzBr>Nw7U$??h|{_;B_t0teP`2u(@g;TE=YwOL`*M>u1RzNI{u>4Dl`*gfW=qEl;nIDglk;Y{zMV9!jzt8|Pid4md(NmqsS$T)EW zRS66a;(1(MTc{Q#HOW%-QR-);G=<5vhkVqA@_`&{!LPQ_LBW2-04qbl)yvpcfQ~H4(AqV?dz04~5N-sS$aEh0G@lggWIc}vjI^Y$@ zWZ!~d;AwwGM!bcw_!b-3wM*d>B~5J2+_h9Iz>8DIi{3);+4L+t zdj-47Y=J(=Bz45OWoQ5mi}u5}4aXhcEba}W-rA4Qk7eW- ztG3i}krv1UC+<_}U+dgpCLob|dlG#4yZE(b)l|V3#5(mE^&3pH&9rC7j;PDq@8Xld#Ht!-(Zr?8~1gH5bKKA5JAW`S0JjY&&)+@oc1giPqexX>^@z zTirGCf|p+&aK4c+MwsTZm5DE)xNTRMCYNYe+65rO{>?Tj6SP#1XMw5m(B+#E$Z4}> zN44YNogzJ^UK;ztw2P~6yRZ3r+hN2d=@P!R)1d`{gE3Rakk#)lD+7xGG~_IQ5t_exJ|%!g zjki3PYWXq0z1M5l#M>UlXlwF{v-F*@#l~4C!DY;gGx>ZipE9E>9lC+c?xtBz`7vn^ zVzU`Jr3};k&G@BEbt$rEY0zboU4%~TNB+WDyfnWSHO!(v_*U(ft?6A)UBbsTOBOAZ zmdTuC=TJ@G+4-sd4*b6J`?2ql~*U%FGJo^&78D%CL!`oKZd<}ZL*DDDL0?*X&>rt5&2^ltLe zkOQqChbmgL3(QJN!z(~zvM(?iO%vg%f`q4;rvc!ZLLrJ5A^X@927m=d<$-3tUUb($ zX${spySyGv4G1=F5_{*}Q^3XChc9WVPWhFr%!-CGD`yMv>wwy)u^;c)88*Q&0wr5E z#9p($vqb*Y2Ke%|g-I`X(wnU%xo)W8jk<5mqcZh1knGGgxE?~lDH73Op{+KLZU81zG0oX4Gj?H#M~(E|dw9I4^o9-Zx%acj zJQrCESNDaIasz8+N}^8Z=(VuF*CX(!C&T*W)YqY%Pt@BR=FR83mTxj(U51PfgY~<< zuAzCe_8k|W(d1*$R3m}-T{Q51%o>&#Sv@)6+yjCO>$ZU2crGXBI6N75I+)}W5gABa z0~tL|&CXpEye!SU_u9f|gNd^9_W)RR*B{HoszHH$* zsv3^Wy_#k|*T@V!q0z(6%jn}@PcaAv8+&pXEZ!h?mkQgTvH}x@P+@%P!}YY^#vkk! zu5T3^7&`2of5NXG-yTYAt6X%4dYa1$A)M4IOp+X%iDOq{FcOcX6RL!B^X|L%ERfoe zh{NC)tY^sFk!b*Rk&NQE^jXe1WNE$ZTpY+cg}?uJBXg|J+Q`a~chXi=d^SD(FAx#s zbg^(x{d}K?P>a)QFCUCgC4%kGm~X&+>BB#%jf4AI-JN9jAx{0?FvrSyu@eIzejE+} z;`fO_IGcE{Y@*C*pjb{J8-%!?YN@yom5wH;v{yRDX>*}Qms@EruaW|#Cyi8ACFf}R z{q1l?tQ_kbIl9WX&;DmeHVe79IIvOjJGE~c;@coQ3R?fa_ki}0zlt5JS7n#C5>q|@ zVwi=-<1D`rEDjRAmeA3b0fpWH(`CB8eJPOsj8^gunLgtHT0_zbd4&8KiHpECspwAl z|J19wlnq<8P?Ck^O&XSTm@B&3dySd&j6PwPF?pT134{Q`Uoy$r`FZ%U^&JbUM{H%@ z>p0)TI`E^v;Cw;<4$gN@n{WvgndssxXJ&Q}LNEMYwr0KmkExF}oG)=5=lge3!aG5c z1C@)j53jI9qhUdgQGI&BMHoVg>4T#;+NW;|>O&wsrEg(Ek@d*oYrc7_xzsrbmV4i zv}#q^!j(NA`&|O9RJci*P2dJwkx753m;MsM!(o4_WvEbb)luRQJ_=!nI4hz%+Ix`L zeiT~Xt1~Da(o6kA8!zTS&zY1xfOrln0ivz&FL3$)Al~(a2E{+tab6I(xv+lXcCw&#np1)C8@jpF*CI3zwLVEQj2sttWrF< zZJPdJQl}b_0aI>?%DjIg*t3ABG$G9WaA-nWTX~H$V zo=YCT_y<_6IwCF!rD{URUP4i#2K@$~W=D)oA<^*?ANQBMNbN*3O3v*il4c_;m6M~0 zfrO)G?KMy@X$jN+)i#PnD0(G6%F?ga-HSs z(e^e3ng7}n1?1)`B74dFRlUR0iuQJp&96VYok@Qnw~%iZ*}~-QtL@5DwFz@3-xodd zj+%xMe|vGb7<~v#ahru`qa}kM-?Ct0|{GCV$@q(XkK>GD`PO{nWT&R{if`_CO>cbv zN;*P-Ne|`YBaS(R-stg=i}%dR?@ZAcLHMqIBix75?9>7JgJSMAXQSi=vb5Z0V3)T% z2kjS~o5ELcs{KoD&9MC$#%7U)m;;3{sE7@`{I~|-uX>T(n9!2)K=#lj0K_Ue1mz#Z zo2-gJDC$BrUymx6PZ^u$lnLQ_@Yc2w>r`-OBwf^+20&&>Ywwl&>QM-9^(YF%MsDO2 zQxCVVF3@wpLF6(;qEqZ+)M-1_HzpBTJ|~6i+kiL}z~gAsYRge{_+)EfzU`stoW69d ztpariNeBz)uz{|Jp>aSM3d$r9%G`dZDhWi};bRyktH$-G6otKFiU70X7#7Wgc)C&{ z*grDjIaAx)P=M~thgTdD5dsa@L!5gSPj>eJf!px7QS~IjuuEWKgVuE4-kaS%-*5gG z*bCQ(!gbU!<_WXnaJ5IE&$De#Uip|fdf}Pq)KNN%SvATqgG%*TU(_HavQyRToxGe@ z?3%M&+Q(z;@U1DPEaOvq$dvvOwysh+x^piHpfC;sbg`h-YNvD=2wuU$O?c;Up~AFR z9;u1cn6G=X`)S*btR=L0&ZJ+>WhfY=lRosuQwW^Y0E9V_O~Igi8~xH7VwNmO*eOg5 zCuzB4L7j}x&5wL7;XV{B$2MOhe>*~(rM-vNS?dD;K9+e8pnms|6;jd93ya%o09JWc zt9%A|DLkLLk0L^^1adP6gm_ddkwZEry=ivBVcmY0n1@qib&R-B zR3oA2sIXwh8qBz?Lnb9|e(UesRyP}j0>$J~-;-(xPK_RFZ^!@xT@f4YL3E)@3mPsMIRSsEz&3{)-{p%=7OnY%TI1a>D;2 z0pmX({e5J7Z|+aco1O){1|IQ0X!K}+y~^~enjcQ29#ut_2v|e;A5h6^jT&B3eri~! zk9LBN2Vh>S%gv!$NsnCs(Tjiv`)!IuM0F@RE+s?g^P_umYzD?(VvCviX5Cn{?-7s<0*ABBvXx zqO2HIzvxbf?IHhf7{5K_HRIQ@X8bz0jGx9c0teKrsmej3g@<8su&}ji&hevDfZx|( zP$*8#r49>OljxKckoMr0H!L$hxcw+Z!~v;QUWWw9G7J+-n%DAhqX5IJtsX*F6lza# zb^m9^$&#VNo~OQ87%!`>U#J$zEp>)I>Y_aS4(;E<@vPAemF>#Nwd4Wlg9;L? zTl{x&=Pqbj0Aq#P>mL%?m#&%Gce

DrwW}=16Q`u9^?+YELox?{&O|>&Rq45z`p8 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 literal 0 HcmV?d00001 diff --git a/vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js b/vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js new file mode 100644 index 0000000..6696c27 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEditorProvider = void 0; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const helpers_1 = require("../helpers"); +// Base class with reusable webview logic +class BaseEditorProvider { + htmlFileName; + providerName; + constructor(htmlFileName, providerName) { + this.htmlFileName = htmlFileName; + this.providerName = providerName; + } // HTML file provided by child + async openCustomDocument(uri) { + return { uri, dispose() { } }; + } + loadHtml(webview) { + // Compute the provider folder name by stripping "Provider" from the class name + const providerFolder = this.providerName; + // Path to compiled JS output + provider folder + const htmlPath = path.join(__dirname, '..', providerFolder, this.htmlFileName); + let html = fs.readFileSync(htmlPath, 'utf8'); + const nonce = (0, helpers_1.getNonce)(); + html = html.replace(' + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js new file mode 100644 index 0000000..4385eea --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js @@ -0,0 +1,62 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DisasmEditorProvider = void 0; +const fs = __importStar(require("fs")); +const helpers_1 = require("../helpers"); +const BaseEditorProvider_1 = require("../BaseProvider/BaseEditorProvider"); +class DisasmEditorProvider extends BaseEditorProvider_1.BaseEditorProvider { + constructor() { + super('DisasmEditorProvider.html', "DisasmEditor"); + } + async onDidResolveWebview(webviewPanel, document) { + fs.readFile(document.uri.fsPath, (err, data) => { + if (err) { + webviewPanel.webview.postMessage({ + type: 'error', + message: err.message + }); + return; + } + const rows = (0, helpers_1.disassemble)(data); + webviewPanel.webview.postMessage({ + type: 'disasm', + rows + }); + }); + } +} +exports.DisasmEditorProvider = DisasmEditorProvider; +//# sourceMappingURL=DisasmEditorProvider.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map new file mode 100644 index 0000000..49b0e6a --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DisasmEditorProvider.js","sourceRoot":"","sources":["../../src/disasmEditor/DisasmEditorProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AAEzB,wCAAmD;AACnD,2EAAwE;AAGxE,MAAa,oBAAqB,SAAQ,uCAAkB;IACxD;QACI,KAAK,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAES,KAAK,CAAC,mBAAmB,CAC/B,YAAiC,EACjC,QAA+B;QAE/B,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,IAAI,GAAG,EAAE,CAAC;gBACN,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC7B,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,CAAC,OAAO;iBACvB,CAAC,CAAC;gBACH,OAAO;YACX,CAAC;YAED,MAAM,IAAI,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAC;YAC/B,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC7B,IAAI,EAAE,QAAQ;gBACd,IAAI;aACP,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAzBD,oDAyBC"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html new file mode 100644 index 0000000..ea1a74d --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html @@ -0,0 +1,14 @@ + + + +

Disasm Panel Loaded

+ + + + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js new file mode 100644 index 0000000..6d18920 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js @@ -0,0 +1,53 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DisasmPanelProvider = void 0; +const vscode = __importStar(require("vscode")); +const BasePanelProvider_1 = require("../BaseProvider/BasePanelProvider"); +class DisasmPanelProvider extends BasePanelProvider_1.BasePanelProvider { + constructor() { + super('disasmPanel', 'DisasmPanelProvider.html', "DisasmPanel"); // HTML file + } + onDidResolveWebviewView(webviewView) { + // Listen to messages from the webview + webviewView.webview.onDidReceiveMessage(msg => { + if (msg.command === 'connect') { + vscode.window.showInformationMessage('Panel works!'); + } + }); + } +} +exports.DisasmPanelProvider = DisasmPanelProvider; +//# sourceMappingURL=DisasmPanelProvider.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map new file mode 100644 index 0000000..21a3739 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DisasmPanelProvider.js","sourceRoot":"","sources":["../../src/disasmPanel/DisasmPanelProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,yEAAsE;AAEtE,MAAa,mBAAoB,SAAQ,qCAAiB;IACtD;QACI,KAAK,CAAC,aAAa,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY;IACjF,CAAC;IAES,uBAAuB,CAAC,WAA+B;QAC7D,sCAAsC;QACtC,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;YAC1C,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACzD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAbD,kDAaC"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/analyzer.js b/vscode/cds-dis/cds-dis/out/analyzer.js new file mode 100644 index 0000000..21ec936 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/analyzer.js @@ -0,0 +1,903 @@ +"use strict"; +/** + * MIPS Disassembler and Analyzer + * Provides comprehensive analysis including function detection, cross-references, and register tracking + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getNonce = getNonce; +exports.formatBytes = formatBytes; +exports.disassemble = disassemble; +/** + * Analysis context for tracking state across instructions + */ +class AnalysisContext { + functions = new Map(); + xrefs = new Map(); // target -> [sources] + labels = new Map(); + registers = Array(32).fill(null).map(() => ({})); + /** + * Add a cross-reference from source to target + */ + addXref(source, target) { + if (!this.xrefs.has(target)) { + this.xrefs.set(target, []); + } + this.xrefs.get(target).push(source); + } + /** + * Register a function at the given address + */ + registerFunction(addr, name) { + if (!this.functions.has(addr)) { + this.functions.set(addr, { + startAddr: addr, + name: name || `func_${addr.toString(16).padStart(8, '0')}`, + calls: [], + calledFrom: [] + }); + } + } + /** + * Add a function call relationship + */ + addFunctionCall(from, to) { + const fromFunc = this.findFunction(from); + const toFunc = this.findFunction(to); + if (fromFunc && toFunc) { + if (!fromFunc.calls.includes(to)) { + fromFunc.calls.push(to); + } + if (!toFunc.calledFrom.includes(from)) { + toFunc.calledFrom.push(from); + } + } + } + /** + * Find which function contains the given address + */ + findFunction(addr) { + for (const func of this.functions.values()) { + if (addr >= func.startAddr && (!func.endAddr || addr < func.endAddr)) { + return func; + } + } + return undefined; + } +} +/** + * Generate a nonce for webview security + */ +function getNonce() { + let text = ""; + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return text; +} +/** + * Format a buffer as hex bytes (little-endian display) + */ +function formatBytes(bytes) { + return [...bytes] + .reverse() + .map((b) => b.toString(16).padStart(2, "0")) + .join(" "); +} +/** + * Main disassembly function with comprehensive analysis + * @param startAddr - Virtual address where disassembly begins + * @param buffer - Binary data to disassemble + * @returns Array of disassembled instructions with analysis + */ +function disassemble(startAddr, buffer) { + const rows = []; + const context = new AnalysisContext(); + // First pass: Disassemble and identify functions/branches + for (let offset = 0; offset < buffer.length; offset += 4) { + const slice = buffer.slice(offset, offset + 4); + if (slice.length < 4) + break; + const currentAddr = startAddr + offset; + const instr = slice.readUInt32LE(0); + // Detect function entry points (common patterns) + if (offset === 0 || isFunctionEntry(instr, buffer, offset)) { + context.registerFunction(currentAddr); + } + // Analyze instruction for branches/calls + analyzeInstruction(instr, currentAddr, context); + } + // Second pass: Generate disassembly with analysis + for (let offset = 0; offset < buffer.length; offset += 4) { + const slice = buffer.slice(offset, offset + 4); + if (slice.length < 4) + break; + const bytesLE = Array.from(slice) + .reverse() + .map(b => b.toString(16).padStart(2, '0').toUpperCase()) + .join(' '); + const instr = slice.readUInt32LE(0); + const currentAddr = startAddr + offset; + const decoded = decodeMIPS(instr, currentAddr, context); + if (decoded) { + // Add cross-references + const xrefs = context.xrefs.get(currentAddr); + const xrefComment = xrefs ? `; XREF: ${xrefs.map(x => `$${x.toString(16).padStart(8, '0')}`).join(', ')}` : ''; + rows.push({ + addr: currentAddr.toString(16).toUpperCase().padStart(8, "0"), + bytes: bytesLE, + label: context.labels.get(currentAddr) || decoded.label || "", + op: decoded.op, + args: decoded.args, + comment: [decoded.comment, xrefComment].filter(Boolean).join(' '), + xrefs: xrefs?.map(x => x.toString(16).padStart(8, '0')) + }); + } + } + console.log('Disassembled', rows.length, 'instructions'); + console.log('Detected', context.functions.size, 'functions'); + return rows; +} +/** + * Detect if instruction is likely a function entry point + */ +function isFunctionEntry(instr, buffer, offset) { + const opcode = (instr >> 26) & 0x3f; + const rt = (instr >> 16) & 0x1f; + const rs = (instr >> 21) & 0x1f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + // Common function prologue: addiu sp, sp, -X (stack allocation) + if (opcode === 0x09 && rt === 29 && rs === 29 && signedImm < 0) { + return true; + } + // Check if previous instruction was a JAL (function was called) + if (offset >= 4) { + const prevInstr = buffer.readUInt32LE(offset - 4); + const prevOpcode = (prevInstr >> 26) & 0x3f; + if (prevOpcode === 0x03) { // JAL + return true; + } + } + return false; +} +/** + * Analyze instruction for branches, calls, and data flow + */ +function analyzeInstruction(instr, pc, context) { + const opcode = (instr >> 26) & 0x3f; + const rs = (instr >> 21) & 0x1f; + const rt = (instr >> 16) & 0x1f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + const target = instr & 0x3ffffff; + const funct = instr & 0x3f; + // JAL - Function call + if (opcode === 0x03) { + const targetAddr = (pc & 0xf0000000) | (target << 2); + context.addXref(pc, targetAddr); + context.registerFunction(targetAddr); + context.addFunctionCall(pc, targetAddr); + } + // JALR - Indirect function call + if (opcode === 0x00 && funct === 0x09) { + // Register-based call, harder to analyze statically + } + // Branch instructions - add cross-references + if (opcode >= 0x04 && opcode <= 0x07 || opcode >= 0x14 && opcode <= 0x17) { + const targetAddr = pc + 4 + (signedImm << 2); + context.addXref(pc, targetAddr); + } + // REGIMM branches + if (opcode === 0x01) { + const targetAddr = pc + 4 + (signedImm << 2); + context.addXref(pc, targetAddr); + } + // Track register values for pointer analysis + // LUI - Load upper immediate (often used for address loading) + if (opcode === 0x0f) { + context.registers[rt].value = imm << 16; + context.registers[rt].source = `lui $${imm.toString(16)}`; + } + // ORI/ADDIU - Complete address loading + if ((opcode === 0x0d || opcode === 0x09) && context.registers[rs].value !== undefined) { + context.registers[rt].value = (context.registers[rs].value + signedImm) >>> 0; + context.registers[rt].isPointer = true; + } +} +/** + * Decode a single MIPS instruction + * @param instr - 32-bit instruction word + * @param pc - Program counter (current address) + * @param context - Analysis context for labels and cross-references + * @returns Decoded instruction or null + */ +function decodeMIPS(instr, pc, context) { + const opcode = (instr >> 26) & 0x3f; + const rs = (instr >> 21) & 0x1f; + const rt = (instr >> 16) & 0x1f; + const rd = (instr >> 11) & 0x1f; + const sa = (instr >> 6) & 0x1f; + const funct = instr & 0x3f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + const target = instr & 0x3ffffff; + const code = (instr >> 6) & 0xfffff; + // Register name lookup + const reg = (r) => { + const names = [ + "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", + "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", + "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", + ]; + return names[r]; + }; + const freg = (r) => `f${r}`; + // Format signed immediate with 4-digit hex padding + const formatImm = (val) => { + const hex = (val & 0xffff).toString(16).toUpperCase().padStart(4, '0'); + return `$${hex}`; + }; + // Format branch with target address and instruction count + const formatBranch = (targetAddr, offset) => { + const addrHex = (targetAddr >>> 0).toString(16).toUpperCase().padStart(8, '0'); + const instrCount = offset / 4; + const sign = instrCount >= 0 ? '+' : ''; + const arrow = instrCount >= 0 ? '▼' : '▲'; + // Add label if function exists at target + const func = context.functions.get(targetAddr); + const label = func ? ` ; ${func.name}` : ''; + return `$${addrHex} (${sign}${instrCount}${arrow})${label}`; + }; + // Format jump target address + const formatAddr = (addr) => { + const hex = (addr >>> 0).toString(16).toUpperCase().padStart(8, '0'); + const func = context.functions.get(addr); + const label = func ? ` ; ${func.name}` : ''; + return `$${hex}${label}`; + }; + // Generate analysis comments + let comment = ""; + if (instr === 0) { + return { op: "nop", args: "", comment: "; no operation" }; + } + // SPECIAL opcode (0x00) + if (opcode === 0x00) { + switch (funct) { + case 0x00: + return sa === 0 ? { op: "nop", args: "", comment } : { op: "sll", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x02: + return { op: "srl", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x03: + return { op: "sra", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x04: + return { op: "sllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x06: + return { op: "srlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x07: + return { op: "srav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x08: + comment = rd === 31 ? "; return from function" : ""; + return { op: "jr", args: reg(rs), comment }; + case 0x09: + comment = "; call via register"; + return rd === 31 ? { op: "jalr", args: reg(rs), comment } : { op: "jalr", args: `${reg(rd)}, ${reg(rs)}`, comment }; + case 0x0a: + return { op: "movz", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0b: + return { op: "movn", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0c: + return { op: "syscall", args: code > 0 ? `${code}` : "", comment: "; system call" }; + case 0x0d: + return { op: "break", args: code > 0 ? `${code}` : "", comment: "; breakpoint" }; + case 0x0f: + return { op: "sync", args: sa > 0 ? `${sa}` : "", comment }; + case 0x10: + return { op: "mfhi", args: reg(rd), comment: "; move from HI" }; + case 0x11: + return { op: "mthi", args: reg(rs), comment: "; move to HI" }; + case 0x12: + return { op: "mflo", args: reg(rd), comment: "; move from LO" }; + case 0x13: + return { op: "mtlo", args: reg(rs), comment: "; move to LO" }; + case 0x14: + return { op: "dsllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x16: + return { op: "dsrlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x17: + return { op: "dsrav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x18: + return rd === 0 ? { op: "mult", args: `${reg(rs)}, ${reg(rt)}`, comment } : { op: "mult", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: + return rd === 0 ? { op: "multu", args: `${reg(rs)}, ${reg(rt)}`, comment } : { op: "multu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: + return { op: "div", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: + return { op: "divu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1c: + return { op: "dmult", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1d: + return { op: "dmultu", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1e: + return { op: "ddiv", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1f: + return { op: "ddivu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x20: + return { op: "add", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x21: + return { op: "addu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x22: + return { op: "sub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x23: + return { op: "subu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x24: + return { op: "and", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x25: + return { op: "or", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x26: + return { op: "xor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x27: + return { op: "nor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x28: + return { op: "mfsa", args: reg(rd), comment }; + case 0x29: + return { op: "mtsa", args: reg(rs), comment }; + case 0x2a: + return { op: "slt", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment: "; set if less than" }; + case 0x2b: + return { op: "sltu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment: "; set if less than unsigned" }; + case 0x2c: + return { op: "dadd", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x2d: + return { op: "daddu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x2e: + return { op: "dsub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x2f: + return { op: "dsubu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x30: + return { op: "tge", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x31: + return { op: "tgeu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x32: + return { op: "tlt", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x33: + return { op: "tltu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x34: + return { op: "teq", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x36: + return { op: "tne", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x38: + return { op: "dsll", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3a: + return { op: "dsrl", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3b: + return { op: "dsra", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3c: + return { op: "dsll32", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3e: + return { op: "dsrl32", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3f: + return { op: "dsra32", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + } + } + // REGIMM opcode (0x01) - Branch instructions + if (opcode === 0x01) { + switch (rt) { + case 0x00: + return { op: "bltz", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x01: + return { op: "bgez", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x02: + return { op: "bltzl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x03: + return { op: "bgezl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x08: + return { op: "tgei", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x09: + return { op: "tgeiu", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0a: + return { op: "tlti", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0b: + return { op: "tltiu", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0c: + return { op: "teqi", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0e: + return { op: "tnei", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x10: + return { op: "bltzal", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment: "; branch and link" }; + case 0x11: + return { op: "bgezal", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment: "; branch and link" }; + case 0x12: + return { op: "bltzall", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x13: + return { op: "bgezall", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x18: + return { op: "mtsab", args: `${reg(rs)}, ${formatImm(imm)}`, comment }; + case 0x19: + return { op: "mtsah", args: `${reg(rs)}, ${formatImm(imm)}`, comment }; + } + } + // J and JAL (0x02, 0x03) - Jump instructions + if (opcode === 0x02) { + return { op: "j", args: formatAddr((pc & 0xf0000000) | (target << 2)), comment }; + } + if (opcode === 0x03) { + comment = "; call function"; + return { op: "jal", args: formatAddr((pc & 0xf0000000) | (target << 2)), comment }; + } + // Branch instructions (0x04-0x07, 0x14-0x17) + if (opcode === 0x04) + return { op: "beq", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x05) + return { op: "bne", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x06) + return { op: "blez", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x07) + return { op: "bgtz", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x14) + return { op: "beql", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x15) + return { op: "bnel", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x16) + return { op: "blezl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x17) + return { op: "bgtzl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + // Immediate arithmetic/logical (0x08-0x0f, 0x18-0x19) + if (opcode === 0x08) { + comment = rs === 29 && signedImm < 0 ? "; allocate stack frame" : ""; + return { op: "addi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + } + if (opcode === 0x09) { + comment = rs === 29 && signedImm < 0 ? "; allocate stack frame" : rs === 29 && signedImm > 0 ? "; deallocate stack frame" : ""; + return { op: "addiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + } + if (opcode === 0x0a) + return { op: "slti", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + if (opcode === 0x0b) + return { op: "sltiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0c) + return { op: "andi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0d) + return { op: "ori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0e) + return { op: "xori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0f) { + comment = "; load upper immediate"; + return { op: "lui", args: `${reg(rt)}, ${formatImm(imm)}`, comment }; + } + if (opcode === 0x18) + return { op: "daddi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + if (opcode === 0x19) + return { op: "daddiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + // Load instructions (0x1a-0x1b, 0x20-0x27, 0x37) + if (opcode === 0x1a) + return { op: "ldl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x1b) + return { op: "ldr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x20) + return { op: "lb", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load byte" }; + if (opcode === 0x21) + return { op: "lh", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load halfword" }; + if (opcode === 0x22) + return { op: "lwl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x23) + return { op: "lw", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load word" }; + if (opcode === 0x24) + return { op: "lbu", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load byte unsigned" }; + if (opcode === 0x25) + return { op: "lhu", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load halfword unsigned" }; + if (opcode === 0x26) + return { op: "lwr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x27) + return { op: "lwu", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x37) + return { op: "ld", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load doubleword" }; + // Store instructions (0x28-0x2f, 0x3f) + if (opcode === 0x28) + return { op: "sb", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store byte" }; + if (opcode === 0x29) + return { op: "sh", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store halfword" }; + if (opcode === 0x2a) + return { op: "swl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2b) + return { op: "sw", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store word" }; + if (opcode === 0x2c) + return { op: "sdl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2d) + return { op: "sdr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2e) + return { op: "swr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2f) + return { op: "cache", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x33) + return { op: "pref", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x3f) + return { op: "sd", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store doubleword" }; + // Quadword loads/stores (PS2 specific - 128-bit) + if (opcode === 0x1e) + return { op: "lq", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load quadword" }; + if (opcode === 0x1f) + return { op: "sq", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store quadword" }; + // Floating point loads/stores + if (opcode === 0x31) + return { op: "lwc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x35) + return { op: "ldc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x36) + return { op: "lqc2", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x39) + return { op: "swc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x3d) + return { op: "sdc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x3e) + return { op: "sqc2", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + // MMI opcode (0x1C) - PS2 specific multimedia instructions + if (opcode === 0x1c) { + const mmiFunc = funct & 0x3f; + const mmiFmt = (instr >> 6) & 0x1f; + switch (mmiFunc) { + case 0x00: + return { op: "madd", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: + return { op: "maddu", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x04: + return { op: "plzcw", args: `${reg(rd)}, ${reg(rs)}`, comment }; + case 0x08: + switch (mmiFmt) { + case 0x00: return { op: "paddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: return { op: "psubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "pcgtw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x03: return { op: "pmaxw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x04: return { op: "paddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x05: return { op: "psubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x06: return { op: "pcgth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x07: return { op: "pmaxh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x08: return { op: "paddb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x09: return { op: "psubb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pcgtb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x10: return { op: "paddsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x11: return { op: "psubsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x12: return { op: "pextlw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x13: return { op: "ppacw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x14: return { op: "paddsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x15: return { op: "psubsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pextlh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x17: return { op: "ppach", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x18: return { op: "paddsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: return { op: "psubsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: return { op: "pextlb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: return { op: "ppacb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1e: return { op: "pext5", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x1f: return { op: "ppac5", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x09: + switch (mmiFmt) { + case 0x00: return { op: "pmaddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: return { op: "pmsubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "psllvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x03: return { op: "psrlvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x04: return { op: "pmfhi", args: reg(rd), comment }; + case 0x05: return { op: "pmflo", args: reg(rd), comment }; + case 0x06: return { op: "pinth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x08: return { op: "pmultw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x09: return { op: "pdivw", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pcpyld", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0c: return { op: "pmaddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0d: return { op: "phmadh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0e: return { op: "pand", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0f: return { op: "pxor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x10: return { op: "pmsubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x11: return { op: "phmsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x12: return { op: "pexeh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x13: return { op: "prevh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x14: return { op: "pmulth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x15: return { op: "pdivbw", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pexew", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x17: return { op: "prot3w", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x10: return { op: "mfhi1", args: reg(rd), comment }; + case 0x11: return { op: "mthi1", args: reg(rs), comment }; + case 0x12: return { op: "mflo1", args: reg(rd), comment }; + case 0x13: return { op: "mtlo1", args: reg(rs), comment }; + case 0x18: + return { op: "mult1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: + return { op: "multu1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: return { op: "div1", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: return { op: "divu1", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x20: + return { op: "madd1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x21: + return { op: "maddu1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x28: + switch (mmiFmt) { + case 0x00: return { op: "pmadduw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "psravw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x03: return { op: "pmthi", args: reg(rs), comment }; + case 0x04: return { op: "pmtlo", args: reg(rs), comment }; + case 0x05: return { op: "pinteh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x08: return { op: "pmultuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x09: return { op: "pdivuw", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pcpyud", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0e: return { op: "por", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0f: return { op: "pnor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x12: return { op: "pexch", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x13: return { op: "pcpyh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pexcw", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x29: + switch (mmiFmt) { + case 0x00: return { op: "psubuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "pceqw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x03: return { op: "pminw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x04: return { op: "padsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x05: return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x06: return { op: "pceqh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x07: return { op: "pminh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pceqb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x10: return { op: "padduw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x11: return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x14: return { op: "padduh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x15: return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pextuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x18: return { op: "paddub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: return { op: "psubub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: return { op: "pextub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: return { op: "qfsrv", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1d: return { op: "pabsw", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x1e: return { op: "pabsh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x30: + const fmt = mmiFmt & 0x1f; + switch (fmt) { + case 0x00: return { op: "pmfhl.lw", args: reg(rd), comment }; + case 0x01: return { op: "pmfhl.uw", args: reg(rd), comment }; + case 0x02: return { op: "pmfhl.slw", args: reg(rd), comment }; + case 0x03: return { op: "pmfhl.lh", args: reg(rd), comment }; + case 0x04: return { op: "pmfhl.sh", args: reg(rd), comment }; + } + break; + case 0x31: + if (mmiFmt === 0x00) + return { op: "pmthl.lw", args: reg(rs), comment }; + break; + case 0x34: return { op: "psllh", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x36: return { op: "psrlh", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x37: return { op: "psrah", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3c: return { op: "psllw", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3e: return { op: "psrlw", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3f: return { op: "psraw", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + } + } + // COP0 opcode (0x10) - Coprocessor 0 (System Control) + if (opcode === 0x10) { + const cop0Func = rs; + if (cop0Func === 0x00) + return { op: "mfc0", args: `${reg(rt)}, $${rd}`, comment: "; move from CP0" }; + if (cop0Func === 0x04) + return { op: "mtc0", args: `${reg(rt)}, $${rd}`, comment: "; move to CP0" }; + if (cop0Func === 0x08) { + const bc0 = rt; + if (bc0 === 0x00) + return { op: "bc0f", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc0 === 0x01) + return { op: "bc0t", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc0 === 0x02) + return { op: "bc0fl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc0 === 0x03) + return { op: "bc0tl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + } + if (cop0Func === 0x10) { + if (funct === 0x01) + return { op: "tlbr", args: "", comment }; + if (funct === 0x02) + return { op: "tlbwi", args: "", comment }; + if (funct === 0x06) + return { op: "tlbwr", args: "", comment }; + if (funct === 0x08) + return { op: "tlbp", args: "", comment }; + if (funct === 0x18) + return { op: "eret", args: "", comment: "; exception return" }; + if (funct === 0x38) + return { op: "ei", args: "", comment: "; enable interrupts" }; + if (funct === 0x39) + return { op: "di", args: "", comment: "; disable interrupts" }; + } + } + // COP1 (FPU) opcode (0x11) - Floating Point Unit + if (opcode === 0x11) { + const cop1Func = rs; + if (cop1Func === 0x00) + return { op: "mfc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x02) + return { op: "cfc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x04) + return { op: "mtc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x06) + return { op: "ctc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x08) { + const bc1 = rt; + if (bc1 === 0x00) + return { op: "bc1f", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc1 === 0x01) + return { op: "bc1t", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc1 === 0x02) + return { op: "bc1fl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc1 === 0x03) + return { op: "bc1tl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + } + if (cop1Func === 0x10) { + // S format (single precision) + switch (funct) { + case 0x00: return { op: "add.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x01: return { op: "sub.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x02: return { op: "mul.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x03: return { op: "div.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x04: return { op: "sqrt.s", args: `${freg(sa)}, ${freg(rt)}`, comment }; + case 0x05: return { op: "abs.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x06: return { op: "mov.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x07: return { op: "neg.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x16: return { op: "rsqrt.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x18: return { op: "adda.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x19: return { op: "suba.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1a: return { op: "mula.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1c: return { op: "madd.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1d: return { op: "msub.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1e: return { op: "madda.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1f: return { op: "msuba.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x24: return { op: "cvt.w.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x28: return { op: "max.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x29: return { op: "min.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x30: return { op: "c.f.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x32: return { op: "c.eq.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x34: return { op: "c.lt.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x36: return { op: "c.le.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + } + } + if (cop1Func === 0x14) { + // W format (word fixed point) + if (funct === 0x20) + return { op: "cvt.s.w", args: `${freg(sa)}, ${freg(rd)}`, comment }; + } + } + // COP2 (VU0) opcode (0x12) - PS2 Vector Unit + if (opcode === 0x12) { + const cop2Func = rs; + if (cop2Func === 0x01) + return { op: "qmfc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x02) + return { op: "cfc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x05) + return { op: "qmtc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x06) + return { op: "ctc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x08) { + const bc2 = rt; + if (bc2 === 0x00) + return { op: "bc2f", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc2 === 0x01) + return { op: "bc2t", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc2 === 0x02) + return { op: "bc2fl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc2 === 0x03) + return { op: "bc2tl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + } + // VU0 macro mode instructions (COP2 special functions) + if ((cop2Func & 0x10) === 0x10) { + const vuFunc = funct & 0x3f; + const dest = (instr >> 21) & 0xf; // destination mask (xyzw) + const ft = (instr >> 16) & 0x1f; + const fs = (instr >> 11) & 0x1f; + const fd = (instr >> 6) & 0x1f; + const bc = (instr >> 0) & 0x3; // broadcast field + const vreg = (r) => `vf${r}`; + const vireg = (r) => `vi${r}`; + const destStr = (d) => { + if (d === 0xf) + return ""; + let s = ""; + if (d & 8) + s += "x"; + if (d & 4) + s += "y"; + if (d & 2) + s += "z"; + if (d & 1) + s += "w"; + return s ? `.${s}` : ""; + }; + const bcStr = (b) => ["x", "y", "z", "w"][b]; + // VU0 computational instructions + switch (vuFunc) { + case 0x00: return { op: "vadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x01: return { op: "vsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x02: return { op: "vmul", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x03: return { op: "vmax", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x04: return { op: "vmin", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x05: return { op: "vmul", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x06: return { op: "vmulq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x07: return { op: "vmaxi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x08: return { op: "vaddq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x09: return { op: "vsubq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x0a: return { op: "vaddi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x0b: return { op: "vsubi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x0c: return { op: "vmini", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x0d: return { op: "vadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x0e: return { op: "vsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x0f: return { op: "vopmsub", args: `${vreg(fd)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x10: return { op: "vacc", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x11: return { op: "vmsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x12: return { op: "vmadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x13: return { op: "vmmax", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x14: return { op: "vmmin", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x15: return { op: "vmsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x16: return { op: "vmsubq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x17: return { op: "vmmini", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x18: return { op: "vaddabc", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x19: return { op: "vsubabc", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x1a: return { op: "vmulabc", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x1b: return { op: "vmadda", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x1c: return { op: "vmsuba", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x1d: return { op: "vmadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x1e: return { op: "vmaddq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x1f: return { op: "vmmaxi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x20: return { op: "vaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x21: return { op: "vsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x22: return { op: "vmulai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x23: return { op: "vmaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x24: return { op: "vmsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x25: return { op: "vadda", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x26: return { op: "vsuba", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x27: return { op: "vmula", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x28: return { op: "vopmula", args: `ACC, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x29: return { op: "vnop", args: "", comment }; + case 0x2a: return { op: "vmove", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, comment }; + case 0x2b: return { op: "vmr32", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, comment }; + case 0x2c: return { op: "vlqi", args: `${vreg(fd)}${destStr(dest)}, (${vireg(fs)}++)`, comment }; + case 0x2d: return { op: "vsqi", args: `${vreg(fs)}${destStr(dest)}, (${vireg(ft)}++)`, comment }; + case 0x2e: return { op: "vlqd", args: `${vreg(fd)}${destStr(dest)}, (--${vireg(fs)})`, comment }; + case 0x2f: return { op: "vsqd", args: `${vreg(fs)}${destStr(dest)}, (--${vireg(ft)})`, comment }; + case 0x30: return { op: "vdiv", args: `Q, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x31: return { op: "vsqrt", args: `Q, ${vreg(ft)}`, comment }; + case 0x32: return { op: "vrsqrt", args: `Q, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x33: return { op: "vwaitq", args: "", comment }; + case 0x34: return { op: "vmtir", args: `${vireg(ft)}, ${vreg(fs)}`, comment }; + case 0x35: return { op: "vmfir", args: `${vreg(fd)}${destStr(dest)}, ${vireg(fs)}`, comment }; + case 0x36: return { op: "vilwr", args: `${vireg(ft)}, (${vireg(fs)})`, comment }; + case 0x37: return { op: "viswr", args: `${vireg(ft)}, (${vireg(fs)})`, comment }; + case 0x38: return { op: "vrnext", args: `${vreg(fd)}${destStr(dest)}, R`, comment }; + case 0x39: return { op: "vrget", args: `${vreg(fd)}${destStr(dest)}, R`, comment }; + case 0x3a: return { op: "vrinit", args: `R, ${vreg(fs)}`, comment }; + case 0x3b: return { op: "vrxor", args: `R, ${vreg(fs)}`, comment }; + case 0x3c: return { op: "vclip", args: `${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x3d: return { op: "vmaddaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x3e: return { op: "vmsubaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x3f: return { op: "vmulaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + } + // VU0 special instructions (lower instructions with different encoding) + const vuLower = (instr >> 25) & 0x7f; + if (vuLower === 0x30 || vuLower === 0x31 || vuLower === 0x32 || vuLower === 0x33) { + const it = (instr >> 16) & 0x1f; + const is = (instr >> 11) & 0x1f; + const id = (instr >> 6) & 0x1f; + const vireg = (r) => `vi${r}`; + switch (funct) { + case 0x30: return { op: "viadd", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + case 0x31: return { op: "visub", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + case 0x32: return { op: "viaddi", args: `${vireg(it)}, ${vireg(is)}, ${(instr & 0x1f) - ((instr & 0x10) ? 32 : 0)}`, comment }; + case 0x33: return { op: "viand", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + case 0x34: return { op: "vior", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + } + } + } + } + // If we reach here, instruction is unknown + return { op: "unknown", args: "", label: "", comment: "; unrecognized instruction" }; +} +//# sourceMappingURL=analyzer.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/analyzer.js.map b/vscode/cds-dis/cds-dis/out/analyzer.js.map new file mode 100644 index 0000000..2a54ba8 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/analyzer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,E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,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,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"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js b/vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js new file mode 100644 index 0000000..6696c27 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEditorProvider = void 0; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const helpers_1 = require("../helpers"); +// Base class with reusable webview logic +class BaseEditorProvider { + htmlFileName; + providerName; + constructor(htmlFileName, providerName) { + this.htmlFileName = htmlFileName; + this.providerName = providerName; + } // HTML file provided by child + async openCustomDocument(uri) { + return { uri, dispose() { } }; + } + loadHtml(webview) { + // Compute the provider folder name by stripping "Provider" from the class name + const providerFolder = this.providerName; + // Path to compiled JS output + provider folder + const htmlPath = path.join(__dirname, '..', providerFolder, this.htmlFileName); + let html = fs.readFileSync(htmlPath, 'utf8'); + const nonce = (0, helpers_1.getNonce)(); + html = html.replace(' - - -`; - } -} -/* ---------------- DISASSEMBLY ---------------- */ -function disassemble(buffer) { - const rows = []; - let addr = 0x00370F6C; - for (let i = 0; i < buffer.length; i += 4) { - const bytes = buffer.slice(i, i + 4); - if (bytes.length < 4) - break; - // Little-endian - const bytesLE = Array.from(bytes).reverse().map(b => b.toString(16).padStart(2, "0")).join(" "); - rows.push({ - addr: addr.toString(16).toUpperCase().padStart(8, "0"), - bytes: bytesLE, - label: i === 0 ? "FUNC_" + addr.toString(16).toUpperCase() : "", - op: "nop", - args: "", - comment: "" - }); - addr += 4; - } - return rows; -} -function getNonce() { - let text = ""; - const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) - text += chars.charAt(Math.floor(Math.random() * chars.length)); - return text; + // Custom editor + context.subscriptions.push(vscode.window.registerCustomEditorProvider('disasm.disasmEditor', new DisasmEditorProvider_1.DisasmEditorProvider(), { webviewOptions: { retainContextWhenHidden: true } })); + // Sidebar panel + context.subscriptions.push(vscode.window.registerWebviewViewProvider('disasm.disasmPanel', new DisasmPanelProvider_1.DisasmPanelProvider())); + // Command to show sidebar + context.subscriptions.push(vscode.commands.registerCommand('disasm.showPanel', () => { + vscode.commands.executeCommand('workbench.view.extension.disasmSidebar'); + })); } function deactivate() { } //# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/extension.js.map b/vscode/cds-dis/cds-dis/out/extension.js.map index 1a30dbe..f55a400 100644 --- a/vscode/cds-dis/cds-dis/out/extension.js.map +++ b/vscode/cds-dis/cds-dis/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,4BA2BC;AAED,gCAA+B;AAjC/B,+CAAiC;AACjC,wFAAqF;AACrF,qFAAkF;AAElF,SAAgB,QAAQ,CAAC,OAAgC;IAErD,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAAC,IAAI,CACtB,MAAM,CAAC,MAAM,CAAC,4BAA4B,CACtC,qBAAqB,EACrB,IAAI,2CAAoB,EAAE,EAC1B,EAAE,cAAc,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,CACxD,CACJ,CAAC;IAEF,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAAC,IAAI,CACtB,MAAM,CAAC,MAAM,CAAC,2BAA2B,CACrC,oBAAoB,EACpB,IAAI,yCAAmB,EAAE,CAC5B,CACJ,CAAC;IAEF,0BAA0B;IAC1B,OAAO,CAAC,aAAa,CAAC,IAAI,CACtB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAC1B,wCAAwC,CAC3C,CAAC;IACN,CAAC,CAAC,CACL,CAAC;AACN,CAAC;AAED,SAAgB,UAAU,KAAI,CAAC"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/helpers.js b/vscode/cds-dis/cds-dis/out/helpers.js new file mode 100644 index 0000000..92666f4 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/helpers.js @@ -0,0 +1,1816 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getNonce = getNonce; +exports.formatBytes = formatBytes; +exports.disassemble = disassemble; +exports.analyzePointers = analyzePointers; +function getNonce() { + let text = ""; + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) + text += chars.charAt(Math.floor(Math.random() * chars.length)); + return text; +} +function formatBytes(bytes) { + return [...bytes] + .reverse() + .map((b) => b.toString(16).padStart(2, "0")) + .join(" "); +} +/** + * Disassemble MIPS binary code with inline pointer calculation comments + * @param startAddr - Virtual address where disassembly begins + * @param buffer - Binary data to disassemble + * @returns Array of disassembled instructions with analysis comments + */ +function disassemble(startAddr, buffer) { + const rows = []; + const regs = new Map(); // Track register values for inline comments + /** + * Parse hex immediate from instruction args + */ + const parseInlineImm = (s) => { + const cleaned = s.replace("$", ""); + return parseInt(cleaned, 16); + }; + /** + * Get signed 16-bit immediate + */ + const getSignedInline = (val) => { + return (val << 16) >> 16; + }; + for (let offset = 0; offset < buffer.length; offset += 4) { + const slice = buffer.slice(offset, offset + 4); + if (slice.length < 4) + break; + const bytesLE = Array.from(slice) + .reverse() + .map((b) => b.toString(16).padStart(2, "0").toUpperCase()) + .join(" "); + const instr = slice.readUInt32LE(0); + const currentAddr = startAddr + offset; + const decoded = decodeMIPS(instr, currentAddr); + if (decoded) { + let inlineComment = decoded.comment || ""; + const op = decoded.op.toLowerCase(); + const args = decoded.args.split(",").map((a) => a.trim()); + // Track and comment on pointer calculations + if (op === "lui" && args.length >= 2) { + const rt = args[0]; + const imm = parseInlineImm(args[1]); + const value = (imm << 16) >>> 0; + regs.set(rt, value); + } + else if ((op === "ori" || op === "addiu" || op === "addi") && args.length >= 3) { + const rt = args[0]; + const rs = args[1]; + const imm = parseInlineImm(args[2]); + const baseValue = regs.get(rs); + if (baseValue !== undefined) { + const signedImm = getSignedInline(imm); + const result = op === "ori" ? (baseValue | imm) >>> 0 : (baseValue + signedImm) >>> 0; + regs.set(rt, result); + inlineComment = `; ${rt} = 0x${result.toString(16).toUpperCase()} (calculated addr)`; + } + else { + regs.delete(rt); + } + } + else if ((op === "addu" || op === "add") && args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + if (a !== undefined && b !== undefined) { + const result = (a + b) >>> 0; + regs.set(rd, result); + inlineComment = `; ${rd} = 0x${result.toString(16).toUpperCase()} (calculated addr)`; + } + else { + regs.delete(rd); + } + } + else if ((op === "subu" || op === "sub") && args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + if (a !== undefined && b !== undefined) { + const result = (a - b) >>> 0; + regs.set(rd, result); + inlineComment = `; ${rd} = 0x${result.toString(16).toUpperCase()} (calculated addr)`; + } + else { + regs.delete(rd); + } + } + else if (op === "sll" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + if (val !== undefined) { + const result = (val << sa) >>> 0; + regs.set(rd, result); + inlineComment = `; ${rd} = 0x${result.toString(16).toUpperCase()} (shifted ptr)`; + } + else { + regs.delete(rd); + } + } + // Clear register tracking for operations that modify registers unpredictably + else if (args.length > 0 && !op.startsWith("b") && op !== "j" && op !== "jal" && op !== "nop") { + const destReg = args[0]; + if (destReg && !destReg.includes("(") && !destReg.includes("$")) { + regs.delete(destReg); + } + } + rows.push({ + addr: currentAddr.toString(16).toUpperCase().padStart(8, "0"), + bytes: bytesLE, + label: decoded.label || "", + op: decoded.op, + args: decoded.args, + comment: inlineComment, + }); + } + } + console.log("Disassembled", rows.length, "instructions"); + if (rows.length > 0) { + console.log("First instruction:", rows[0].addr, rows[0].bytes, rows[0].op, rows[0].args); + } + return rows; +} +/** + * Analyze disassembled instructions to track register values and identify pointer references + * This performs data flow analysis to resolve memory addresses and function calls + * @param rows - Array of disassembled instructions + * @returns Array of resolved pointer references with metadata + */ +function analyzePointers(rows) { + const refs = []; + const regs = new Map(); + /** + * Parse hexadecimal immediate value from string (e.g., "$1234" -> 0x1234) + */ + const parseImm = (s) => { + const cleaned = s.replace("$", ""); + return parseInt(cleaned, 16); + }; + /** + * Convert 16-bit value to signed integer + */ + const getSignedImm = (val) => { + return (val << 16) >> 16; + }; + /** + * Determine memory access size from instruction mnemonic + */ + const getAccessSize = (op) => { + if (op.includes("b")) + return 1; // byte (lb, sb, lbu) + if (op.includes("h")) + return 2; // halfword (lh, sh, lhu) + if (op.includes("w") && !op.includes("q")) + return 4; // word (lw, sw) + if (op === "ld" || op === "sd") + return 8; // doubleword + if (op === "lq" || op === "sq") + return 16; // quadword (PS2 128-bit) + return 4; // default to word + }; + /** + * Infer data type from instruction and context + */ + const inferDataType = (op, targetAddr) => { + // Floating point operations + if (op.includes("c1") || op.includes(".s") || op.includes(".w")) { + return "float"; + } + // Vector operations (PS2) + if (op.startsWith("v") || op.includes("c2") || op === "lq" || op === "sq") { + return "vector"; + } + // Byte operations might be strings + if (op === "lb" || op === "lbu" || op === "sb") { + return "byte/char"; + } + // Check if address looks like code (aligned to 4 bytes) + if (targetAddr % 4 === 0 && targetAddr >= 0x00100000) { + return "code/function"; + } + return undefined; + }; + /** + * Check if an address is likely a function entry point + */ + const isLikelyFunction = (addr, rows) => { + // Find the row at this address + const targetRow = rows.find(r => parseInt(r.addr, 16) === addr); + if (!targetRow) + return false; + // Common function prologue patterns + const op = targetRow.op.toLowerCase(); + const args = targetRow.args.toLowerCase(); + // Stack frame allocation: addiu sp, sp, -X + if (op === "addiu" && args.includes("sp, sp") && args.includes("-")) { + return true; + } + // Save return address: sw ra, X(sp) + if (op === "sw" && args.includes("ra") && args.includes("sp")) { + return true; + } + return false; + }; + for (const row of rows) { + const instrAddr = parseInt(row.addr, 16); + const op = row.op.toLowerCase(); + const args = row.args.split(",").map((a) => a.trim()); + // LUI - Load Upper Immediate + if (op === "lui") { + if (args.length >= 2) { + const rt = args[0]; + const imm = parseImm(args[1]); + regs.set(rt, (imm << 16) >>> 0); + console.log(`LUI: ${rt} = 0x${((imm << 16) >>> 0).toString(16).toUpperCase()}`); + } + continue; + } + // ADDIU/ADDI - Add Immediate (Unsigned) + if (op === "addiu" || op === "addi") { + if (args.length >= 3) { + const rt = args[0]; + const rs = args[1]; + const imm = parseImm(args[2]); + const base = regs.get(rs); + if (base !== undefined) { + const signedImm = getSignedImm(imm); + const result = (base + signedImm) >>> 0; + regs.set(rt, result); + console.log(`ADDIU: ${rt} = ${rs}(0x${base.toString(16)}) + 0x${imm.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rt); + console.log(`ADDIU: ${rt} = unknown (${rs} not tracked)`); + } + } + continue; + } + // ADDU/ADD - Add Unsigned + if (op === "addu" || op === "add") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + if (a !== undefined && b !== undefined) { + const result = (a + b) >>> 0; + regs.set(rd, result); + console.log(`ADDU: ${rd} = ${rs}(0x${a.toString(16)}) + ${rt}(0x${b.toString(16)}) = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + } + continue; + } + // SUBU/SUB - Subtract + if (op === "subu" || op === "sub") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + if (a !== undefined && b !== undefined) { + const result = (a - b) >>> 0; + regs.set(rd, result); + console.log(`SUBU: ${rd} = ${rs}(0x${a.toString(16)}) - ${rt}(0x${b.toString(16)}) = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + } + continue; + } + // AND/ANDI - Bitwise AND + if (op === "and" || op === "andi") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rtOrImm = args[2]; + const a = regs.get(rs); + const b = op === "andi" ? parseImm(rtOrImm) : regs.get(rtOrImm); + if (a !== undefined && b !== undefined) { + const result = (a & b) >>> 0; + regs.set(rd, result); + console.log(`${op.toUpperCase()}: ${rd} = 0x${a.toString(16)} & 0x${b.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + } + continue; + } + // OR - Bitwise OR + if (op === "or") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + if (a !== undefined && b !== undefined) { + const result = (a | b) >>> 0; + regs.set(rd, result); + console.log(`OR: ${rd} = 0x${a.toString(16)} | 0x${b.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + } + continue; + } + // ORI - OR Immediate + if (op === "ori") { + if (args.length >= 3) { + const rt = args[0]; + const rs = args[1]; + const imm = parseImm(args[2]); + const base = regs.get(rs); + if (base !== undefined) { + const result = (base | imm) >>> 0; + regs.set(rt, result); + console.log(`ORI: ${rt} = 0x${base.toString(16)} | 0x${imm.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rt); + } + } + continue; + } + // XOR/XORI - Bitwise XOR + if (op === "xor" || op === "xori") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rtOrImm = args[2]; + const a = regs.get(rs); + const b = op === "xori" ? parseImm(rtOrImm) : regs.get(rtOrImm); + if (a !== undefined && b !== undefined) { + const result = (a ^ b) >>> 0; + regs.set(rd, result); + console.log(`${op.toUpperCase()}: ${rd} = 0x${a.toString(16)} ^ 0x${b.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + } + continue; + } + // NOR - Bitwise NOR + if (op === "nor") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + if (a !== undefined && b !== undefined) { + const result = (~(a | b)) >>> 0; + regs.set(rd, result); + console.log(`NOR: ${rd} = ~(0x${a.toString(16)} | 0x${b.toString(16)}) = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + } + continue; + } + // SLL - Shift Left Logical + if (op === "sll" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + if (val !== undefined) { + const result = (val << sa) >>> 0; + regs.set(rd, result); + console.log(`SLL: ${rd} = 0x${val.toString(16)} << ${sa} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + continue; + } + // SRL - Shift Right Logical + if (op === "srl" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + if (val !== undefined) { + const result = (val >>> sa) >>> 0; + regs.set(rd, result); + console.log(`SRL: ${rd} = 0x${val.toString(16)} >> ${sa} = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + continue; + } + // SRA - Shift Right Arithmetic + if (op === "sra" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + if (val !== undefined) { + const result = (val >> sa) >>> 0; + regs.set(rd, result); + console.log(`SRA: ${rd} = 0x${val.toString(16)} >> ${sa} (arith) = 0x${result.toString(16).toUpperCase()}`); + } + else { + regs.delete(rd); + } + continue; + } + // Memory operations with offset(base) format + const memArg = args.find((a) => a.includes("(") && a.includes(")")); + if (memArg) { + const match = memArg.match(/\$([0-9A-Fa-f]+)\((\w+)\)/); + if (match) { + const offset = parseImm(match[1]); + const baseReg = match[2]; + const baseValue = regs.get(baseReg); + // Only add reference if we know the base value + if (baseValue !== undefined) { + const signedOffset = getSignedImm(offset); + const targetAddr = (baseValue + signedOffset) >>> 0; + const size = getAccessSize(op); + const dataType = inferDataType(op, targetAddr); + const isFunction = isLikelyFunction(targetAddr, rows); + refs.push({ + instrAddr, + kind: op.startsWith("l") ? "load" : "store", + baseReg, + baseValue, + offset: signedOffset, + targetAddr, + size, + type: op, + dataType, + isFunction, + }); + console.log(`${op.toUpperCase()}: @0x${instrAddr.toString(16)} -> 0x${targetAddr.toString(16).toUpperCase()} ` + + `[${baseReg}=0x${baseValue.toString(16)} + ${signedOffset}] (${size} bytes${dataType ? ', ' + dataType : ''}${isFunction ? ', FUNCTION' : ''})`); + } + } + continue; + } + // JAL - Jump and Link (function call) + if (op === "jal") { + const targetMatch = args[0].match(/\$([0-9A-Fa-f]+)/); + if (targetMatch) { + const targetAddr = parseImm(targetMatch[1]); + const isFunction = isLikelyFunction(targetAddr, rows); + refs.push({ + instrAddr, + kind: "call", + baseReg: "pc", + baseValue: instrAddr, + offset: 0, + targetAddr, + type: "jal", + isFunction: true, // JAL always calls a function + dataType: "function", + }); + console.log(`JAL: @0x${instrAddr.toString(16)} -> 0x${targetAddr.toString(16).toUpperCase()} (function call)`); + } + continue; + } + // JR/JALR - Jump Register (indirect jumps/calls) + if (op === "jr" || op === "jalr") { + const reg = args[op === "jalr" && args.length > 1 ? 1 : 0]; + const baseValue = regs.get(reg); + if (baseValue !== undefined) { + const isFunction = op === "jalr" || isLikelyFunction(baseValue, rows); + refs.push({ + instrAddr, + kind: op === "jalr" ? "call" : "jump", + baseReg: reg, + baseValue, + offset: 0, + targetAddr: baseValue, + type: op, + isFunction, + dataType: isFunction ? "function" : undefined, + }); + console.log(`${op.toUpperCase()}: @0x${instrAddr.toString(16)} -> 0x${baseValue.toString(16).toUpperCase()}${isFunction ? ' (function)' : ''}`); + } + } + // Clear destination register for most other operations to avoid stale data + if (args.length > 0 && !op.startsWith("b") && op !== "j" && op !== "jal") { + const destReg = args[0]; + if (!memArg && destReg && !destReg.includes("(")) { + // Only clear if it's not a memory operation and not a branch/jump + if (!["nop", "syscall", "break", "sync", "jr", "jalr"].includes(op)) { + // Don't clear if we already handled it above + const handledOps = ["lui", "addiu", "addi", "addu", "add", "subu", "sub", + "and", "andi", "or", "ori", "xor", "xori", "nor", + "sll", "srl", "sra"]; + if (!handledOps.includes(op)) { + regs.delete(destReg); + } + } + } + } + } + console.log(`Found ${refs.length} resolved pointer references`); + return refs; +} +function decodeMIPS(instr, pc) { + const opcode = (instr >> 26) & 0x3f; + const rs = (instr >> 21) & 0x1f; + const rt = (instr >> 16) & 0x1f; + const rd = (instr >> 11) & 0x1f; + const sa = (instr >> 6) & 0x1f; + const funct = instr & 0x3f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + const target = instr & 0x3ffffff; + const code = (instr >> 6) & 0xfffff; + const reg = (r) => { + const names = [ + "zero", + "at", + "v0", + "v1", + "a0", + "a1", + "a2", + "a3", + "t0", + "t1", + "t2", + "t3", + "t4", + "t5", + "t6", + "t7", + "s0", + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "t8", + "t9", + "k0", + "k1", + "gp", + "sp", + "fp", + "ra", + ]; + return names[r]; + }; + const freg = (r) => `f${r}`; + // Format signed immediate with 4-digit hex padding + const formatImm = (val) => { + const hex = (val & 0xffff).toString(16).toUpperCase().padStart(4, "0"); + return `$${hex}`; + }; + // Format branch/jump target address with 8-digit hex padding + const formatAddr = (addr) => { + const hex = (addr >>> 0).toString(16).toUpperCase().padStart(8, "0"); + return `$${hex}`; + }; + // Format branch with target address and instruction count + const formatBranch = (targetAddr, offset) => { + const addrHex = (targetAddr >>> 0) + .toString(16) + .toUpperCase() + .padStart(8, "0"); + const instrCount = offset / 4; // Convert byte offset to instruction count + const sign = instrCount >= 0 ? "+" : ""; + const arrow = instrCount >= 0 ? "▼" : "▲"; + return `$${addrHex} (${sign}${instrCount + 1}${arrow})`; + }; + if (instr === 0) { + return { op: "nop", args: "" }; + } + // SPECIAL opcode (0x00) + if (opcode === 0x00) { + switch (funct) { + case 0x00: + return sa === 0 + ? { op: "nop", args: "" } + : { op: "sll", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x02: + return { op: "srl", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x03: + return { op: "sra", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x04: + return { op: "sllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x06: + return { op: "srlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x07: + return { op: "srav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x08: + return { op: "jr", args: reg(rs) }; + case 0x09: + return rd === 31 + ? { op: "jalr", args: reg(rs) } + : { op: "jalr", args: `${reg(rd)}, ${reg(rs)}` }; + case 0x0a: + return { op: "movz", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0b: + return { op: "movn", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0c: + return { op: "syscall", args: code > 0 ? `${code}` : "" }; + case 0x0d: + return { op: "break", args: code > 0 ? `${code}` : "" }; + case 0x0f: + return { op: "sync", args: sa > 0 ? `${sa}` : "" }; + case 0x10: + return { op: "mfhi", args: reg(rd) }; + case 0x11: + return { op: "mthi", args: reg(rs) }; + case 0x12: + return { op: "mflo", args: reg(rd) }; + case 0x13: + return { op: "mtlo", args: reg(rs) }; + case 0x14: + return { op: "dsllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x16: + return { op: "dsrlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x17: + return { op: "dsrav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x18: + return rd === 0 + ? { op: "mult", args: `${reg(rs)}, ${reg(rt)}` } + : { op: "mult", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x19: + return rd === 0 + ? { op: "multu", args: `${reg(rs)}, ${reg(rt)}` } + : { op: "multu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1a: + return { op: "div", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "divu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1c: + return { + op: "dmult", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x1d: + return { + op: "dmultu", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x1e: + return { op: "ddiv", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1f: + return { op: "ddivu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x20: + return { op: "add", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x21: + return { op: "addu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x22: + return { op: "sub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x23: + return { op: "subu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x24: + return { op: "and", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x25: + return { op: "or", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x26: + return { op: "xor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x27: + return { op: "nor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x28: + return { op: "mfsa", args: reg(rd) }; + case 0x29: + return { op: "mtsa", args: reg(rs) }; + case 0x2a: + return { op: "slt", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2b: + return { op: "sltu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2c: + return { op: "dadd", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2d: + return { op: "daddu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2e: + return { op: "dsub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2f: + return { op: "dsubu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x30: + return { op: "tge", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x31: + return { op: "tgeu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x32: + return { op: "tlt", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x33: + return { op: "tltu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x34: + return { op: "teq", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x36: + return { op: "tne", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x38: + return { op: "dsll", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3a: + return { op: "dsrl", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3b: + return { op: "dsra", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3c: + return { op: "dsll32", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3e: + return { op: "dsrl32", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3f: + return { op: "dsra32", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + } + } + // REGIMM opcode (0x01) + if (opcode === 0x01) { + switch (rt) { + case 0x00: + return { + op: "bltz", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x01: + return { + op: "bgez", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x02: + return { + op: "bltzl", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x03: + return { + op: "bgezl", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x08: + return { op: "tgei", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x09: + return { op: "tgeiu", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0a: + return { op: "tlti", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0b: + return { op: "tltiu", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0c: + return { op: "teqi", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0e: + return { op: "tnei", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x10: + return { + op: "bltzal", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x11: + return { + op: "bgezal", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x12: + return { + op: "bltzall", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x13: + return { + op: "bgezall", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + case 0x18: + return { op: "mtsab", args: `${reg(rs)}, ${formatImm(imm)}` }; + case 0x19: + return { op: "mtsah", args: `${reg(rs)}, ${formatImm(imm)}` }; + } + } + // J and JAL (0x02, 0x03) + if (opcode === 0x02) { + return { op: "j", args: formatAddr((pc & 0xf0000000) | (target << 2)) }; + } + if (opcode === 0x03) { + return { op: "jal", args: formatAddr((pc & 0xf0000000) | (target << 2)) }; + } + // Branch instructions (0x04-0x07, 0x14-0x17) + if (opcode === 0x04) + return { + op: "beq", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x05) + return { + op: "bne", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x06) + return { + op: "blez", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x07) + return { + op: "bgtz", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x14) + return { + op: "beql", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x15) + return { + op: "bnel", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x16) + return { + op: "blezl", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + if (opcode === 0x17) + return { + op: "bgtzl", + args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, + }; + // Immediate arithmetic/logical (0x08-0x0f, 0x18-0x19) + if (opcode === 0x08) + return { + op: "addi", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x09) + return { + op: "addiu", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x0a) + return { + op: "slti", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x0b) + return { op: "sltiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0c) + return { op: "andi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0d) + return { op: "ori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0e) + return { op: "xori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0f) + return { op: "lui", args: `${reg(rt)}, ${formatImm(imm)}` }; + if (opcode === 0x18) + return { + op: "daddi", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x19) + return { + op: "daddiu", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + // Load instructions (0x1a-0x1b, 0x20-0x27, 0x37) + if (opcode === 0x1a) + return { + op: "ldl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x1b) + return { + op: "ldr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x20) + return { + op: "lb", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x21) + return { + op: "lh", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x22) + return { + op: "lwl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x23) + return { + op: "lw", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x24) + return { + op: "lbu", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x25) + return { + op: "lhu", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x26) + return { + op: "lwr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x27) + return { + op: "lwu", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x37) + return { + op: "ld", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + // Store instructions (0x28-0x2f, 0x3f) + if (opcode === 0x28) + return { + op: "sb", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x29) + return { + op: "sh", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2a) + return { + op: "swl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2b) + return { + op: "sw", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2c) + return { + op: "sdl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2d) + return { + op: "sdr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2e) + return { + op: "swr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2f) + return { op: "cache", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})` }; + if (opcode === 0x33) + return { op: "pref", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})` }; + if (opcode === 0x3f) + return { + op: "sd", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + // Quadword loads/stores (PS2 specific - 128-bit) + if (opcode === 0x1e) + return { + op: "lq", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x1f) + return { + op: "sq", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + // Floating point loads/stores + if (opcode === 0x31) + return { + op: "lwc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x35) + return { + op: "ldc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x36) + return { + op: "lqc2", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x39) + return { + op: "swc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x3d) + return { + op: "sdc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x3e) + return { + op: "sqc2", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + // MMI opcode (0x1C) - PS2 specific + if (opcode === 0x1c) { + const mmiFunc = funct & 0x3f; + const mmiFmt = (instr >> 6) & 0x1f; + switch (mmiFunc) { + case 0x00: + return { + op: "madd", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x01: + return { + op: "maddu", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x04: + return { op: "plzcw", args: `${reg(rd)}, ${reg(rs)}` }; + case 0x08: + switch (mmiFmt) { + case 0x00: + return { op: "paddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x01: + return { op: "psubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x02: + return { op: "pcgtw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x03: + return { op: "pmaxw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x04: + return { op: "paddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x05: + return { op: "psubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x06: + return { op: "pcgth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x07: + return { op: "pmaxh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x08: + return { op: "paddb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x09: + return { op: "psubb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pcgtb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x10: + return { op: "paddsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x11: + return { op: "psubsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x12: + return { op: "pextlw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x13: + return { op: "ppacw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x14: + return { op: "paddsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x15: + return { op: "psubsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x16: + return { op: "pextlh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x17: + return { op: "ppach", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x18: + return { op: "paddsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x19: + return { op: "psubsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1a: + return { op: "pextlb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "ppacb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1e: + return { op: "pext5", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x1f: + return { op: "ppac5", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x09: + switch (mmiFmt) { + case 0x00: + return { op: "pmaddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x01: + return { op: "pmsubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x02: + return { op: "psllvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x03: + return { op: "psrlvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x04: + return { op: "pmfhi", args: reg(rd) }; + case 0x05: + return { op: "pmflo", args: reg(rd) }; + case 0x06: + return { op: "pinth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x08: + return { op: "pmultw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x09: + return { op: "pdivw", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pcpyld", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0c: + return { op: "pmaddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0d: + return { op: "phmadh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0e: + return { op: "pand", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0f: + return { op: "pxor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x10: + return { op: "pmsubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x11: + return { op: "phmsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x12: + return { op: "pexeh", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x13: + return { op: "prevh", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x14: + return { op: "pmulth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x15: + return { op: "pdivbw", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x16: + return { op: "pexew", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x17: + return { op: "prot3w", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x10: + return { op: "mfhi1", args: reg(rd) }; + case 0x11: + return { op: "mthi1", args: reg(rs) }; + case 0x12: + return { op: "mflo1", args: reg(rd) }; + case 0x13: + return { op: "mtlo1", args: reg(rs) }; + case 0x18: + return { + op: "mult1", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x19: + return { + op: "multu1", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x1a: + return { op: "div1", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "divu1", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x20: + return { + op: "madd1", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x21: + return { + op: "maddu1", + args: rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x28: + switch (mmiFmt) { + case 0x00: + return { + op: "pmadduw", + args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x02: + return { op: "psravw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x03: + return { op: "pmthi", args: reg(rs) }; + case 0x04: + return { op: "pmtlo", args: reg(rs) }; + case 0x05: + return { op: "pinteh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x08: + return { + op: "pmultuw", + args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x09: + return { op: "pdivuw", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pcpyud", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0e: + return { op: "por", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0f: + return { op: "pnor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x12: + return { op: "pexch", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x13: + return { op: "pcpyh", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x16: + return { op: "pexcw", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x29: + switch (mmiFmt) { + case 0x00: + return { op: "psubuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x01: + return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x02: + return { op: "pceqw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x03: + return { op: "pminw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x04: + return { op: "padsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x05: + return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x06: + return { op: "pceqh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x07: + return { op: "pminh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pceqb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x10: + return { op: "padduw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x11: + return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x14: + return { op: "padduh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x15: + return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x16: + return { op: "pextuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x18: + return { op: "paddub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x19: + return { op: "psubub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1a: + return { op: "pextub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "qfsrv", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1d: + return { op: "pabsw", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x1e: + return { op: "pabsh", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x30: + const fmt = mmiFmt & 0x1f; + switch (fmt) { + case 0x00: + return { op: "pmfhl.lw", args: reg(rd) }; + case 0x01: + return { op: "pmfhl.uw", args: reg(rd) }; + case 0x02: + return { op: "pmfhl.slw", args: reg(rd) }; + case 0x03: + return { op: "pmfhl.lh", args: reg(rd) }; + case 0x04: + return { op: "pmfhl.sh", args: reg(rd) }; + } + break; + case 0x31: + if (mmiFmt === 0x00) + return { op: "pmthl.lw", args: reg(rs) }; + break; + case 0x34: + return { op: "psllh", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x36: + return { op: "psrlh", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x37: + return { op: "psrah", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3c: + return { op: "psllw", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3e: + return { op: "psrlw", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3f: + return { op: "psraw", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + } + } + // COP0 opcode (0x10) + if (opcode === 0x10) { + const cop0Func = rs; + if (cop0Func === 0x00) + return { op: "mfc0", args: `${reg(rt)}, $${rd}` }; + if (cop0Func === 0x04) + return { op: "mtc0", args: `${reg(rt)}, $${rd}` }; + if (cop0Func === 0x08) { + const bc0 = rt; + if (bc0 === 0x00) + return { + op: "bc0f", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc0 === 0x01) + return { + op: "bc0t", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc0 === 0x02) + return { + op: "bc0fl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc0 === 0x03) + return { + op: "bc0tl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + } + if (cop0Func === 0x10) { + if (funct === 0x01) + return { op: "tlbr", args: "" }; + if (funct === 0x02) + return { op: "tlbwi", args: "" }; + if (funct === 0x06) + return { op: "tlbwr", args: "" }; + if (funct === 0x08) + return { op: "tlbp", args: "" }; + if (funct === 0x18) + return { op: "eret", args: "" }; + if (funct === 0x38) + return { op: "ei", args: "" }; + if (funct === 0x39) + return { op: "di", args: "" }; + } + } + // COP1 (FPU) opcode (0x11) + if (opcode === 0x11) { + const cop1Func = rs; + if (cop1Func === 0x00) + return { op: "mfc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x02) + return { op: "cfc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x04) + return { op: "mtc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x06) + return { op: "ctc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x08) { + const bc1 = rt; + if (bc1 === 0x00) + return { + op: "bc1f", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc1 === 0x01) + return { + op: "bc1t", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc1 === 0x02) + return { + op: "bc1fl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc1 === 0x03) + return { + op: "bc1tl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + } + if (cop1Func === 0x10) { + // S format (single precision) + switch (funct) { + case 0x00: + return { op: "add.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x01: + return { op: "sub.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x02: + return { op: "mul.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x03: + return { op: "div.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x04: + return { op: "sqrt.s", args: `${freg(sa)}, ${freg(rt)}` }; + case 0x05: + return { op: "abs.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x06: + return { op: "mov.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x07: + return { op: "neg.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x16: + return { + op: "rsqrt.s", + args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, + }; + case 0x18: + return { op: "adda.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x19: + return { op: "suba.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x1a: + return { op: "mula.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x1c: + return { + op: "madd.s", + args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, + }; + case 0x1d: + return { + op: "msub.s", + args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, + }; + case 0x1e: + return { op: "madda.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x1f: + return { op: "msuba.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x24: + return { op: "cvt.w.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x28: + return { op: "max.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x29: + return { op: "min.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x30: + return { op: "c.f.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x32: + return { op: "c.eq.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x34: + return { op: "c.lt.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x36: + return { op: "c.le.s", args: `${freg(rd)}, ${freg(rt)}` }; + } + } + if (cop1Func === 0x14) { + // W format (word fixed point) + if (funct === 0x20) + return { op: "cvt.s.w", args: `${freg(sa)}, ${freg(rd)}` }; + } + } + // COP2 (VU0) opcode (0x12) - PS2 Vector Unit + if (opcode === 0x12) { + const cop2Func = rs; + if (cop2Func === 0x01) + return { op: "qmfc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x02) + return { op: "cfc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x05) + return { op: "qmtc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x06) + return { op: "ctc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x08) { + const bc2 = rt; + if (bc2 === 0x00) + return { + op: "bc2f", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc2 === 0x01) + return { + op: "bc2t", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc2 === 0x02) + return { + op: "bc2fl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc2 === 0x03) + return { + op: "bc2tl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + } + // VU0 macro mode instructions (COP2 special functions) + if ((cop2Func & 0x10) === 0x10) { + const vuFunc = funct & 0x3f; + const dest = (instr >> 21) & 0xf; // destination mask (xyzw) + const ft = (instr >> 16) & 0x1f; + const fs = (instr >> 11) & 0x1f; + const fd = (instr >> 6) & 0x1f; + const bc = (instr >> 0) & 0x3; // broadcast field + const vreg = (r) => `vf${r}`; + const vireg = (r) => `vi${r}`; + const destStr = (d) => { + if (d === 0xf) + return ""; + let s = ""; + if (d & 8) + s += "x"; + if (d & 4) + s += "y"; + if (d & 2) + s += "z"; + if (d & 1) + s += "w"; + return s ? `.${s}` : ""; + }; + const bcStr = (b) => ["x", "y", "z", "w"][b]; + // VU0 computational instructions + switch (vuFunc) { + case 0x00: + return { + op: "vadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x01: + return { + op: "vsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x02: + return { + op: "vmul", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x03: + return { + op: "vmax", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x04: + return { + op: "vmin", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x05: + return { + op: "vmul", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x06: + return { + op: "vmulq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x07: + return { + op: "vmaxi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x08: + return { + op: "vaddq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x09: + return { + op: "vsubq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x0a: + return { + op: "vaddi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x0b: + return { + op: "vsubi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x0c: + return { + op: "vmini", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x0d: + return { + op: "vadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x0e: + return { + op: "vsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x0f: + return { + op: "vopmsub", + args: `${vreg(fd)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x10: + return { + op: "vacc", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x11: + return { + op: "vmsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x12: + return { + op: "vmadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x13: + return { + op: "vmmax", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x14: + return { + op: "vmmin", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x15: + return { + op: "vmsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x16: + return { + op: "vmsubq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x17: + return { + op: "vmmini", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x18: + return { + op: "vaddabc", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x19: + return { + op: "vsubabc", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x1a: + return { + op: "vmulabc", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x1b: + return { + op: "vmadda", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x1c: + return { + op: "vmsuba", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x1d: + return { + op: "vmadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x1e: + return { + op: "vmaddq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x1f: + return { + op: "vmmaxi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x20: + return { op: "vaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x21: + return { op: "vsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x22: + return { op: "vmulai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x23: + return { op: "vmaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x24: + return { op: "vmsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x25: + return { + op: "vadda", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x26: + return { + op: "vsuba", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x27: + return { + op: "vmula", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x28: + return { op: "vopmula", args: `ACC, ${vreg(fs)}, ${vreg(ft)}` }; + case 0x29: + return { op: "vnop", args: "" }; + case 0x2a: + return { + op: "vmove", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, + }; + case 0x2b: + return { + op: "vmr32", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, + }; + case 0x2c: + return { + op: "vlqi", + args: `${vreg(fd)}${destStr(dest)}, (${vireg(fs)}++)`, + }; + case 0x2d: + return { + op: "vsqi", + args: `${vreg(fs)}${destStr(dest)}, (${vireg(ft)}++)`, + }; + case 0x2e: + return { + op: "vlqd", + args: `${vreg(fd)}${destStr(dest)}, (--${vireg(fs)})`, + }; + case 0x2f: + return { + op: "vsqd", + args: `${vreg(fs)}${destStr(dest)}, (--${vireg(ft)})`, + }; + case 0x30: + return { op: "vdiv", args: `Q, ${vreg(fs)}, ${vreg(ft)}` }; + case 0x31: + return { op: "vsqrt", args: `Q, ${vreg(ft)}` }; + case 0x32: + return { op: "vrsqrt", args: `Q, ${vreg(fs)}, ${vreg(ft)}` }; + case 0x33: + return { op: "vwaitq", args: "" }; + case 0x34: + return { op: "vmtir", args: `${vireg(ft)}, ${vreg(fs)}` }; + case 0x35: + return { + op: "vmfir", + args: `${vreg(fd)}${destStr(dest)}, ${vireg(fs)}`, + }; + case 0x36: + return { op: "vilwr", args: `${vireg(ft)}, (${vireg(fs)})` }; + case 0x37: + return { op: "viswr", args: `${vireg(ft)}, (${vireg(fs)})` }; + case 0x38: + return { op: "vrnext", args: `${vreg(fd)}${destStr(dest)}, R` }; + case 0x39: + return { op: "vrget", args: `${vreg(fd)}${destStr(dest)}, R` }; + case 0x3a: + return { op: "vrinit", args: `R, ${vreg(fs)}` }; + case 0x3b: + return { op: "vrxor", args: `R, ${vreg(fs)}` }; + case 0x3c: + return { op: "vclip", args: `${vreg(fs)}, ${vreg(ft)}` }; + case 0x3d: + return { op: "vmaddaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q` }; + case 0x3e: + return { op: "vmsubaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q` }; + case 0x3f: + return { op: "vmulaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q` }; + } + // VU0 special instructions (lower instructions with different encoding) + const vuLower = (instr >> 25) & 0x7f; + if (vuLower === 0x30 || + vuLower === 0x31 || + vuLower === 0x32 || + vuLower === 0x33) { + const it = (instr >> 16) & 0x1f; + const is = (instr >> 11) & 0x1f; + const id = (instr >> 6) & 0x1f; + const vireg = (r) => `vi${r}`; + switch (funct) { + case 0x30: + return { + op: "viadd", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + case 0x31: + return { + op: "visub", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + case 0x32: + return { + op: "viaddi", + args: `${vireg(it)}, ${vireg(is)}, ${(instr & 0x1f) - (instr & 0x10 ? 32 : 0)}`, + }; + case 0x33: + return { + op: "viand", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + case 0x34: + return { + op: "vior", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + } + } + } + } + // VU1 instructions via VCALLMS/VCALLMSR (executed through COP2 interface) + // VU1 uses same instruction encoding as VU0 but executes on VU1 unit + // These are typically triggered via special COP2 instructions or DMA + // If we reach here, instruction is unknown + return { op: "unknown", args: "", label: "", comment: "" }; +} +//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/helpers.js.map b/vscode/cds-dis/cds-dis/out/helpers.js.map new file mode 100644 index 0000000..009a33f --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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AE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI;wBACP,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,KAAK,IAAI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"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/providers/BaseProvider/BaseEditorProvider.js b/vscode/cds-dis/cds-dis/out/providers/BaseProvider/BaseEditorProvider.js new file mode 100644 index 0000000..f0be09c --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/providers/BaseProvider/BaseEditorProvider.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEditorProvider = void 0; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const helpers_1 = require("../../helpers"); +// Base class with reusable webview logic +class BaseEditorProvider { + htmlFileName; + providerName; + constructor(htmlFileName, providerName) { + this.htmlFileName = htmlFileName; + this.providerName = providerName; + } // HTML file provided by child + async openCustomDocument(uri) { + return { uri, dispose() { } }; + } + loadHtml(webview) { + // Compute the provider folder name by stripping "Provider" from the class name + const providerFolder = this.providerName; + // Path to compiled JS output + provider folder + const htmlPath = path.join(__dirname, '..', '..', providerFolder, this.htmlFileName); + let html = fs.readFileSync(htmlPath, 'utf8'); + const nonce = (0, helpers_1.getNonce)(); + html = html.replace(' - - -`; - } -} - -/* ---------------- DISASSEMBLY ---------------- */ -function disassemble(buffer: Buffer) { - const rows: any[] = []; - let addr = 0x00370F6C; - for (let i = 0; i < buffer.length; i += 4) { - const bytes = buffer.slice(i, i + 4); - if (bytes.length < 4) break; - - // Little-endian - const bytesLE = Array.from(bytes).reverse().map(b => b.toString(16).padStart(2,"0")).join(" "); - - rows.push({ - addr: addr.toString(16).toUpperCase().padStart(8,"0"), - bytes: bytesLE, - label: i === 0 ? "FUNC_" + addr.toString(16).toUpperCase() : "", - op: "nop", - args: "", - comment: "" - }); - - addr += 4; - } - return rows; -} - -function getNonce(): string { - let text = ""; - const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i=0;i<32;i++) text += chars.charAt(Math.floor(Math.random()*chars.length)); - return text; + // Custom editor + context.subscriptions.push( + vscode.window.registerCustomEditorProvider( + 'disasm.disasmEditor', + new DisasmEditorProvider(), + { webviewOptions: { retainContextWhenHidden: true } } + ) + ); + + // Sidebar panel + context.subscriptions.push( + vscode.window.registerWebviewViewProvider( + 'disasm.disasmPanel', + new DisasmPanelProvider() + ) + ); + + // Command to show sidebar + context.subscriptions.push( + vscode.commands.registerCommand('disasm.showPanel', () => { + vscode.commands.executeCommand( + 'workbench.view.extension.disasmSidebar' + ); + }) + ); } export function deactivate() {} diff --git a/vscode/cds-dis/cds-dis/src/helpers.ts b/vscode/cds-dis/cds-dis/src/helpers.ts new file mode 100644 index 0000000..4659dc1 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/helpers.ts @@ -0,0 +1,1956 @@ +export function getNonce() { + let text = ""; + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) + text += chars.charAt(Math.floor(Math.random() * chars.length)); + return text; +} + +export function formatBytes(bytes: Buffer) { + return [...bytes] + .reverse() + .map((b) => b.toString(16).padStart(2, "0")) + .join(" "); +} + +/** + * Disassemble MIPS binary code with inline pointer calculation comments + * @param startAddr - Virtual address where disassembly begins + * @param buffer - Binary data to disassemble + * @returns Array of disassembled instructions with analysis comments + */ +export function disassemble(startAddr: number, buffer: Buffer) { + const rows: any[] = []; + const regs = new Map(); // Track register values for inline comments + + /** + * Parse hex immediate from instruction args + */ + const parseInlineImm = (s: string): number => { + const cleaned = s.replace("$", ""); + return parseInt(cleaned, 16); + }; + + /** + * Get signed 16-bit immediate + */ + const getSignedInline = (val: number): number => { + return (val << 16) >> 16; + }; + + for (let offset = 0; offset < buffer.length; offset += 4) { + const slice = buffer.slice(offset, offset + 4); + if (slice.length < 4) break; + + const bytesLE = Array.from(slice) + .reverse() + .map((b) => b.toString(16).padStart(2, "0").toUpperCase()) + .join(" "); + const instr = slice.readUInt32LE(0); + const currentAddr = startAddr + offset; + const decoded = decodeMIPS(instr, currentAddr); + + if (decoded) { + let inlineComment = decoded.comment || ""; + const op = decoded.op.toLowerCase(); + const args = decoded.args.split(",").map((a: string) => a.trim()); + + // Track and comment on pointer calculations + if (op === "lui" && args.length >= 2) { + const rt = args[0]; + const imm = parseInlineImm(args[1]); + const value = (imm << 16) >>> 0; + regs.set(rt, value); + } + else if ((op === "ori" || op === "addiu" || op === "addi") && args.length >= 3) { + const rt = args[0]; + const rs = args[1]; + const imm = parseInlineImm(args[2]); + const baseValue = regs.get(rs); + + if (baseValue !== undefined) { + const signedImm = getSignedInline(imm); + const result = op === "ori" ? (baseValue | imm) >>> 0 : (baseValue + signedImm) >>> 0; + regs.set(rt, result); + inlineComment = `; ${rt} = 0x${result.toString(16).toUpperCase()} (calculated addr)`; + } else { + regs.delete(rt); + } + } + else if ((op === "addu" || op === "add") && args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + + if (a !== undefined && b !== undefined) { + const result = (a + b) >>> 0; + regs.set(rd, result); + inlineComment = `; ${rd} = 0x${result.toString(16).toUpperCase()} (calculated addr)`; + } else { + regs.delete(rd); + } + } + else if ((op === "subu" || op === "sub") && args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + + if (a !== undefined && b !== undefined) { + const result = (a - b) >>> 0; + regs.set(rd, result); + inlineComment = `; ${rd} = 0x${result.toString(16).toUpperCase()} (calculated addr)`; + } else { + regs.delete(rd); + } + } + else if (op === "sll" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + + if (val !== undefined) { + const result = (val << sa) >>> 0; + regs.set(rd, result); + inlineComment = `; ${rd} = 0x${result.toString(16).toUpperCase()} (shifted ptr)`; + } else { + regs.delete(rd); + } + } + // Clear register tracking for operations that modify registers unpredictably + else if (args.length > 0 && !op.startsWith("b") && op !== "j" && op !== "jal" && op !== "nop") { + const destReg = args[0]; + if (destReg && !destReg.includes("(") && !destReg.includes("$")) { + regs.delete(destReg); + } + } + + rows.push({ + addr: currentAddr.toString(16).toUpperCase().padStart(8, "0"), + bytes: bytesLE, + label: decoded.label || "", + op: decoded.op, + args: decoded.args, + comment: inlineComment, + }); + } + } + + console.log("Disassembled", rows.length, "instructions"); + if (rows.length > 0) { + console.log( + "First instruction:", + rows[0].addr, + rows[0].bytes, + rows[0].op, + rows[0].args + ); + } + + return rows; +} + +/** + * Represents a pointer reference found during analysis + */ +export interface PointerRef { + instrAddr: number; // Address of the instruction making the reference + kind: "load" | "store" | "jump" | "call"; // Type of memory operation + baseReg: string; // Base register used (e.g., "gp", "sp") + baseValue: number; // Resolved value of base register + offset: number; // Offset from base (signed) + targetAddr: number; // Final calculated address + size?: number; // Size of access in bytes (1, 2, 4, 8, 16) + type?: string; // Specific instruction type (lb, lw, etc.) + isFunction?: boolean; // Whether target is likely a function + dataType?: string; // Inferred data type (int, float, string, etc.) +} + +/** + * Analyze disassembled instructions to track register values and identify pointer references + * This performs data flow analysis to resolve memory addresses and function calls + * @param rows - Array of disassembled instructions + * @returns Array of resolved pointer references with metadata + */ +export function analyzePointers(rows: any[]): PointerRef[] { + const refs: PointerRef[] = []; + const regs = new Map(); + + /** + * Parse hexadecimal immediate value from string (e.g., "$1234" -> 0x1234) + */ + const parseImm = (s: string): number => { + const cleaned = s.replace("$", ""); + return parseInt(cleaned, 16); + }; + + /** + * Convert 16-bit value to signed integer + */ + const getSignedImm = (val: number): number => { + return (val << 16) >> 16; + }; + + /** + * Determine memory access size from instruction mnemonic + */ + const getAccessSize = (op: string): number => { + if (op.includes("b")) return 1; // byte (lb, sb, lbu) + if (op.includes("h")) return 2; // halfword (lh, sh, lhu) + if (op.includes("w") && !op.includes("q")) return 4; // word (lw, sw) + if (op === "ld" || op === "sd") return 8; // doubleword + if (op === "lq" || op === "sq") return 16; // quadword (PS2 128-bit) + return 4; // default to word + }; + + /** + * Infer data type from instruction and context + */ + const inferDataType = (op: string, targetAddr: number): string | undefined => { + // Floating point operations + if (op.includes("c1") || op.includes(".s") || op.includes(".w")) { + return "float"; + } + // Vector operations (PS2) + if (op.startsWith("v") || op.includes("c2") || op === "lq" || op === "sq") { + return "vector"; + } + // Byte operations might be strings + if (op === "lb" || op === "lbu" || op === "sb") { + return "byte/char"; + } + // Check if address looks like code (aligned to 4 bytes) + if (targetAddr % 4 === 0 && targetAddr >= 0x00100000) { + return "code/function"; + } + return undefined; + }; + + /** + * Check if an address is likely a function entry point + */ + const isLikelyFunction = (addr: number, rows: any[]): boolean => { + // Find the row at this address + const targetRow = rows.find(r => parseInt(r.addr, 16) === addr); + if (!targetRow) return false; + + // Common function prologue patterns + const op = targetRow.op.toLowerCase(); + const args = targetRow.args.toLowerCase(); + + // Stack frame allocation: addiu sp, sp, -X + if (op === "addiu" && args.includes("sp, sp") && args.includes("-")) { + return true; + } + + // Save return address: sw ra, X(sp) + if (op === "sw" && args.includes("ra") && args.includes("sp")) { + return true; + } + + return false; + }; + + for (const row of rows) { + const instrAddr = parseInt(row.addr, 16); + const op = row.op.toLowerCase(); + const args = row.args.split(",").map((a: string) => a.trim()); + + // LUI - Load Upper Immediate + if (op === "lui") { + if (args.length >= 2) { + const rt = args[0]; + const imm = parseImm(args[1]); + regs.set(rt, (imm << 16) >>> 0); + console.log(`LUI: ${rt} = 0x${((imm << 16) >>> 0).toString(16).toUpperCase()}`); + } + continue; + } + + // ADDIU/ADDI - Add Immediate (Unsigned) + if (op === "addiu" || op === "addi") { + if (args.length >= 3) { + const rt = args[0]; + const rs = args[1]; + const imm = parseImm(args[2]); + const base = regs.get(rs); + + if (base !== undefined) { + const signedImm = getSignedImm(imm); + const result = (base + signedImm) >>> 0; + regs.set(rt, result); + console.log(`ADDIU: ${rt} = ${rs}(0x${base.toString(16)}) + 0x${imm.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rt); + console.log(`ADDIU: ${rt} = unknown (${rs} not tracked)`); + } + } + continue; + } + + // ADDU/ADD - Add Unsigned + if (op === "addu" || op === "add") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + + if (a !== undefined && b !== undefined) { + const result = (a + b) >>> 0; + regs.set(rd, result); + console.log(`ADDU: ${rd} = ${rs}(0x${a.toString(16)}) + ${rt}(0x${b.toString(16)}) = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + } + continue; + } + + // SUBU/SUB - Subtract + if (op === "subu" || op === "sub") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + + if (a !== undefined && b !== undefined) { + const result = (a - b) >>> 0; + regs.set(rd, result); + console.log(`SUBU: ${rd} = ${rs}(0x${a.toString(16)}) - ${rt}(0x${b.toString(16)}) = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + } + continue; + } + + // AND/ANDI - Bitwise AND + if (op === "and" || op === "andi") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rtOrImm = args[2]; + const a = regs.get(rs); + const b = op === "andi" ? parseImm(rtOrImm) : regs.get(rtOrImm); + + if (a !== undefined && b !== undefined) { + const result = (a & b) >>> 0; + regs.set(rd, result); + console.log(`${op.toUpperCase()}: ${rd} = 0x${a.toString(16)} & 0x${b.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + } + continue; + } + + // OR - Bitwise OR + if (op === "or") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + + if (a !== undefined && b !== undefined) { + const result = (a | b) >>> 0; + regs.set(rd, result); + console.log(`OR: ${rd} = 0x${a.toString(16)} | 0x${b.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + } + continue; + } + + // ORI - OR Immediate + if (op === "ori") { + if (args.length >= 3) { + const rt = args[0]; + const rs = args[1]; + const imm = parseImm(args[2]); + const base = regs.get(rs); + + if (base !== undefined) { + const result = (base | imm) >>> 0; + regs.set(rt, result); + console.log(`ORI: ${rt} = 0x${base.toString(16)} | 0x${imm.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rt); + } + } + continue; + } + + // XOR/XORI - Bitwise XOR + if (op === "xor" || op === "xori") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rtOrImm = args[2]; + const a = regs.get(rs); + const b = op === "xori" ? parseImm(rtOrImm) : regs.get(rtOrImm); + + if (a !== undefined && b !== undefined) { + const result = (a ^ b) >>> 0; + regs.set(rd, result); + console.log(`${op.toUpperCase()}: ${rd} = 0x${a.toString(16)} ^ 0x${b.toString(16)} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + } + continue; + } + + // NOR - Bitwise NOR + if (op === "nor") { + if (args.length >= 3) { + const rd = args[0]; + const rs = args[1]; + const rt = args[2]; + const a = regs.get(rs); + const b = regs.get(rt); + + if (a !== undefined && b !== undefined) { + const result = (~(a | b)) >>> 0; + regs.set(rd, result); + console.log(`NOR: ${rd} = ~(0x${a.toString(16)} | 0x${b.toString(16)}) = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + } + continue; + } + + // SLL - Shift Left Logical + if (op === "sll" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + + if (val !== undefined) { + const result = (val << sa) >>> 0; + regs.set(rd, result); + console.log(`SLL: ${rd} = 0x${val.toString(16)} << ${sa} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + continue; + } + + // SRL - Shift Right Logical + if (op === "srl" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + + if (val !== undefined) { + const result = (val >>> sa) >>> 0; + regs.set(rd, result); + console.log(`SRL: ${rd} = 0x${val.toString(16)} >> ${sa} = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + continue; + } + + // SRA - Shift Right Arithmetic + if (op === "sra" && args.length >= 3) { + const rd = args[0]; + const rt = args[1]; + const sa = parseInt(args[2], 10); + const val = regs.get(rt); + + if (val !== undefined) { + const result = (val >> sa) >>> 0; + regs.set(rd, result); + console.log(`SRA: ${rd} = 0x${val.toString(16)} >> ${sa} (arith) = 0x${result.toString(16).toUpperCase()}`); + } else { + regs.delete(rd); + } + continue; + } + + // Memory operations with offset(base) format + const memArg = args.find((a: string) => a.includes("(") && a.includes(")")); + if (memArg) { + const match = memArg.match(/\$([0-9A-Fa-f]+)\((\w+)\)/); + if (match) { + const offset = parseImm(match[1]); + const baseReg = match[2]; + const baseValue = regs.get(baseReg); + + // Only add reference if we know the base value + if (baseValue !== undefined) { + const signedOffset = getSignedImm(offset); + const targetAddr = (baseValue + signedOffset) >>> 0; + const size = getAccessSize(op); + const dataType = inferDataType(op, targetAddr); + const isFunction = isLikelyFunction(targetAddr, rows); + + refs.push({ + instrAddr, + kind: op.startsWith("l") ? "load" : "store", + baseReg, + baseValue, + offset: signedOffset, + targetAddr, + size, + type: op, + dataType, + isFunction, + }); + + console.log( + `${op.toUpperCase()}: @0x${instrAddr.toString(16)} -> 0x${targetAddr.toString(16).toUpperCase()} ` + + `[${baseReg}=0x${baseValue.toString(16)} + ${signedOffset}] (${size} bytes${dataType ? ', ' + dataType : ''}${isFunction ? ', FUNCTION' : ''})` + ); + } + } + continue; + } + + // JAL - Jump and Link (function call) + if (op === "jal") { + const targetMatch = args[0].match(/\$([0-9A-Fa-f]+)/); + if (targetMatch) { + const targetAddr = parseImm(targetMatch[1]); + const isFunction = isLikelyFunction(targetAddr, rows); + + refs.push({ + instrAddr, + kind: "call", + baseReg: "pc", + baseValue: instrAddr, + offset: 0, + targetAddr, + type: "jal", + isFunction: true, // JAL always calls a function + dataType: "function", + }); + console.log(`JAL: @0x${instrAddr.toString(16)} -> 0x${targetAddr.toString(16).toUpperCase()} (function call)`); + } + continue; + } + + // JR/JALR - Jump Register (indirect jumps/calls) + if (op === "jr" || op === "jalr") { + const reg = args[op === "jalr" && args.length > 1 ? 1 : 0]; + const baseValue = regs.get(reg); + + if (baseValue !== undefined) { + const isFunction = op === "jalr" || isLikelyFunction(baseValue, rows); + + refs.push({ + instrAddr, + kind: op === "jalr" ? "call" : "jump", + baseReg: reg, + baseValue, + offset: 0, + targetAddr: baseValue, + type: op, + isFunction, + dataType: isFunction ? "function" : undefined, + }); + + console.log(`${op.toUpperCase()}: @0x${instrAddr.toString(16)} -> 0x${baseValue.toString(16).toUpperCase()}${isFunction ? ' (function)' : ''}`); + } + } + + // Clear destination register for most other operations to avoid stale data + if (args.length > 0 && !op.startsWith("b") && op !== "j" && op !== "jal") { + const destReg = args[0]; + if (!memArg && destReg && !destReg.includes("(")) { + // Only clear if it's not a memory operation and not a branch/jump + if (!["nop", "syscall", "break", "sync", "jr", "jalr"].includes(op)) { + // Don't clear if we already handled it above + const handledOps = ["lui", "addiu", "addi", "addu", "add", "subu", "sub", + "and", "andi", "or", "ori", "xor", "xori", "nor", + "sll", "srl", "sra"]; + if (!handledOps.includes(op)) { + regs.delete(destReg); + } + } + } + } + } + + console.log(`Found ${refs.length} resolved pointer references`); + return refs; +} + +function decodeMIPS(instr: number, pc: number) { + const opcode = (instr >> 26) & 0x3f; + const rs = (instr >> 21) & 0x1f; + const rt = (instr >> 16) & 0x1f; + const rd = (instr >> 11) & 0x1f; + const sa = (instr >> 6) & 0x1f; + const funct = instr & 0x3f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + const target = instr & 0x3ffffff; + const code = (instr >> 6) & 0xfffff; + + const reg = (r: number) => { + const names = [ + "zero", + "at", + "v0", + "v1", + "a0", + "a1", + "a2", + "a3", + "t0", + "t1", + "t2", + "t3", + "t4", + "t5", + "t6", + "t7", + "s0", + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "t8", + "t9", + "k0", + "k1", + "gp", + "sp", + "fp", + "ra", + ]; + return names[r]; + }; + + const freg = (r: number) => `f${r}`; + + // Format signed immediate with 4-digit hex padding + const formatImm = (val: number) => { + const hex = (val & 0xffff).toString(16).toUpperCase().padStart(4, "0"); + return `$${hex}`; + }; + + // Format branch/jump target address with 8-digit hex padding + const formatAddr = (addr: number) => { + const hex = (addr >>> 0).toString(16).toUpperCase().padStart(8, "0"); + return `$${hex}`; + }; + + // Format branch with target address and instruction count + const formatBranch = (targetAddr: number, offset: number) => { + const addrHex = (targetAddr >>> 0) + .toString(16) + .toUpperCase() + .padStart(8, "0"); + const instrCount = offset / 4; // Convert byte offset to instruction count + const sign = instrCount >= 0 ? "+" : ""; + const arrow = instrCount >= 0 ? "▼" : "▲"; + return `$${addrHex} (${sign}${instrCount + 1}${arrow})`; + }; + + if (instr === 0) { + return { op: "nop", args: "" }; + } + + // SPECIAL opcode (0x00) + if (opcode === 0x00) { + switch (funct) { + case 0x00: + return sa === 0 + ? { op: "nop", args: "" } + : { op: "sll", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x02: + return { op: "srl", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x03: + return { op: "sra", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x04: + return { op: "sllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x06: + return { op: "srlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x07: + return { op: "srav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x08: + return { op: "jr", args: reg(rs) }; + case 0x09: + return rd === 31 + ? { op: "jalr", args: reg(rs) } + : { op: "jalr", args: `${reg(rd)}, ${reg(rs)}` }; + case 0x0a: + return { op: "movz", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0b: + return { op: "movn", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0c: + return { op: "syscall", args: code > 0 ? `${code}` : "" }; + case 0x0d: + return { op: "break", args: code > 0 ? `${code}` : "" }; + case 0x0f: + return { op: "sync", args: sa > 0 ? `${sa}` : "" }; + case 0x10: + return { op: "mfhi", args: reg(rd) }; + case 0x11: + return { op: "mthi", args: reg(rs) }; + case 0x12: + return { op: "mflo", args: reg(rd) }; + case 0x13: + return { op: "mtlo", args: reg(rs) }; + case 0x14: + return { op: "dsllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x16: + return { op: "dsrlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x17: + return { op: "dsrav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x18: + return rd === 0 + ? { op: "mult", args: `${reg(rs)}, ${reg(rt)}` } + : { op: "mult", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x19: + return rd === 0 + ? { op: "multu", args: `${reg(rs)}, ${reg(rt)}` } + : { op: "multu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1a: + return { op: "div", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "divu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1c: + return { + op: "dmult", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x1d: + return { + op: "dmultu", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x1e: + return { op: "ddiv", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1f: + return { op: "ddivu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x20: + return { op: "add", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x21: + return { op: "addu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x22: + return { op: "sub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x23: + return { op: "subu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x24: + return { op: "and", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x25: + return { op: "or", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x26: + return { op: "xor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x27: + return { op: "nor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x28: + return { op: "mfsa", args: reg(rd) }; + case 0x29: + return { op: "mtsa", args: reg(rs) }; + case 0x2a: + return { op: "slt", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2b: + return { op: "sltu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2c: + return { op: "dadd", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2d: + return { op: "daddu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2e: + return { op: "dsub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x2f: + return { op: "dsubu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x30: + return { op: "tge", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x31: + return { op: "tgeu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x32: + return { op: "tlt", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x33: + return { op: "tltu", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x34: + return { op: "teq", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x36: + return { op: "tne", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x38: + return { op: "dsll", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3a: + return { op: "dsrl", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3b: + return { op: "dsra", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3c: + return { op: "dsll32", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3e: + return { op: "dsrl32", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3f: + return { op: "dsra32", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + } + } + + // REGIMM opcode (0x01) + if (opcode === 0x01) { + switch (rt) { + case 0x00: + return { + op: "bltz", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x01: + return { + op: "bgez", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x02: + return { + op: "bltzl", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x03: + return { + op: "bgezl", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x08: + return { op: "tgei", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x09: + return { op: "tgeiu", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0a: + return { op: "tlti", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0b: + return { op: "tltiu", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0c: + return { op: "teqi", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x0e: + return { op: "tnei", args: `${reg(rs)}, ${formatImm(signedImm)}` }; + case 0x10: + return { + op: "bltzal", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x11: + return { + op: "bgezal", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x12: + return { + op: "bltzall", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x13: + return { + op: "bgezall", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + case 0x18: + return { op: "mtsab", args: `${reg(rs)}, ${formatImm(imm)}` }; + case 0x19: + return { op: "mtsah", args: `${reg(rs)}, ${formatImm(imm)}` }; + } + } + + // J and JAL (0x02, 0x03) + if (opcode === 0x02) { + return { op: "j", args: formatAddr((pc & 0xf0000000) | (target << 2)) }; + } + if (opcode === 0x03) { + return { op: "jal", args: formatAddr((pc & 0xf0000000) | (target << 2)) }; + } + + // Branch instructions (0x04-0x07, 0x14-0x17) + if (opcode === 0x04) + return { + op: "beq", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x05) + return { + op: "bne", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x06) + return { + op: "blez", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x07) + return { + op: "bgtz", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x14) + return { + op: "beql", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x15) + return { + op: "bnel", + args: `${reg(rs)}, ${reg(rt)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x16) + return { + op: "blezl", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + if (opcode === 0x17) + return { + op: "bgtzl", + args: `${reg(rs)}, ${formatBranch( + pc + 4 + (signedImm << 2), + signedImm << 2 + )}`, + }; + + // Immediate arithmetic/logical (0x08-0x0f, 0x18-0x19) + if (opcode === 0x08) + return { + op: "addi", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x09) + return { + op: "addiu", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x0a) + return { + op: "slti", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x0b) + return { op: "sltiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0c) + return { op: "andi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0d) + return { op: "ori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0e) + return { op: "xori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}` }; + if (opcode === 0x0f) + return { op: "lui", args: `${reg(rt)}, ${formatImm(imm)}` }; + if (opcode === 0x18) + return { + op: "daddi", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + if (opcode === 0x19) + return { + op: "daddiu", + args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, + }; + + // Load instructions (0x1a-0x1b, 0x20-0x27, 0x37) + if (opcode === 0x1a) + return { + op: "ldl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x1b) + return { + op: "ldr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x20) + return { + op: "lb", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x21) + return { + op: "lh", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x22) + return { + op: "lwl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x23) + return { + op: "lw", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x24) + return { + op: "lbu", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x25) + return { + op: "lhu", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x26) + return { + op: "lwr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x27) + return { + op: "lwu", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x37) + return { + op: "ld", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + + // Store instructions (0x28-0x2f, 0x3f) + if (opcode === 0x28) + return { + op: "sb", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x29) + return { + op: "sh", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2a) + return { + op: "swl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2b) + return { + op: "sw", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2c) + return { + op: "sdl", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2d) + return { + op: "sdr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2e) + return { + op: "swr", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x2f) + return { op: "cache", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})` }; + if (opcode === 0x33) + return { op: "pref", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})` }; + if (opcode === 0x3f) + return { + op: "sd", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + + // Quadword loads/stores (PS2 specific - 128-bit) + if (opcode === 0x1e) + return { + op: "lq", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x1f) + return { + op: "sq", + args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + + // Floating point loads/stores + if (opcode === 0x31) + return { + op: "lwc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x35) + return { + op: "ldc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x36) + return { + op: "lqc2", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x39) + return { + op: "swc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x3d) + return { + op: "sdc1", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + if (opcode === 0x3e) + return { + op: "sqc2", + args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, + }; + + // MMI opcode (0x1C) - PS2 specific + if (opcode === 0x1c) { + const mmiFunc = funct & 0x3f; + const mmiFmt = (instr >> 6) & 0x1f; + + switch (mmiFunc) { + case 0x00: + return { + op: "madd", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x01: + return { + op: "maddu", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x04: + return { op: "plzcw", args: `${reg(rd)}, ${reg(rs)}` }; + case 0x08: + switch (mmiFmt) { + case 0x00: + return { op: "paddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x01: + return { op: "psubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x02: + return { op: "pcgtw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x03: + return { op: "pmaxw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x04: + return { op: "paddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x05: + return { op: "psubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x06: + return { op: "pcgth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x07: + return { op: "pmaxh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x08: + return { op: "paddb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x09: + return { op: "psubb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pcgtb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x10: + return { op: "paddsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x11: + return { op: "psubsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x12: + return { op: "pextlw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x13: + return { op: "ppacw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x14: + return { op: "paddsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x15: + return { op: "psubsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x16: + return { op: "pextlh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x17: + return { op: "ppach", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x18: + return { op: "paddsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x19: + return { op: "psubsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1a: + return { op: "pextlb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "ppacb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1e: + return { op: "pext5", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x1f: + return { op: "ppac5", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x09: + switch (mmiFmt) { + case 0x00: + return { op: "pmaddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x01: + return { op: "pmsubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x02: + return { op: "psllvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x03: + return { op: "psrlvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x04: + return { op: "pmfhi", args: reg(rd) }; + case 0x05: + return { op: "pmflo", args: reg(rd) }; + case 0x06: + return { op: "pinth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x08: + return { op: "pmultw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x09: + return { op: "pdivw", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pcpyld", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0c: + return { op: "pmaddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0d: + return { op: "phmadh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0e: + return { op: "pand", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0f: + return { op: "pxor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x10: + return { op: "pmsubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x11: + return { op: "phmsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x12: + return { op: "pexeh", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x13: + return { op: "prevh", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x14: + return { op: "pmulth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x15: + return { op: "pdivbw", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x16: + return { op: "pexew", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x17: + return { op: "prot3w", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x10: + return { op: "mfhi1", args: reg(rd) }; + case 0x11: + return { op: "mthi1", args: reg(rs) }; + case 0x12: + return { op: "mflo1", args: reg(rd) }; + case 0x13: + return { op: "mtlo1", args: reg(rs) }; + case 0x18: + return { + op: "mult1", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x19: + return { + op: "multu1", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x1a: + return { op: "div1", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "divu1", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x20: + return { + op: "madd1", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x21: + return { + op: "maddu1", + args: + rd === 0 + ? `${reg(rs)}, ${reg(rt)}` + : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x28: + switch (mmiFmt) { + case 0x00: + return { + op: "pmadduw", + args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x02: + return { op: "psravw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}` }; + case 0x03: + return { op: "pmthi", args: reg(rs) }; + case 0x04: + return { op: "pmtlo", args: reg(rs) }; + case 0x05: + return { op: "pinteh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x08: + return { + op: "pmultuw", + args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, + }; + case 0x09: + return { op: "pdivuw", args: `${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pcpyud", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0e: + return { op: "por", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0f: + return { op: "pnor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x12: + return { op: "pexch", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x13: + return { op: "pcpyh", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x16: + return { op: "pexcw", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x29: + switch (mmiFmt) { + case 0x00: + return { op: "psubuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x01: + return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x02: + return { op: "pceqw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x03: + return { op: "pminw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x04: + return { op: "padsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x05: + return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x06: + return { op: "pceqh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x07: + return { op: "pminh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x0a: + return { op: "pceqb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x10: + return { op: "padduw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x11: + return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x14: + return { op: "padduh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x15: + return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x16: + return { op: "pextuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x18: + return { op: "paddub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x19: + return { op: "psubub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1a: + return { op: "pextub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1b: + return { op: "qfsrv", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}` }; + case 0x1d: + return { op: "pabsw", args: `${reg(rd)}, ${reg(rt)}` }; + case 0x1e: + return { op: "pabsh", args: `${reg(rd)}, ${reg(rt)}` }; + } + break; + case 0x30: + const fmt = mmiFmt & 0x1f; + switch (fmt) { + case 0x00: + return { op: "pmfhl.lw", args: reg(rd) }; + case 0x01: + return { op: "pmfhl.uw", args: reg(rd) }; + case 0x02: + return { op: "pmfhl.slw", args: reg(rd) }; + case 0x03: + return { op: "pmfhl.lh", args: reg(rd) }; + case 0x04: + return { op: "pmfhl.sh", args: reg(rd) }; + } + break; + case 0x31: + if (mmiFmt === 0x00) return { op: "pmthl.lw", args: reg(rs) }; + break; + case 0x34: + return { op: "psllh", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x36: + return { op: "psrlh", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x37: + return { op: "psrah", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3c: + return { op: "psllw", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3e: + return { op: "psrlw", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + case 0x3f: + return { op: "psraw", args: `${reg(rd)}, ${reg(rt)}, ${sa}` }; + } + } + + // COP0 opcode (0x10) + if (opcode === 0x10) { + const cop0Func = rs; + if (cop0Func === 0x00) return { op: "mfc0", args: `${reg(rt)}, $${rd}` }; + if (cop0Func === 0x04) return { op: "mtc0", args: `${reg(rt)}, $${rd}` }; + if (cop0Func === 0x08) { + const bc0 = rt; + if (bc0 === 0x00) + return { + op: "bc0f", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc0 === 0x01) + return { + op: "bc0t", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc0 === 0x02) + return { + op: "bc0fl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc0 === 0x03) + return { + op: "bc0tl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + } + if (cop0Func === 0x10) { + if (funct === 0x01) return { op: "tlbr", args: "" }; + if (funct === 0x02) return { op: "tlbwi", args: "" }; + if (funct === 0x06) return { op: "tlbwr", args: "" }; + if (funct === 0x08) return { op: "tlbp", args: "" }; + if (funct === 0x18) return { op: "eret", args: "" }; + if (funct === 0x38) return { op: "ei", args: "" }; + if (funct === 0x39) return { op: "di", args: "" }; + } + } + + // COP1 (FPU) opcode (0x11) + if (opcode === 0x11) { + const cop1Func = rs; + if (cop1Func === 0x00) + return { op: "mfc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x02) + return { op: "cfc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x04) + return { op: "mtc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x06) + return { op: "ctc1", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop1Func === 0x08) { + const bc1 = rt; + if (bc1 === 0x00) + return { + op: "bc1f", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc1 === 0x01) + return { + op: "bc1t", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc1 === 0x02) + return { + op: "bc1fl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc1 === 0x03) + return { + op: "bc1tl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + } + if (cop1Func === 0x10) { + // S format (single precision) + switch (funct) { + case 0x00: + return { op: "add.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x01: + return { op: "sub.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x02: + return { op: "mul.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x03: + return { op: "div.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x04: + return { op: "sqrt.s", args: `${freg(sa)}, ${freg(rt)}` }; + case 0x05: + return { op: "abs.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x06: + return { op: "mov.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x07: + return { op: "neg.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x16: + return { + op: "rsqrt.s", + args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, + }; + case 0x18: + return { op: "adda.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x19: + return { op: "suba.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x1a: + return { op: "mula.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x1c: + return { + op: "madd.s", + args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, + }; + case 0x1d: + return { + op: "msub.s", + args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, + }; + case 0x1e: + return { op: "madda.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x1f: + return { op: "msuba.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x24: + return { op: "cvt.w.s", args: `${freg(sa)}, ${freg(rd)}` }; + case 0x28: + return { op: "max.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x29: + return { op: "min.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}` }; + case 0x30: + return { op: "c.f.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x32: + return { op: "c.eq.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x34: + return { op: "c.lt.s", args: `${freg(rd)}, ${freg(rt)}` }; + case 0x36: + return { op: "c.le.s", args: `${freg(rd)}, ${freg(rt)}` }; + } + } + if (cop1Func === 0x14) { + // W format (word fixed point) + if (funct === 0x20) + return { op: "cvt.s.w", args: `${freg(sa)}, ${freg(rd)}` }; + } + } + + // COP2 (VU0) opcode (0x12) - PS2 Vector Unit + if (opcode === 0x12) { + const cop2Func = rs; + if (cop2Func === 0x01) + return { op: "qmfc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x02) + return { op: "cfc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x05) + return { op: "qmtc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x06) + return { op: "ctc2", args: `${reg(rt)}, ${freg(rd)}` }; + if (cop2Func === 0x08) { + const bc2 = rt; + if (bc2 === 0x00) + return { + op: "bc2f", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc2 === 0x01) + return { + op: "bc2t", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc2 === 0x02) + return { + op: "bc2fl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + if (bc2 === 0x03) + return { + op: "bc2tl", + args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), + }; + } + + // VU0 macro mode instructions (COP2 special functions) + if ((cop2Func & 0x10) === 0x10) { + const vuFunc = funct & 0x3f; + const dest = (instr >> 21) & 0xf; // destination mask (xyzw) + const ft = (instr >> 16) & 0x1f; + const fs = (instr >> 11) & 0x1f; + const fd = (instr >> 6) & 0x1f; + const bc = (instr >> 0) & 0x3; // broadcast field + + const vreg = (r: number) => `vf${r}`; + const vireg = (r: number) => `vi${r}`; + const destStr = (d: number) => { + if (d === 0xf) return ""; + let s = ""; + if (d & 8) s += "x"; + if (d & 4) s += "y"; + if (d & 2) s += "z"; + if (d & 1) s += "w"; + return s ? `.${s}` : ""; + }; + const bcStr = (b: number) => ["x", "y", "z", "w"][b]; + + // VU0 computational instructions + switch (vuFunc) { + case 0x00: + return { + op: "vadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x01: + return { + op: "vsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x02: + return { + op: "vmul", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x03: + return { + op: "vmax", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x04: + return { + op: "vmin", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x05: + return { + op: "vmul", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg( + ft + )}.${bcStr(bc)}`, + }; + case 0x06: + return { + op: "vmulq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x07: + return { + op: "vmaxi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x08: + return { + op: "vaddq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x09: + return { + op: "vsubq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x0a: + return { + op: "vaddi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x0b: + return { + op: "vsubi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x0c: + return { + op: "vmini", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x0d: + return { + op: "vadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg( + ft + )}.${bcStr(bc)}`, + }; + case 0x0e: + return { + op: "vsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg( + ft + )}.${bcStr(bc)}`, + }; + case 0x0f: + return { + op: "vopmsub", + args: `${vreg(fd)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x10: + return { + op: "vacc", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x11: + return { + op: "vmsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x12: + return { + op: "vmadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x13: + return { + op: "vmmax", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x14: + return { + op: "vmmin", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x15: + return { + op: "vmsub", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg( + ft + )}.${bcStr(bc)}`, + }; + case 0x16: + return { + op: "vmsubq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x17: + return { + op: "vmmini", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x18: + return { + op: "vaddabc", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x19: + return { + op: "vsubabc", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x1a: + return { + op: "vmulabc", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, + }; + case 0x1b: + return { + op: "vmadda", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x1c: + return { + op: "vmsuba", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x1d: + return { + op: "vmadd", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg( + ft + )}.${bcStr(bc)}`, + }; + case 0x1e: + return { + op: "vmaddq", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, + }; + case 0x1f: + return { + op: "vmmaxi", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, + }; + case 0x20: + return { op: "vaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x21: + return { op: "vsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x22: + return { op: "vmulai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x23: + return { op: "vmaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x24: + return { op: "vmsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I` }; + case 0x25: + return { + op: "vadda", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x26: + return { + op: "vsuba", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x27: + return { + op: "vmula", + args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, + }; + case 0x28: + return { op: "vopmula", args: `ACC, ${vreg(fs)}, ${vreg(ft)}` }; + case 0x29: + return { op: "vnop", args: "" }; + case 0x2a: + return { + op: "vmove", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, + }; + case 0x2b: + return { + op: "vmr32", + args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, + }; + case 0x2c: + return { + op: "vlqi", + args: `${vreg(fd)}${destStr(dest)}, (${vireg(fs)}++)`, + }; + case 0x2d: + return { + op: "vsqi", + args: `${vreg(fs)}${destStr(dest)}, (${vireg(ft)}++)`, + }; + case 0x2e: + return { + op: "vlqd", + args: `${vreg(fd)}${destStr(dest)}, (--${vireg(fs)})`, + }; + case 0x2f: + return { + op: "vsqd", + args: `${vreg(fs)}${destStr(dest)}, (--${vireg(ft)})`, + }; + case 0x30: + return { op: "vdiv", args: `Q, ${vreg(fs)}, ${vreg(ft)}` }; + case 0x31: + return { op: "vsqrt", args: `Q, ${vreg(ft)}` }; + case 0x32: + return { op: "vrsqrt", args: `Q, ${vreg(fs)}, ${vreg(ft)}` }; + case 0x33: + return { op: "vwaitq", args: "" }; + case 0x34: + return { op: "vmtir", args: `${vireg(ft)}, ${vreg(fs)}` }; + case 0x35: + return { + op: "vmfir", + args: `${vreg(fd)}${destStr(dest)}, ${vireg(fs)}`, + }; + case 0x36: + return { op: "vilwr", args: `${vireg(ft)}, (${vireg(fs)})` }; + case 0x37: + return { op: "viswr", args: `${vireg(ft)}, (${vireg(fs)})` }; + case 0x38: + return { op: "vrnext", args: `${vreg(fd)}${destStr(dest)}, R` }; + case 0x39: + return { op: "vrget", args: `${vreg(fd)}${destStr(dest)}, R` }; + case 0x3a: + return { op: "vrinit", args: `R, ${vreg(fs)}` }; + case 0x3b: + return { op: "vrxor", args: `R, ${vreg(fs)}` }; + case 0x3c: + return { op: "vclip", args: `${vreg(fs)}, ${vreg(ft)}` }; + case 0x3d: + return { op: "vmaddaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q` }; + case 0x3e: + return { op: "vmsubaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q` }; + case 0x3f: + return { op: "vmulaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q` }; + } + + // VU0 special instructions (lower instructions with different encoding) + const vuLower = (instr >> 25) & 0x7f; + if ( + vuLower === 0x30 || + vuLower === 0x31 || + vuLower === 0x32 || + vuLower === 0x33 + ) { + const it = (instr >> 16) & 0x1f; + const is = (instr >> 11) & 0x1f; + const id = (instr >> 6) & 0x1f; + const vireg = (r: number) => `vi${r}`; + + switch (funct) { + case 0x30: + return { + op: "viadd", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + case 0x31: + return { + op: "visub", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + case 0x32: + return { + op: "viaddi", + args: `${vireg(it)}, ${vireg(is)}, ${ + (instr & 0x1f) - (instr & 0x10 ? 32 : 0) + }`, + }; + case 0x33: + return { + op: "viand", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + case 0x34: + return { + op: "vior", + args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, + }; + } + } + } + } + + // VU1 instructions via VCALLMS/VCALLMSR (executed through COP2 interface) + // VU1 uses same instruction encoding as VU0 but executes on VU1 unit + // These are typically triggered via special COP2 instructions or DMA + + // If we reach here, instruction is unknown + return { op: "unknown", args: "", label: "", comment: "" }; +} diff --git a/vscode/cds-dis/cds-dis/src/providers/BaseProvider/BaseEditorProvider.ts b/vscode/cds-dis/cds-dis/src/providers/BaseProvider/BaseEditorProvider.ts new file mode 100644 index 0000000..7f29747 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/BaseProvider/BaseEditorProvider.ts @@ -0,0 +1,45 @@ +import * as vscode from 'vscode'; +import * as fs from 'fs'; +import * as path from 'path'; +import { getNonce } from '../../helpers'; + +// Base class with reusable webview logic +export abstract class BaseEditorProvider implements vscode.CustomReadonlyEditorProvider { + constructor(private htmlFileName: string, private providerName: string) {} // HTML file provided by child + + async openCustomDocument(uri: vscode.Uri): Promise { + return { uri, dispose() {} }; + } + + protected loadHtml(webview: vscode.Webview): string { + // Compute the provider folder name by stripping "Provider" from the class name + const providerFolder = this.providerName; + + // Path to compiled JS output + provider folder + const htmlPath = path.join(__dirname, '..', '..', providerFolder, this.htmlFileName); + let html = fs.readFileSync(htmlPath, 'utf8'); + + const nonce = getNonce(); + html = html.replace(' + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts new file mode 100644 index 0000000..6d6c8ce --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts @@ -0,0 +1,331 @@ +import * as vscode from "vscode"; +import * as fs from "fs"; +import { disassemble, analyzePointers } from "../../helpers"; +import { BaseEditorProvider } from "../BaseProvider/BaseEditorProvider"; + +/** + * Allowed searchable fields in a disassembled instruction row + */ +type SearchField = 'addr' | 'bytes' | 'label' | 'op' | 'args' | 'comment'; + +interface SearchMatch { + instructionIndex: number; + address: number; + field: SearchField; + start: number; + length: number; +} + +export class DisasmEditorProvider extends BaseEditorProvider { + private static readonly HEX_VIEW_SIZE = 0x30; + private static readonly INSTRUCTION_SIZE = 4; + private static readonly BASE_ADDRESS = 0x00000000; + private static readonly PAGE_SIZE = 1000; + private static readonly BUFFER_PAGES = 2; + + constructor() { + super("DisasmEditorProvider.html", "DisasmEditor"); + } + + protected async onDidResolveWebview( + webviewPanel: vscode.WebviewPanel, + document: vscode.CustomDocument + ): Promise { + fs.readFile(document.uri.fsPath, (err, fileData) => { + if (err) { + webviewPanel.webview.postMessage({ + type: "error", + message: err.message, + }); + return; + } + + const totalInstructions = Math.floor( + fileData.length / DisasmEditorProvider.INSTRUCTION_SIZE + ); + + webviewPanel.webview.postMessage({ + type: "init", + totalInstructions, + pageSize: DisasmEditorProvider.PAGE_SIZE, + baseAddress: DisasmEditorProvider.BASE_ADDRESS, + }); + + this.sendDisasmPage(webviewPanel, fileData, 0); + + this.sendHexView( + webviewPanel, + fileData, + DisasmEditorProvider.BASE_ADDRESS, + DisasmEditorProvider.BASE_ADDRESS, + DisasmEditorProvider.INSTRUCTION_SIZE + ); + + webviewPanel.webview.onDidReceiveMessage((message) => { + if (message.type === "updateHex") { + this.sendHexView( + webviewPanel, + fileData, + DisasmEditorProvider.BASE_ADDRESS, + message.address, + message.length || DisasmEditorProvider.INSTRUCTION_SIZE + ); + } else if (message.type === "requestPage") { + this.sendDisasmPage(webviewPanel, fileData, message.startIndex); + } else if (message.type === "search") { + this.performSearch(webviewPanel, fileData, message.query, message.mode); + } + }); + }); + } + + private performSearch( + webviewPanel: vscode.WebviewPanel, + fileData: Buffer, + query: string, + mode: 'text' | 'bytes' | 'string' | 'regex' + ): void { + const matches: SearchMatch[] = []; + + if (mode === 'bytes') { + const pattern = this.parseBytePattern(query); + if (!pattern) { + webviewPanel.webview.postMessage({ type: 'searchResults', matches: [] }); + return; + } + + for (let offset = 0; offset <= fileData.length - pattern.length; offset++) { + let found = true; + for (let i = 0; i < pattern.length; i++) { + if (fileData[offset + i] !== pattern[i]) { + found = false; + break; + } + } + + if (found) { + const instructionIndex = Math.floor(offset / DisasmEditorProvider.INSTRUCTION_SIZE); + const address = DisasmEditorProvider.BASE_ADDRESS + offset; + + matches.push({ + instructionIndex, + address, + field: 'bytes', + start: 0, + length: pattern.length * 3 - 1 + }); + + offset += pattern.length - 1; + } + } + } else if (mode === 'string') { + const stringBytes = Buffer.from(query, 'utf8'); + + for (let offset = 0; offset <= fileData.length - stringBytes.length; offset++) { + let found = true; + for (let i = 0; i < stringBytes.length; i++) { + if (fileData[offset + i] !== stringBytes[i]) { + found = false; + break; + } + } + + if (found) { + const instructionIndex = Math.floor(offset / DisasmEditorProvider.INSTRUCTION_SIZE); + const address = DisasmEditorProvider.BASE_ADDRESS + offset; + + matches.push({ + instructionIndex, + address, + field: 'bytes', + start: 0, + length: stringBytes.length * 3 - 1 + }); + + offset += stringBytes.length - 1; + } + } + } else { + const totalInstructions = Math.floor( + fileData.length / DisasmEditorProvider.INSTRUCTION_SIZE + ); + + for (let instrIndex = 0; instrIndex < totalInstructions; instrIndex++) { + const offset = instrIndex * DisasmEditorProvider.INSTRUCTION_SIZE; + const slice = fileData.slice(offset, offset + DisasmEditorProvider.INSTRUCTION_SIZE); + if (slice.length < DisasmEditorProvider.INSTRUCTION_SIZE) break; + + const address = DisasmEditorProvider.BASE_ADDRESS + offset; + const rows = disassemble(address, slice); + + if (rows.length === 0) continue; + + const row = rows[0]; + const rowMatches = this.searchInRow(row, query, mode); + + for (const match of rowMatches) { + matches.push({ + instructionIndex: instrIndex, + address, + field: match.field, + start: match.start, + length: match.length + }); + } + } + } + + webviewPanel.webview.postMessage({ + type: 'searchResults', + matches + }); + } + + private parseBytePattern(pattern: string): number[] | null { + const cleaned = pattern.replace(/0x/gi, '').replace(/[,\s]+/g, ' ').trim(); + if (!cleaned) return null; + + const bytes = cleaned.split(/\s+/); + const result: number[] = []; + + for (const byte of bytes) { + if (!/^[0-9a-f]{1,2}$/i.test(byte)) return null; + result.push(parseInt(byte, 16)); + } + + return result.length ? result : null; + } + + private searchInRow( + row: any, + query: string, + mode: 'text' | 'regex' + ): Array<{ field: SearchField; start: number; length: number }> { + const matches: Array<{ field: SearchField; start: number; length: number }> = []; + + const fields: Array<{ text: string; field: SearchField }> = [ + { text: row.addr, field: 'addr' }, + { text: row.bytes, field: 'bytes' }, + { text: row.label || '', field: 'label' }, + { text: row.op, field: 'op' }, + { text: row.args, field: 'args' }, + { text: row.comment || '', field: 'comment' } + ]; + + if (mode === 'text') { + const searchLower = query.toLowerCase(); + + for (const { text, field } of fields) { + const lower = text.toLowerCase(); + let index = 0; + + while ((index = lower.indexOf(searchLower, index)) !== -1) { + matches.push({ field, start: index, length: query.length }); + index += query.length; + } + } + } else { + try { + const regex = new RegExp(query, 'gi'); + + for (const { text, field } of fields) { + let match: RegExpExecArray | null; + const fieldRegex = new RegExp(regex); + + while ((match = fieldRegex.exec(text)) !== null) { + matches.push({ + field, + start: match.index, + length: match[0].length + }); + + if (match.index === fieldRegex.lastIndex) { + fieldRegex.lastIndex++; + } + } + } + } catch { + return []; + } + } + + return matches; + } + + private sendDisasmPage( + webviewPanel: vscode.WebviewPanel, + fileData: Buffer, + startIndex: number + ): void { + const startOffset = startIndex * DisasmEditorProvider.INSTRUCTION_SIZE; + const endOffset = Math.min( + fileData.length, + startOffset + DisasmEditorProvider.PAGE_SIZE * DisasmEditorProvider.INSTRUCTION_SIZE + ); + + const slice = fileData.slice(startOffset, endOffset); + const startAddr = DisasmEditorProvider.BASE_ADDRESS + startOffset; + + const rows = disassemble(startAddr, slice); + const refs = analyzePointers(rows); + + const refMap = new Map(); + for (const ref of refs) { + if (!refMap.has(ref.instrAddr)) { + refMap.set(ref.instrAddr, []); + } + refMap.get(ref.instrAddr)!.push(ref); + } + + for (const row of rows) { + const addr = parseInt(row.addr, 16); + const rowRefs = refMap.get(addr); + if (!rowRefs) continue; + + const annotations = rowRefs.map(ref => { + if (ref.targetAddr !== undefined) { + const addrStr = `0x${ref.targetAddr.toString(16).toUpperCase()}`; + return ref.isFunction + ? `; ptr to function at ${addrStr}` + : `; ptr [${addrStr}]`; + } + return `; ptr: ${ref.baseReg ?? '?'} (unresolved)`; + }); + + row.comment = row.comment + ? `${row.comment} ${annotations.join(', ')}` + : annotations.join(', '); + } + + webviewPanel.webview.postMessage({ + type: "disasmPage", + rows, + startIndex, + }); + } + + private sendHexView( + webviewPanel: vscode.WebviewPanel, + fileData: Buffer, + baseAddr: number, + highlightAddr: number, + highlightLength: number + ): void { + const alignedAddr = Math.max(baseAddr, (highlightAddr & ~0xf) - 0x10); + const fileOffset = alignedAddr - baseAddr; + const endOffset = Math.min( + fileData.length, + fileOffset + DisasmEditorProvider.HEX_VIEW_SIZE + ); + + const slice = fileData.slice(fileOffset, endOffset); + + webviewPanel.webview.postMessage({ + type: "hexview", + data: Array.from(slice), + offset: alignedAddr, + highlight_addr: highlightAddr, + highlight_length: highlightLength, + }); + } +} diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md new file mode 100644 index 0000000..941c4d4 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md @@ -0,0 +1,394 @@ +# MIPS Disassembler Search Modes - Complete Guide + +## Overview +The disassembler includes 4 distinct search modes, each optimized for different use cases when analyzing PlayStation 2 MIPS binary files. + +--- + +## 1. TEXT SEARCH (Aa Button) + +### Purpose +Case-insensitive text search across all disassembled instruction fields. + +### Use Cases +- Finding specific instructions (e.g., "addiu", "jal") +- Locating register usage (e.g., "sp", "ra", "v0") +- Searching comments and labels +- Quick general-purpose searching + +### Search Scope +Searches in these fields: +- **Address**: Memory addresses (e.g., "00001234") +- **Bytes**: Hex representation (e.g., "27 BD FF F0") +- **Label**: Assembly labels (e.g., "main:") +- **Opcode**: Instruction mnemonic (e.g., "addiu") +- **Arguments**: Operands (e.g., "sp, sp, $FFF0") +- **Comments**: Analysis comments (e.g., "; ptr to function") + +### Examples +``` +Query: "addiu" +Finds: All add immediate unsigned instructions + +Query: "sp" +Finds: All stack pointer references in any field + +Query: "jal" +Finds: All function call instructions + +Query: "ptr" +Finds: All pointer references in comments +``` + +### Algorithm +1. Convert query to lowercase +2. Convert each field to lowercase +3. Find all substring matches +4. Record position and length for highlighting +5. Case-insensitive comparison throughout + +### Performance +⚠️ **SLOW** - Must disassemble every instruction in the file + +--- + +## 2. BYTE PATTERN SEARCH (0x Button) + +### Purpose +Search for exact hexadecimal byte sequences in the raw binary file. + +### Use Cases +- Finding specific instruction encodings +- Locating opcode patterns +- Searching for data structures +- Finding exact byte sequences + +### Input Format +Accepts flexible formats: +``` +Space-separated: 12 34 AB CD +With 0x prefix: 0x12 0x34 0xAB 0xCD +Comma-separated: 12,34,AB,CD +Mixed: 0x12 34, AB CD +``` + +### Examples +``` +Query: "27 BD FF F0" +Finds: addiu sp, sp, -16 (common stack allocation) + +Query: "3C 01 80 00" +Finds: lui at, $8000 (load upper immediate) + +Query: "0C" +Finds: All JAL instructions (opcode 0x03 = 0000 11xx) + +Query: "00 00 00 00" +Finds: NOP instructions or null data +``` + +### Algorithm +1. Parse hex string into byte array +2. Validate each byte (must be 0x00-0xFF) +3. Scan entire file buffer sequentially +4. Compare byte-by-byte with pattern +5. Record matches at instruction boundaries +6. Skip overlapping matches + +### Performance +⚡ **FAST** - Direct binary search, no disassembly required + +### Validation +- Each byte must be 1-2 hexadecimal digits +- Invalid characters show error: "Invalid byte pattern" +- Empty pattern returns no results + +--- + +## 3. STRING SEARCH ("ab" Button) + +### Purpose +Search for ASCII/UTF-8 text strings embedded in the binary file. + +### Use Cases +- Finding function names in debug symbols +- Locating string literals +- Finding copyright notices +- Searching for embedded text data + +### Characteristics +- **Case-sensitive** (unlike text mode) +- Searches raw binary data +- No null-terminator required +- UTF-8 encoding support + +### Examples +``` +Query: "main" +Finds: String "main" in binary (function name, debug symbol) + +Query: "Copyright" +Finds: Copyright strings in ROM data + +Query: "Error" +Finds: Error message strings + +Query: "Sony" +Finds: Developer/publisher strings +``` + +### Algorithm +1. Convert query string to UTF-8 bytes +2. Scan entire file buffer +3. Compare byte sequences +4. Record matches at instruction boundaries +5. Match is exact (no partial matches) + +### Performance +⚡ **FAST** - Direct binary search like byte mode + +### Encoding Details +``` +Query: "A" +Bytes: [0x41] + +Query: "Hello" +Bytes: [0x48, 0x65, 0x6C, 0x6C, 0x6F] + +Query: "日本" +Bytes: [0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC] (UTF-8) +``` + +--- + +## 4. REGEX SEARCH (.* Button) + +### Purpose +Advanced pattern matching using regular expressions. + +### Use Cases +- Complex pattern searches +- Finding instruction sequences +- Matching patterns in arguments +- Advanced filtering + +### Regex Flags +- **g**: Global (find all matches) +- **i**: Case-insensitive + +### Examples + +#### Basic Patterns +``` +Query: "lw.*sp" +Finds: Load word instructions using stack pointer +Match: "lw a0, $0010(sp)" + +Query: "^addiu" +Finds: Lines starting with addiu +Match: "addiu sp, sp, -16" + +Query: "(jal|jalr)" +Finds: All function calls (JAL or JALR) +Match: "jal $00001234" +Match: "jalr ra" +``` + +#### Advanced Patterns +``` +Query: "\$[0-9A-F]{8}" +Finds: All 32-bit hex addresses +Match: "$00001234" +Match: "$80000000" + +Query: "sp,\s*sp,\s*-" +Finds: Stack allocations (sp = sp - X) +Match: "addiu sp, sp, -16" +Match: "addiu sp,sp,-32" + +Query: "lw\s+\w+,\s*\$[0-9A-F]+\(sp\)" +Finds: Load from stack with hex offset +Match: "lw a0, $0010(sp)" +``` + +#### Metacharacters +- `.` = Any character +- `*` = Zero or more +- `+` = One or more +- `?` = Zero or one +- `^` = Start of line +- `$` = End of line +- `\s` = Whitespace +- `\w` = Word character +- `\d` = Digit +- `[abc]` = Character class +- `(a|b)` = Alternation + +### Algorithm +1. Compile regex with 'gi' flags +2. Create fresh instance per field +3. Execute regex.exec() in loop +4. Record all matches +5. Handle zero-length matches +6. Catch and ignore invalid regex + +### Performance +⚠️ **SLOW** - Must disassemble every instruction + regex overhead + +### Error Handling +Invalid regex syntax fails silently (returns no matches) + +--- + +## Search Architecture + +### Backend Processing (TypeScript) +1. Receives search request from frontend +2. Determines search strategy based on mode: + - **Byte/String**: Direct buffer search + - **Text/Regex**: Disassemble-then-search +3. Scans entire file (not just visible page) +4. Returns array of match objects: + ```typescript + { + instructionIndex: number, // 0-based instruction index + address: number, // Memory address + field: string, // 'addr'|'bytes'|'op'|'args'|etc + start: number, // Character position + length: number // Match length + } + ``` + +### Frontend Display (HTML/JS) +1. Receives match array +2. Stores in state +3. Jumps to first match +4. Highlights matches in visible rows: + - **All matches**: Orange background + - **Current match**: Brighter orange +5. Updates counter: "X of Y" + +### Navigation +- **Enter / F3**: Next match +- **Shift+Enter / Shift+F3**: Previous match +- **↑/↓ Buttons**: Manual navigation +- **Wrapping**: After last → first, before first → last + +--- + +## Performance Comparison + +| Mode | Speed | Disassembly Required | Use Case | +|--------|-------|---------------------|----------| +| Text | Slow | Yes (all instructions) | Quick searches | +| Bytes | Fast | No (binary scan) | Exact patterns | +| String | Fast | No (binary scan) | Text in data | +| Regex | Slow | Yes + regex overhead | Complex patterns | + +### Optimization Tips +1. Use **byte mode** for finding specific opcodes +2. Use **string mode** for finding embedded text +3. Use **text mode** for quick register/instruction searches +4. Use **regex mode** only when pattern matching is needed + +--- + +## Visual Feedback + +### Highlighting Colors +```css +.search-match { + background: #613214; /* Row background - all matches */ +} + +.search-current { + background: #4e3c1e; /* Row background - current match */ +} + +.search-match-highlight { + background: #f9826c; /* Text highlight - all matches */ + color: #000; +} + +.search-current-highlight { + background: #ea5c00; /* Text highlight - current match */ + color: #fff; +} +``` + +### UI Elements +- **Search input**: Border turns red for invalid byte patterns +- **Clear button (×)**: Appears when text is entered +- **Counter**: Shows "X of Y" or "No results" +- **Navigation buttons**: Disabled when no results + +--- + +## Keyboard Shortcuts + +| Shortcut | Action | +|----------|--------| +| Ctrl+F / Cmd+F | Open search panel | +| Enter | Search / Next match | +| Shift+Enter | Previous match | +| F3 | Next match | +| Shift+F3 | Previous match | +| Escape | Close search panel | + +--- + +## Implementation Notes + +### Memory Efficiency +- Entire file is loaded in backend (Node.js) +- Only match positions stored in frontend +- Page-based rendering unchanged +- Matches highlighted only when visible + +### Match Persistence +- Matches remain highlighted when scrolling +- Current match updates when navigating +- Clearing search removes all highlights +- Changing modes triggers new search + +### Edge Cases Handled +1. Invalid regex → silent fail, no matches +2. Invalid byte pattern → error message +3. Zero-length regex matches → prevented +4. Overlapping byte matches → skipped +5. No matches → "No results" message +6. Empty query → clears search + +--- + +## Common Search Patterns + +### Finding Function Prologues +```regex +Text: "addiu sp, sp, -" +Finds: Functions that allocate stack frames +``` + +### Finding Function Calls +```regex +Regex: "^jal " +Finds: All JAL (jump and link) instructions +``` + +### Finding Immediate Values +```regex +Regex: "\$[0-9A-F]{4}" +Finds: All 16-bit immediate values +``` + +### Finding Memory Loads +```regex +Text: "lw" +Finds: All load word instructions +``` + +### Finding Stack Operations +```regex +Text: "(sp)" +Finds: All stack-relative memory operations +``` \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html new file mode 100644 index 0000000..ea1a74d --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html @@ -0,0 +1,14 @@ + + + +

Disasm Panel Loaded

+ + + + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts new file mode 100644 index 0000000..bc03d9f --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts @@ -0,0 +1,17 @@ +import * as vscode from 'vscode'; +import { BasePanelProvider } from '../BaseProvider/BasePanelProvider'; + +export class DisasmPanelProvider extends BasePanelProvider { + constructor() { + super('disasmPanel', 'DisasmPanelProvider.html', "DisasmPanel"); // HTML file + } + + protected onDidResolveWebviewView(webviewView: vscode.WebviewView) { + // Listen to messages from the webview + webviewView.webview.onDidReceiveMessage(msg => { + if (msg.command === 'connect') { + vscode.window.showInformationMessage('Panel works!'); + } + }); + } +} diff --git a/vscode/cds-dis/cds-dis/src/resources/cds-icon.svg b/vscode/cds-dis/cds-dis/src/resources/cds-icon.svg new file mode 100644 index 0000000..b71be72 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/resources/cds-icon.svg @@ -0,0 +1,4 @@ + + + CDS +