c64-debug-mcp 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/http.cjs +63 -7
- package/dist/http.js +63 -7
- package/dist/stdio.cjs +63 -7
- package/dist/stdio.js +63 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,6 +26,25 @@ The MCP server accepts C64 addresses in multiple formats for natural interaction
|
|
|
26
26
|
|
|
27
27
|
**Note**: Bare hex without prefix (e.g., `D000`) is NOT supported to avoid ambiguity with 4-digit decimals.
|
|
28
28
|
|
|
29
|
+
### Range Support
|
|
30
|
+
|
|
31
|
+
Tools that read memory or set breakpoints support both **address+length** and **start+end** formats:
|
|
32
|
+
|
|
33
|
+
**Address + Length format** (original):
|
|
34
|
+
```javascript
|
|
35
|
+
memory_read(address="$D000", length=256) // Read 256 bytes starting at $D000
|
|
36
|
+
breakpoint_set(kind="exec", address="$1000", length=1) // Breakpoint at $1000
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Start + End format** (more intuitive for ranges):
|
|
40
|
+
```javascript
|
|
41
|
+
memory_read(start="$D000", end="$D0FF") // Read from $D000 to $D0FF inclusive
|
|
42
|
+
memory_read(start=198, end=199) // Read addresses 198-199 (2 bytes)
|
|
43
|
+
breakpoint_set(kind="exec", start="$1000", end="$1000") // Breakpoint at $1000
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Both formats work with all address representations (decimal, $, 0x).
|
|
47
|
+
|
|
29
48
|
**Common C64 Addresses**:
|
|
30
49
|
- `$D000` - SID chip registers (sound)
|
|
31
50
|
- `$D020` - Border color register
|
|
@@ -34,6 +53,24 @@ The MCP server accepts C64 addresses in multiple formats for natural interaction
|
|
|
34
53
|
- `$0800` - Common program start
|
|
35
54
|
- `$C000` - BASIC ROM start
|
|
36
55
|
|
|
56
|
+
## Address Ranges
|
|
57
|
+
|
|
58
|
+
For operations that work with memory ranges (like `memory_read` and `breakpoint_set`), you can specify ranges in two ways:
|
|
59
|
+
|
|
60
|
+
**Option 1: Address + Length**
|
|
61
|
+
```javascript
|
|
62
|
+
memory_read(address="$0400", length=256) // Read 256 bytes from $0400
|
|
63
|
+
breakpoint_set(kind="exec", address="$1000", length=16) // Break on $1000-$100F
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Option 2: Start + End (inclusive)**
|
|
67
|
+
```javascript
|
|
68
|
+
memory_read(start="$0400", end="$04FF") // Read from $0400 to $04FF (256 bytes)
|
|
69
|
+
breakpoint_set(kind="exec", start="$1000", end="$100F") // Break on $1000-$100F
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Both formats work identically and support all address formats (decimal, hex).
|
|
73
|
+
|
|
37
74
|
## Byte Value Formats
|
|
38
75
|
|
|
39
76
|
The MCP server accepts byte values (0-255) in multiple formats for natural C64-style input:
|
package/dist/http.cjs
CHANGED
|
@@ -153,6 +153,15 @@ var import_zod3 = require("zod");
|
|
|
153
153
|
var import_zod2 = require("zod");
|
|
154
154
|
var warningSchema = warningItemSchema;
|
|
155
155
|
function parseAddress16(input) {
|
|
156
|
+
if (input === void 0) {
|
|
157
|
+
throw new import_zod2.z.ZodError([
|
|
158
|
+
{
|
|
159
|
+
code: "custom",
|
|
160
|
+
message: "Address is required",
|
|
161
|
+
path: []
|
|
162
|
+
}
|
|
163
|
+
]);
|
|
164
|
+
}
|
|
156
165
|
if (typeof input === "number") {
|
|
157
166
|
if (!Number.isInteger(input) || input < 0 || input > 65535) {
|
|
158
167
|
throw new import_zod2.z.ZodError([
|
|
@@ -215,6 +224,15 @@ function parseAddress16(input) {
|
|
|
215
224
|
}
|
|
216
225
|
var address16Schema = import_zod2.z.preprocess(parseAddress16, import_zod2.z.number().int().min(0).max(65535)).describe("16-bit C64 address: decimal (53248) or hex string with prefix ($D000, 0xD000)");
|
|
217
226
|
function parseByte(input) {
|
|
227
|
+
if (input === void 0) {
|
|
228
|
+
throw new import_zod2.z.ZodError([
|
|
229
|
+
{
|
|
230
|
+
code: "custom",
|
|
231
|
+
message: "Byte value is required",
|
|
232
|
+
path: []
|
|
233
|
+
}
|
|
234
|
+
]);
|
|
235
|
+
}
|
|
218
236
|
if (typeof input === "number") {
|
|
219
237
|
if (!Number.isInteger(input) || input < 0 || input > 255) {
|
|
220
238
|
throw new import_zod2.z.ZodError([
|
|
@@ -3636,10 +3654,27 @@ var setRegistersTool = createViceTool({
|
|
|
3636
3654
|
});
|
|
3637
3655
|
var readMemoryTool = createViceTool({
|
|
3638
3656
|
id: "memory_read",
|
|
3639
|
-
description: "Reads a memory chunk
|
|
3640
|
-
inputSchema: import_zod4.z.
|
|
3641
|
-
|
|
3642
|
-
|
|
3657
|
+
description: "Reads a memory chunk. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000). Returns byte values as decimal numbers.",
|
|
3658
|
+
inputSchema: import_zod4.z.union([
|
|
3659
|
+
import_zod4.z.object({
|
|
3660
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3661
|
+
length: import_zod4.z.number().int().positive().max(65535).describe("Number of bytes to read")
|
|
3662
|
+
}),
|
|
3663
|
+
import_zod4.z.object({
|
|
3664
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3665
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3666
|
+
})
|
|
3667
|
+
]).transform((input) => {
|
|
3668
|
+
if ("start" in input && "end" in input) {
|
|
3669
|
+
if (input.end < input.start) {
|
|
3670
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3671
|
+
}
|
|
3672
|
+
return {
|
|
3673
|
+
address: input.start,
|
|
3674
|
+
length: input.end - input.start + 1
|
|
3675
|
+
};
|
|
3676
|
+
}
|
|
3677
|
+
return input;
|
|
3643
3678
|
}).refine((input) => input.address + input.length <= 65536, {
|
|
3644
3679
|
message: "address + length must stay within the 64K address space",
|
|
3645
3680
|
path: ["length"]
|
|
@@ -3719,15 +3754,36 @@ var listBreakpointsTool = createViceTool({
|
|
|
3719
3754
|
});
|
|
3720
3755
|
var breakpointSetTool = createViceTool({
|
|
3721
3756
|
id: "breakpoint_set",
|
|
3722
|
-
description: "Creates an execution breakpoint or read/write watchpoint.
|
|
3757
|
+
description: "Creates an execution breakpoint or read/write watchpoint. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000).",
|
|
3723
3758
|
inputSchema: import_zod4.z.object({
|
|
3724
3759
|
kind: breakpointKindSchema,
|
|
3725
|
-
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3726
|
-
length: import_zod4.z.number().int().positive().default(1).describe("Size of the breakpoint range in bytes"),
|
|
3727
3760
|
condition: import_zod4.z.string().optional(),
|
|
3728
3761
|
label: import_zod4.z.string().optional(),
|
|
3729
3762
|
temporary: import_zod4.z.boolean().default(false),
|
|
3730
3763
|
enabled: import_zod4.z.boolean().default(true)
|
|
3764
|
+
}).and(
|
|
3765
|
+
import_zod4.z.union([
|
|
3766
|
+
import_zod4.z.object({
|
|
3767
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3768
|
+
length: import_zod4.z.number().int().positive().default(1).describe("Size of the breakpoint range in bytes")
|
|
3769
|
+
}),
|
|
3770
|
+
import_zod4.z.object({
|
|
3771
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3772
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3773
|
+
})
|
|
3774
|
+
])
|
|
3775
|
+
).transform((input) => {
|
|
3776
|
+
if ("start" in input && "end" in input) {
|
|
3777
|
+
if (input.end < input.start) {
|
|
3778
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3779
|
+
}
|
|
3780
|
+
return {
|
|
3781
|
+
...input,
|
|
3782
|
+
address: input.start,
|
|
3783
|
+
length: input.end - input.start + 1
|
|
3784
|
+
};
|
|
3785
|
+
}
|
|
3786
|
+
return input;
|
|
3731
3787
|
}),
|
|
3732
3788
|
dataSchema: import_zod4.z.object({
|
|
3733
3789
|
breakpoint: breakpointSchema,
|
package/dist/http.js
CHANGED
|
@@ -130,6 +130,15 @@ import { ZodError } from "zod";
|
|
|
130
130
|
import { z as z2 } from "zod";
|
|
131
131
|
var warningSchema = warningItemSchema;
|
|
132
132
|
function parseAddress16(input) {
|
|
133
|
+
if (input === void 0) {
|
|
134
|
+
throw new z2.ZodError([
|
|
135
|
+
{
|
|
136
|
+
code: "custom",
|
|
137
|
+
message: "Address is required",
|
|
138
|
+
path: []
|
|
139
|
+
}
|
|
140
|
+
]);
|
|
141
|
+
}
|
|
133
142
|
if (typeof input === "number") {
|
|
134
143
|
if (!Number.isInteger(input) || input < 0 || input > 65535) {
|
|
135
144
|
throw new z2.ZodError([
|
|
@@ -192,6 +201,15 @@ function parseAddress16(input) {
|
|
|
192
201
|
}
|
|
193
202
|
var address16Schema = z2.preprocess(parseAddress16, z2.number().int().min(0).max(65535)).describe("16-bit C64 address: decimal (53248) or hex string with prefix ($D000, 0xD000)");
|
|
194
203
|
function parseByte(input) {
|
|
204
|
+
if (input === void 0) {
|
|
205
|
+
throw new z2.ZodError([
|
|
206
|
+
{
|
|
207
|
+
code: "custom",
|
|
208
|
+
message: "Byte value is required",
|
|
209
|
+
path: []
|
|
210
|
+
}
|
|
211
|
+
]);
|
|
212
|
+
}
|
|
195
213
|
if (typeof input === "number") {
|
|
196
214
|
if (!Number.isInteger(input) || input < 0 || input > 255) {
|
|
197
215
|
throw new z2.ZodError([
|
|
@@ -3613,10 +3631,27 @@ var setRegistersTool = createViceTool({
|
|
|
3613
3631
|
});
|
|
3614
3632
|
var readMemoryTool = createViceTool({
|
|
3615
3633
|
id: "memory_read",
|
|
3616
|
-
description: "Reads a memory chunk
|
|
3617
|
-
inputSchema: z3.
|
|
3618
|
-
|
|
3619
|
-
|
|
3634
|
+
description: "Reads a memory chunk. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000). Returns byte values as decimal numbers.",
|
|
3635
|
+
inputSchema: z3.union([
|
|
3636
|
+
z3.object({
|
|
3637
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3638
|
+
length: z3.number().int().positive().max(65535).describe("Number of bytes to read")
|
|
3639
|
+
}),
|
|
3640
|
+
z3.object({
|
|
3641
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3642
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3643
|
+
})
|
|
3644
|
+
]).transform((input) => {
|
|
3645
|
+
if ("start" in input && "end" in input) {
|
|
3646
|
+
if (input.end < input.start) {
|
|
3647
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3648
|
+
}
|
|
3649
|
+
return {
|
|
3650
|
+
address: input.start,
|
|
3651
|
+
length: input.end - input.start + 1
|
|
3652
|
+
};
|
|
3653
|
+
}
|
|
3654
|
+
return input;
|
|
3620
3655
|
}).refine((input) => input.address + input.length <= 65536, {
|
|
3621
3656
|
message: "address + length must stay within the 64K address space",
|
|
3622
3657
|
path: ["length"]
|
|
@@ -3696,15 +3731,36 @@ var listBreakpointsTool = createViceTool({
|
|
|
3696
3731
|
});
|
|
3697
3732
|
var breakpointSetTool = createViceTool({
|
|
3698
3733
|
id: "breakpoint_set",
|
|
3699
|
-
description: "Creates an execution breakpoint or read/write watchpoint.
|
|
3734
|
+
description: "Creates an execution breakpoint or read/write watchpoint. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000).",
|
|
3700
3735
|
inputSchema: z3.object({
|
|
3701
3736
|
kind: breakpointKindSchema,
|
|
3702
|
-
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3703
|
-
length: z3.number().int().positive().default(1).describe("Size of the breakpoint range in bytes"),
|
|
3704
3737
|
condition: z3.string().optional(),
|
|
3705
3738
|
label: z3.string().optional(),
|
|
3706
3739
|
temporary: z3.boolean().default(false),
|
|
3707
3740
|
enabled: z3.boolean().default(true)
|
|
3741
|
+
}).and(
|
|
3742
|
+
z3.union([
|
|
3743
|
+
z3.object({
|
|
3744
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3745
|
+
length: z3.number().int().positive().default(1).describe("Size of the breakpoint range in bytes")
|
|
3746
|
+
}),
|
|
3747
|
+
z3.object({
|
|
3748
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3749
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3750
|
+
})
|
|
3751
|
+
])
|
|
3752
|
+
).transform((input) => {
|
|
3753
|
+
if ("start" in input && "end" in input) {
|
|
3754
|
+
if (input.end < input.start) {
|
|
3755
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3756
|
+
}
|
|
3757
|
+
return {
|
|
3758
|
+
...input,
|
|
3759
|
+
address: input.start,
|
|
3760
|
+
length: input.end - input.start + 1
|
|
3761
|
+
};
|
|
3762
|
+
}
|
|
3763
|
+
return input;
|
|
3708
3764
|
}),
|
|
3709
3765
|
dataSchema: z3.object({
|
|
3710
3766
|
breakpoint: breakpointSchema,
|
package/dist/stdio.cjs
CHANGED
|
@@ -150,6 +150,15 @@ var import_zod3 = require("zod");
|
|
|
150
150
|
var import_zod2 = require("zod");
|
|
151
151
|
var warningSchema = warningItemSchema;
|
|
152
152
|
function parseAddress16(input) {
|
|
153
|
+
if (input === void 0) {
|
|
154
|
+
throw new import_zod2.z.ZodError([
|
|
155
|
+
{
|
|
156
|
+
code: "custom",
|
|
157
|
+
message: "Address is required",
|
|
158
|
+
path: []
|
|
159
|
+
}
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
153
162
|
if (typeof input === "number") {
|
|
154
163
|
if (!Number.isInteger(input) || input < 0 || input > 65535) {
|
|
155
164
|
throw new import_zod2.z.ZodError([
|
|
@@ -212,6 +221,15 @@ function parseAddress16(input) {
|
|
|
212
221
|
}
|
|
213
222
|
var address16Schema = import_zod2.z.preprocess(parseAddress16, import_zod2.z.number().int().min(0).max(65535)).describe("16-bit C64 address: decimal (53248) or hex string with prefix ($D000, 0xD000)");
|
|
214
223
|
function parseByte(input) {
|
|
224
|
+
if (input === void 0) {
|
|
225
|
+
throw new import_zod2.z.ZodError([
|
|
226
|
+
{
|
|
227
|
+
code: "custom",
|
|
228
|
+
message: "Byte value is required",
|
|
229
|
+
path: []
|
|
230
|
+
}
|
|
231
|
+
]);
|
|
232
|
+
}
|
|
215
233
|
if (typeof input === "number") {
|
|
216
234
|
if (!Number.isInteger(input) || input < 0 || input > 255) {
|
|
217
235
|
throw new import_zod2.z.ZodError([
|
|
@@ -3633,10 +3651,27 @@ var setRegistersTool = createViceTool({
|
|
|
3633
3651
|
});
|
|
3634
3652
|
var readMemoryTool = createViceTool({
|
|
3635
3653
|
id: "memory_read",
|
|
3636
|
-
description: "Reads a memory chunk
|
|
3637
|
-
inputSchema: import_zod4.z.
|
|
3638
|
-
|
|
3639
|
-
|
|
3654
|
+
description: "Reads a memory chunk. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000). Returns byte values as decimal numbers.",
|
|
3655
|
+
inputSchema: import_zod4.z.union([
|
|
3656
|
+
import_zod4.z.object({
|
|
3657
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3658
|
+
length: import_zod4.z.number().int().positive().max(65535).describe("Number of bytes to read")
|
|
3659
|
+
}),
|
|
3660
|
+
import_zod4.z.object({
|
|
3661
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3662
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3663
|
+
})
|
|
3664
|
+
]).transform((input) => {
|
|
3665
|
+
if ("start" in input && "end" in input) {
|
|
3666
|
+
if (input.end < input.start) {
|
|
3667
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3668
|
+
}
|
|
3669
|
+
return {
|
|
3670
|
+
address: input.start,
|
|
3671
|
+
length: input.end - input.start + 1
|
|
3672
|
+
};
|
|
3673
|
+
}
|
|
3674
|
+
return input;
|
|
3640
3675
|
}).refine((input) => input.address + input.length <= 65536, {
|
|
3641
3676
|
message: "address + length must stay within the 64K address space",
|
|
3642
3677
|
path: ["length"]
|
|
@@ -3716,15 +3751,36 @@ var listBreakpointsTool = createViceTool({
|
|
|
3716
3751
|
});
|
|
3717
3752
|
var breakpointSetTool = createViceTool({
|
|
3718
3753
|
id: "breakpoint_set",
|
|
3719
|
-
description: "Creates an execution breakpoint or read/write watchpoint.
|
|
3754
|
+
description: "Creates an execution breakpoint or read/write watchpoint. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000).",
|
|
3720
3755
|
inputSchema: import_zod4.z.object({
|
|
3721
3756
|
kind: breakpointKindSchema,
|
|
3722
|
-
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3723
|
-
length: import_zod4.z.number().int().positive().default(1).describe("Size of the breakpoint range in bytes"),
|
|
3724
3757
|
condition: import_zod4.z.string().optional(),
|
|
3725
3758
|
label: import_zod4.z.string().optional(),
|
|
3726
3759
|
temporary: import_zod4.z.boolean().default(false),
|
|
3727
3760
|
enabled: import_zod4.z.boolean().default(true)
|
|
3761
|
+
}).and(
|
|
3762
|
+
import_zod4.z.union([
|
|
3763
|
+
import_zod4.z.object({
|
|
3764
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3765
|
+
length: import_zod4.z.number().int().positive().default(1).describe("Size of the breakpoint range in bytes")
|
|
3766
|
+
}),
|
|
3767
|
+
import_zod4.z.object({
|
|
3768
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3769
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3770
|
+
})
|
|
3771
|
+
])
|
|
3772
|
+
).transform((input) => {
|
|
3773
|
+
if ("start" in input && "end" in input) {
|
|
3774
|
+
if (input.end < input.start) {
|
|
3775
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3776
|
+
}
|
|
3777
|
+
return {
|
|
3778
|
+
...input,
|
|
3779
|
+
address: input.start,
|
|
3780
|
+
length: input.end - input.start + 1
|
|
3781
|
+
};
|
|
3782
|
+
}
|
|
3783
|
+
return input;
|
|
3728
3784
|
}),
|
|
3729
3785
|
dataSchema: import_zod4.z.object({
|
|
3730
3786
|
breakpoint: breakpointSchema,
|
package/dist/stdio.js
CHANGED
|
@@ -127,6 +127,15 @@ import { ZodError } from "zod";
|
|
|
127
127
|
import { z as z2 } from "zod";
|
|
128
128
|
var warningSchema = warningItemSchema;
|
|
129
129
|
function parseAddress16(input) {
|
|
130
|
+
if (input === void 0) {
|
|
131
|
+
throw new z2.ZodError([
|
|
132
|
+
{
|
|
133
|
+
code: "custom",
|
|
134
|
+
message: "Address is required",
|
|
135
|
+
path: []
|
|
136
|
+
}
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
130
139
|
if (typeof input === "number") {
|
|
131
140
|
if (!Number.isInteger(input) || input < 0 || input > 65535) {
|
|
132
141
|
throw new z2.ZodError([
|
|
@@ -189,6 +198,15 @@ function parseAddress16(input) {
|
|
|
189
198
|
}
|
|
190
199
|
var address16Schema = z2.preprocess(parseAddress16, z2.number().int().min(0).max(65535)).describe("16-bit C64 address: decimal (53248) or hex string with prefix ($D000, 0xD000)");
|
|
191
200
|
function parseByte(input) {
|
|
201
|
+
if (input === void 0) {
|
|
202
|
+
throw new z2.ZodError([
|
|
203
|
+
{
|
|
204
|
+
code: "custom",
|
|
205
|
+
message: "Byte value is required",
|
|
206
|
+
path: []
|
|
207
|
+
}
|
|
208
|
+
]);
|
|
209
|
+
}
|
|
192
210
|
if (typeof input === "number") {
|
|
193
211
|
if (!Number.isInteger(input) || input < 0 || input > 255) {
|
|
194
212
|
throw new z2.ZodError([
|
|
@@ -3610,10 +3628,27 @@ var setRegistersTool = createViceTool({
|
|
|
3610
3628
|
});
|
|
3611
3629
|
var readMemoryTool = createViceTool({
|
|
3612
3630
|
id: "memory_read",
|
|
3613
|
-
description: "Reads a memory chunk
|
|
3614
|
-
inputSchema: z3.
|
|
3615
|
-
|
|
3616
|
-
|
|
3631
|
+
description: "Reads a memory chunk. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000). Returns byte values as decimal numbers.",
|
|
3632
|
+
inputSchema: z3.union([
|
|
3633
|
+
z3.object({
|
|
3634
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3635
|
+
length: z3.number().int().positive().max(65535).describe("Number of bytes to read")
|
|
3636
|
+
}),
|
|
3637
|
+
z3.object({
|
|
3638
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3639
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3640
|
+
})
|
|
3641
|
+
]).transform((input) => {
|
|
3642
|
+
if ("start" in input && "end" in input) {
|
|
3643
|
+
if (input.end < input.start) {
|
|
3644
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3645
|
+
}
|
|
3646
|
+
return {
|
|
3647
|
+
address: input.start,
|
|
3648
|
+
length: input.end - input.start + 1
|
|
3649
|
+
};
|
|
3650
|
+
}
|
|
3651
|
+
return input;
|
|
3617
3652
|
}).refine((input) => input.address + input.length <= 65536, {
|
|
3618
3653
|
message: "address + length must stay within the 64K address space",
|
|
3619
3654
|
path: ["length"]
|
|
@@ -3693,15 +3728,36 @@ var listBreakpointsTool = createViceTool({
|
|
|
3693
3728
|
});
|
|
3694
3729
|
var breakpointSetTool = createViceTool({
|
|
3695
3730
|
id: "breakpoint_set",
|
|
3696
|
-
description: "Creates an execution breakpoint or read/write watchpoint.
|
|
3731
|
+
description: "Creates an execution breakpoint or read/write watchpoint. Use either (address, length) or (start, end) format. Addresses can be decimal (53248) or hex string with prefix ($D000, 0xD000).",
|
|
3697
3732
|
inputSchema: z3.object({
|
|
3698
3733
|
kind: breakpointKindSchema,
|
|
3699
|
-
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3700
|
-
length: z3.number().int().positive().default(1).describe("Size of the breakpoint range in bytes"),
|
|
3701
3734
|
condition: z3.string().optional(),
|
|
3702
3735
|
label: z3.string().optional(),
|
|
3703
3736
|
temporary: z3.boolean().default(false),
|
|
3704
3737
|
enabled: z3.boolean().default(true)
|
|
3738
|
+
}).and(
|
|
3739
|
+
z3.union([
|
|
3740
|
+
z3.object({
|
|
3741
|
+
address: address16Schema.describe("Start address: decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3742
|
+
length: z3.number().int().positive().default(1).describe("Size of the breakpoint range in bytes")
|
|
3743
|
+
}),
|
|
3744
|
+
z3.object({
|
|
3745
|
+
start: address16Schema.describe("Start address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)"),
|
|
3746
|
+
end: address16Schema.describe("End address (inclusive): decimal (53248) or hex string with prefix ($D000, 0xD000)")
|
|
3747
|
+
})
|
|
3748
|
+
])
|
|
3749
|
+
).transform((input) => {
|
|
3750
|
+
if ("start" in input && "end" in input) {
|
|
3751
|
+
if (input.end < input.start) {
|
|
3752
|
+
throw new Error("End address must be greater than or equal to start address");
|
|
3753
|
+
}
|
|
3754
|
+
return {
|
|
3755
|
+
...input,
|
|
3756
|
+
address: input.start,
|
|
3757
|
+
length: input.end - input.start + 1
|
|
3758
|
+
};
|
|
3759
|
+
}
|
|
3760
|
+
return input;
|
|
3705
3761
|
}),
|
|
3706
3762
|
dataSchema: z3.object({
|
|
3707
3763
|
breakpoint: breakpointSchema,
|