Skip to content

Commit c1e4eb0

Browse files
authored
Merge pull request #4 from grahambates/disassembly_view
Port disassembly view from vscode-amiga-assembly
2 parents ec88dc6 + 57fb1ee commit c1e4eb0

4 files changed

Lines changed: 129 additions & 19 deletions

File tree

.vscode/launch.json

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,11 @@
99
"name": "Extension",
1010
"outFiles": ["${workspaceFolder}/out/**/*.js"],
1111
"request": "launch",
12-
"type": "extensionHost"
13-
},
14-
{
15-
"name": "Server",
16-
"type": "node",
17-
"request": "launch",
18-
"cwd": "${workspaceFolder}",
19-
"program": "${workspaceFolder}/src/debugAdapter.ts",
20-
"args": ["--server=4711"],
21-
"outFiles": ["${workspaceFolder}/out/**/*.js"],
12+
"type": "extensionHost",
2213
"preLaunchTask": {
2314
"type": "npm",
2415
"script": "build-dev"
2516
}
2617
}
27-
],
28-
"compounds": [
29-
{
30-
"name": "Extension + Server",
31-
"configurations": ["Extension", "Server"]
32-
}
3318
]
3419
}

package.json

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,20 @@
4242
"mame"
4343
],
4444
"contributes": {
45+
"views": {
46+
"debug": [
47+
{
48+
"id": "disassembledMemory",
49+
"name": "DISASSEMBLED MEMORY"
50+
}
51+
]
52+
},
53+
"commands": [
54+
{
55+
"command": "disassembledMemory.setDisassembledMemory",
56+
"title": "Set disassembled memory"
57+
}
58+
],
4559
"breakpoints": [
4660
{
4761
"language": "m68k"
@@ -185,7 +199,11 @@
185199
"noDebug": true,
186200
"program": "${workspaceFolder}/build/myprogram.rom",
187201
"mappings": "${workspaceFolder}/build/mappings.txt",
188-
"emulatorArgs": [ "-debug", "-debugger", "none" ],
202+
"emulatorArgs": [
203+
"-debug",
204+
"-debugger",
205+
"none"
206+
],
189207
"preLaunchTask": "build"
190208
}
191209
],

src/debugSessionVsc.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import * as vscode from "vscode";
2+
import { UAEDebugSession } from "./debugSession";
3+
4+
export class UAEDebugSessionVsc extends UAEDebugSession {
5+
protected currentMemoryViewPc = -1;
6+
7+
protected async onCpuFrame(address: number): Promise<void> {
8+
super.onCpuFrame(address);
9+
if (address !== this.currentMemoryViewPc) {
10+
this.currentMemoryViewPc = address;
11+
const dLines = await this.disassemblyManager().disassemble({
12+
memoryReference: address.toString(),
13+
instructionCount: 25,
14+
});
15+
await vscode.commands.executeCommand(
16+
"disassembledMemory.setDisassembledMemory",
17+
dLines
18+
);
19+
}
20+
}
21+
}

src/index.ts

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,88 @@
1-
// Intentionally left empty
2-
// Extension only provides debug adapter
1+
import * as vscode from "vscode";
2+
import { DebugProtocol } from "@vscode/debugprotocol";
3+
import { UAEDebugSessionVsc } from "./debugSessionVsc";
4+
5+
export async function activate(
6+
context: vscode.ExtensionContext
7+
): Promise<void> {
8+
const disassembledMemoryDataProvider = new DisassembledMemoryDataProvider();
9+
vscode.window.registerTreeDataProvider(
10+
"disassembledMemory",
11+
disassembledMemoryDataProvider
12+
);
13+
14+
vscode.commands.registerCommand(
15+
"disassembledMemory.setDisassembledMemory",
16+
(memory: DebugProtocol.DisassembledInstruction[]) =>
17+
disassembledMemoryDataProvider.setDisassembledMemory(memory)
18+
);
19+
20+
context.subscriptions.push(
21+
vscode.debug.registerDebugAdapterDescriptorFactory(
22+
"mame-m68k-debugger",
23+
new InlineDebugAdapterFactory()
24+
)
25+
);
26+
}
27+
28+
class InlineDebugAdapterFactory
29+
implements vscode.DebugAdapterDescriptorFactory
30+
{
31+
createDebugAdapterDescriptor(
32+
_session: vscode.DebugSession
33+
): vscode.ProviderResult<vscode.DebugAdapterDescriptor> {
34+
// since DebugAdapterInlineImplementation is proposed API, a cast to <any> is required for now
35+
return new (vscode as any).DebugAdapterInlineImplementation(
36+
new UAEDebugSessionVsc()
37+
);
38+
}
39+
}
40+
41+
export class DisassembledMemoryDataProvider
42+
implements vscode.TreeDataProvider<ViewLineItem>
43+
{
44+
private _onDidChangeTreeData: vscode.EventEmitter<ViewLineItem | undefined> =
45+
new vscode.EventEmitter<ViewLineItem | undefined>();
46+
readonly onDidChangeTreeData: vscode.Event<ViewLineItem | undefined> =
47+
this._onDidChangeTreeData.event;
48+
private currentValues?: Array<ViewLineItem>;
49+
50+
refresh(): void {
51+
this._onDidChangeTreeData.fire(undefined);
52+
}
53+
54+
getTreeItem(element: ViewLineItem): vscode.TreeItem {
55+
return element;
56+
}
57+
58+
async getChildren(element?: ViewLineItem): Promise<ViewLineItem[]> {
59+
if (!element && this.currentValues) {
60+
return this.currentValues;
61+
} else {
62+
return [];
63+
}
64+
}
65+
setDisassembledMemory(memory: DebugProtocol.DisassembledInstruction[]): void {
66+
this.currentValues = new Array<ViewLineItem>();
67+
for (const dl of memory) {
68+
const item = new ViewLineItem(`${dl.address}: ${dl.instruction}`);
69+
if (dl.instructionBytes) {
70+
item.description = dl.instructionBytes;
71+
}
72+
this.currentValues.push(item);
73+
}
74+
this.refresh();
75+
}
76+
}
77+
78+
export class ViewLineItem extends vscode.TreeItem {
79+
public description = "";
80+
81+
constructor(label: string) {
82+
super(label, vscode.TreeItemCollapsibleState.None);
83+
}
84+
85+
getDescription(): string {
86+
return this.description;
87+
}
88+
}

0 commit comments

Comments
 (0)