c64bridge 1.0.7 → 1.1.0

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.
Files changed (132) hide show
  1. package/.github/skills/assembly-program/SKILL.md +37 -0
  2. package/.github/skills/basic-program/SKILL.md +40 -0
  3. package/.github/skills/cross-platform-demo/SKILL.md +32 -0
  4. package/.github/skills/drive-manager/SKILL.md +33 -0
  5. package/.github/skills/graphics-demo/SKILL.md +30 -0
  6. package/.github/skills/hello-world/SKILL.md +36 -0
  7. package/.github/skills/memory-debug/SKILL.md +32 -0
  8. package/.github/skills/pr-converge/SKILL.md +33 -0
  9. package/.github/skills/printer-job/SKILL.md +30 -0
  10. package/.github/skills/sid-music/SKILL.md +35 -0
  11. package/.github/skills/software-launch/SKILL.md +31 -0
  12. package/.github/skills/stream-control/SKILL.md +29 -0
  13. package/.github/skills/system-control/SKILL.md +32 -0
  14. package/AGENTS.md +28 -7
  15. package/README.md +69 -14
  16. package/data/assembly/assembly-spec.md +2 -0
  17. package/dist/c64Client.js +238 -60
  18. package/dist/config.js +48 -26
  19. package/dist/device.js +92 -37
  20. package/dist/diagnostics.js +62 -2
  21. package/dist/hostPaths.js +128 -0
  22. package/dist/loggingHttpClient.js +59 -1
  23. package/dist/mcp-server.js +409 -286
  24. package/dist/numericArg.js +55 -0
  25. package/dist/petscii.js +13 -1
  26. package/dist/platform.js +12 -3
  27. package/dist/prompts/registry.js +6 -1
  28. package/dist/tools/access.js +66 -0
  29. package/dist/tools/debug.js +6 -0
  30. package/dist/tools/developer.js +67 -34
  31. package/dist/tools/errors.js +54 -3
  32. package/dist/tools/input.js +23 -6
  33. package/dist/tools/machineControl.js +112 -20
  34. package/dist/tools/memory.js +135 -30
  35. package/dist/tools/meta/artifacts.js +5 -5
  36. package/dist/tools/meta/background.js +216 -54
  37. package/dist/tools/meta/compilation.js +6 -5
  38. package/dist/tools/meta/config.js +15 -6
  39. package/dist/tools/meta/filesystem.js +16 -14
  40. package/dist/tools/meta/graphics.js +48 -20
  41. package/dist/tools/meta/memory.js +45 -19
  42. package/dist/tools/meta/program.js +10 -7
  43. package/dist/tools/meta/screen.js +116 -25
  44. package/dist/tools/pauseGuard.js +23 -0
  45. package/dist/tools/pollValidator.js +53 -8
  46. package/dist/tools/programRunners.js +62 -18
  47. package/dist/tools/registry/batch.js +16 -4
  48. package/dist/tools/registry/config.js +9 -2
  49. package/dist/tools/registry/disk.js +12 -2
  50. package/dist/tools/registry/drive.js +3 -0
  51. package/dist/tools/registry/extract.js +3 -0
  52. package/dist/tools/registry/graphics.js +59 -6
  53. package/dist/tools/registry/index.js +17 -1
  54. package/dist/tools/registry/memory.js +11 -1
  55. package/dist/tools/registry/platform.js +4 -1
  56. package/dist/tools/registry/printer.js +2 -1
  57. package/dist/tools/registry/program.js +5 -1
  58. package/dist/tools/registry/rag.js +1 -0
  59. package/dist/tools/registry/sound.js +12 -1
  60. package/dist/tools/registry/stream.js +2 -1
  61. package/dist/tools/registry/system.js +8 -1
  62. package/dist/tools/schema.js +7 -7
  63. package/dist/tools/streaming.js +34 -4
  64. package/dist/tools/translation/assembler.js +247 -24
  65. package/dist/tools/translation/basicDetokenizer.js +80 -0
  66. package/dist/tools/translation/basicTokenizer.js +8 -3
  67. package/dist/tools/translation/disassembler.js +14 -0
  68. package/dist/tools/types.js +258 -7
  69. package/dist/tools/vice.js +5 -16
  70. package/dist/vicBitmap.js +1 -1
  71. package/dist/vice/mockServer.js +3 -0
  72. package/dist/vice/process.js +19 -0
  73. package/dist/vice/resourcePolicy.js +36 -0
  74. package/dist/vice/viceClient.js +22 -5
  75. package/doc/vice/support-matrix.md +17 -11
  76. package/mcp/schemas/c64_batch.schema.json +2 -1
  77. package/mcp/schemas/c64_config.schema.json +25 -475
  78. package/mcp/schemas/c64_debug.schema.json +3 -602
  79. package/mcp/schemas/c64_disk.schema.json +17 -344
  80. package/mcp/schemas/c64_drive.schema.json +2 -157
  81. package/mcp/schemas/c64_extract.schema.json +10 -364
  82. package/mcp/schemas/c64_graphics.schema.json +19 -426
  83. package/mcp/schemas/c64_input.schema.json +5 -318
  84. package/mcp/schemas/c64_memory.schema.json +23 -491
  85. package/mcp/schemas/c64_printer.schema.json +3 -258
  86. package/mcp/schemas/c64_program.schema.json +16 -491
  87. package/mcp/schemas/c64_rag.schema.json +1 -81
  88. package/mcp/schemas/c64_select_backend.schema.json +2 -36
  89. package/mcp/schemas/c64_sound.schema.json +20 -822
  90. package/mcp/schemas/c64_stream.schema.json +4 -75
  91. package/mcp/schemas/c64_system.schema.json +28 -348
  92. package/mcp/schemas/c64_vice.schema.json +2 -71
  93. package/mcp/server.json +1 -1
  94. package/mcp/tools.json +1983 -6910
  95. package/mcp.json +21 -1
  96. package/package.json +16 -8
  97. package/scripts/mockC64Server.mjs +44 -0
  98. package/scripts/run-coverage.mjs +27 -1
  99. package/scripts/smoke-run.sh +3 -2
  100. package/scripts/start.mjs +23 -1
  101. package/server.json +35 -2
  102. package/dist/.tsbuildinfo +0 -1
  103. package/doc/agent-state-spec.md +0 -243
  104. package/doc/audit/secret-handling.md +0 -61
  105. package/doc/plans/bun/baseline-metrics.md +0 -16
  106. package/doc/plans/bun/migration-checklist.md +0 -55
  107. package/doc/plans/bun/migration.md +0 -83
  108. package/doc/plans/improve-knowledge/notes.md +0 -43
  109. package/doc/plans/improve-knowledge/plan.md +0 -121
  110. package/doc/plans/improve-knowledge/rollout.md +0 -110
  111. package/doc/plans/meta-tools/README.md +0 -110
  112. package/doc/plans/meta-tools/analysis.md +0 -272
  113. package/doc/plans/meta-tools/catalog.md +0 -435
  114. package/doc/plans/meta-tools/notes.md +0 -192
  115. package/doc/plans/meta-tools/rollout.md +0 -368
  116. package/doc/plans/prompts/README.md +0 -96
  117. package/doc/plans/prompts/user-prompt-ideas.md +0 -147
  118. package/doc/plans/tool-consolidation/notes.md +0 -28
  119. package/doc/plans/tool-consolidation/plan.md +0 -169
  120. package/doc/plans/tool-consolidation/rollout.md +0 -104
  121. package/doc/plans/vice-backend-switch/plan.md +0 -486
  122. package/doc/plans/vice-backend-switch-2/plan.md +0 -48
  123. package/doc/plans/vice-support/notes.md +0 -63
  124. package/doc/plans/vice-support/plan.md +0 -88
  125. package/doc/plans/vice-support/rollout.md +0 -99
  126. package/doc/reviews/audit.md +0 -143
  127. package/doc/reviews/hardening/01-fable/prompt-handover.md +0 -125
  128. package/doc/reviews/hardening/01-fable/prompt.md +0 -98
  129. package/doc/reviews/hardening/01-fable/review-prompt.md +0 -468
  130. package/doc/reviews/hardening/01-fable/review.md +0 -1234
  131. package/doc/reviews/vice-support-review.md +0 -185
  132. package/scripts/compare-rest/rest-compare-2025-11-01T00-25-21-830Z.json +0 -2513
@@ -8,6 +8,7 @@
8
8
  "write",
9
9
  "read_screen",
10
10
  "wait_for_text",
11
+ "list_basic",
11
12
  "disassemble",
12
13
  "copy_memory",
13
14
  "fill_memory",
@@ -24,10 +25,21 @@
24
25
  },
25
26
  "length": {
26
27
  "type": "integer",
27
- "description": "Number of bytes to read starting from the resolved address.",
28
+ "description": "Number of bytes to read starting from the resolved address. Limits depend on op.",
28
29
  "minimum": 1,
29
- "maximum": 4096,
30
- "default": 256
30
+ "maximum": 16384
31
+ },
32
+ "format": {
33
+ "type": [
34
+ "string",
35
+ "null"
36
+ ],
37
+ "description": "Output layout. hex (default) returns one hex string; dump adds a 16-bytes-per-line listing with addresses and a printable PETSCII column.",
38
+ "enum": [
39
+ "hex",
40
+ "dump"
41
+ ],
42
+ "default": "hex"
31
43
  },
32
44
  "bytes": {
33
45
  "type": "string",
@@ -65,7 +77,7 @@
65
77
  },
66
78
  "pattern": {
67
79
  "type": "string",
68
- "description": "Substring or regex to find",
80
+ "description": "Substring or regex to find (at most 200 characters; regex with nested quantifiers or backreferences is rejected) Limits depend on op.",
69
81
  "minLength": 1
70
82
  },
71
83
  "isRegex": {
@@ -89,8 +101,9 @@
89
101
  "integer",
90
102
  "null"
91
103
  ],
92
- "description": "Overall timeout in milliseconds",
104
+ "description": "Overall timeout in milliseconds (1-120000)",
93
105
  "minimum": 1,
106
+ "maximum": 120000,
94
107
  "default": 3000
95
108
  },
96
109
  "intervalMs": {
@@ -98,8 +111,8 @@
98
111
  "integer",
99
112
  "null"
100
113
  ],
101
- "description": "Poll interval in milliseconds",
102
- "minimum": 1,
114
+ "description": "Poll interval in milliseconds (at least 20)",
115
+ "minimum": 20,
103
116
  "default": 100
104
117
  },
105
118
  "instructionCount": {
@@ -107,7 +120,7 @@
107
120
  "integer",
108
121
  "null"
109
122
  ],
110
- "description": "Stop after this many instructions (overrides length as a termination condition).",
123
+ "description": "Stop after this many instructions. When given, it replaces length: 3 x instructionCount bytes are read (fewer near $FFFF).",
111
124
  "minimum": 1,
112
125
  "maximum": 512
113
126
  },
@@ -178,487 +191,6 @@
178
191
  "required": [
179
192
  "op"
180
193
  ],
181
- "description": "Memory operations available via the c64_memory tool.\n\nOperations:\n- read: Read a range of bytes and return a hex dump with address metadata. Required inputs: address. Optional inputs: length.\n- write: Write a hexadecimal byte sequence into RAM. Required inputs: address, bytes. Optional inputs: verify, expected, mask, abortOnMismatch.\n- read_screen: Return the current 40x25 text screen converted to ASCII. Required inputs: none.\n- wait_for_text: Poll the screen until a substring or regex appears, or timeout elapses. Required inputs: pattern. Optional inputs: isRegex, caseInsensitive, timeoutMs, intervalMs.\n- disassemble: Disassemble a memory region into annotated 6502/6510 instructions, including undocumented opcodes with canonical names. Symbol annotations from `.vs` files are applied when available. Works on C64U/U64, U2-family hardware, and VICE. Required inputs: address. Optional inputs: length, instructionCount.\n- copy_memory: Copy a RAM region to another address. Required inputs: source, dest, length.\n- fill_memory: Fill a memory range with a repeating byte pattern. Required inputs: address, length, pattern.\n- search_memory: Search for a byte pattern within a memory range and return matching addresses. Required inputs: startAddress, endAddress, pattern. Optional inputs: maxResults.\n- compare_memory: Compare two memory regions byte-by-byte and report differences. Required inputs: address1, address2, length. Optional inputs: maxDiffs.\n- save_memory: Dump a memory range to a local file, with an optional PRG load-address header. Required inputs: startAddress, endAddress, filePath. Optional inputs: asPrg.",
182
- "additionalProperties": false,
183
- "x-c64bridge-operations": [
184
- {
185
- "op": "read",
186
- "description": "Read a range of bytes and return a hex dump with address metadata.",
187
- "required": [
188
- "address"
189
- ],
190
- "optional": [
191
- "length"
192
- ],
193
- "inputSchema": {
194
- "type": "object",
195
- "description": "Read a range of bytes and return a hex dump with address metadata.",
196
- "properties": {
197
- "address": {
198
- "type": "string",
199
- "description": "Start address expressed as $HHHH, decimal, or a documented symbol name.",
200
- "minLength": 1
201
- },
202
- "length": {
203
- "type": "integer",
204
- "description": "Number of bytes to read starting from the resolved address.",
205
- "minimum": 1,
206
- "maximum": 4096,
207
- "default": 256
208
- },
209
- "op": {
210
- "const": "read"
211
- }
212
- },
213
- "required": [
214
- "address",
215
- "op"
216
- ],
217
- "additionalProperties": false
218
- }
219
- },
220
- {
221
- "op": "write",
222
- "description": "Write a hexadecimal byte sequence into RAM.",
223
- "required": [
224
- "address",
225
- "bytes"
226
- ],
227
- "optional": [
228
- "verify",
229
- "expected",
230
- "mask",
231
- "abortOnMismatch"
232
- ],
233
- "inputSchema": {
234
- "type": "object",
235
- "description": "Write a hexadecimal byte sequence into RAM.",
236
- "properties": {
237
- "address": {
238
- "type": "string",
239
- "description": "Destination address expressed as $HHHH, decimal, or a documented symbol name.",
240
- "minLength": 1
241
- },
242
- "bytes": {
243
- "type": "string",
244
- "description": "Hex byte sequence like $AABBCC or AA BB CC to write starting at the resolved address.",
245
- "minLength": 2,
246
- "pattern": "^[\\s_0-9A-Fa-f$]+$"
247
- },
248
- "verify": {
249
- "type": "boolean",
250
- "description": "When true, verify the write by reading before and after the change; Ultimate hardware also pauses during verification.",
251
- "default": false
252
- },
253
- "expected": {
254
- "type": [
255
- "string",
256
- "null"
257
- ],
258
- "description": "Optional hex data expected before the write (verifies before writing).",
259
- "minLength": 2,
260
- "pattern": "^[\\s_0-9A-Fa-f$]+$"
261
- },
262
- "mask": {
263
- "type": [
264
- "string",
265
- "null"
266
- ],
267
- "description": "Optional verification mask (hex); only bits set in the mask are compared.",
268
- "minLength": 2,
269
- "pattern": "^[\\s_0-9A-Fa-f$]+$"
270
- },
271
- "abortOnMismatch": {
272
- "type": "boolean",
273
- "description": "Abort the write when the pre-write verification fails.",
274
- "default": true
275
- },
276
- "op": {
277
- "const": "write"
278
- }
279
- },
280
- "required": [
281
- "address",
282
- "bytes",
283
- "op"
284
- ],
285
- "additionalProperties": false
286
- }
287
- },
288
- {
289
- "op": "read_screen",
290
- "description": "Return the current 40x25 text screen converted to ASCII.",
291
- "required": [],
292
- "optional": [],
293
- "inputSchema": {
294
- "type": "object",
295
- "description": "Return the current 40x25 text screen converted to ASCII.",
296
- "properties": {
297
- "op": {
298
- "const": "read_screen"
299
- }
300
- },
301
- "additionalProperties": false,
302
- "required": [
303
- "op"
304
- ]
305
- }
306
- },
307
- {
308
- "op": "wait_for_text",
309
- "description": "Poll the screen until a substring or regex appears, or timeout elapses.",
310
- "required": [
311
- "pattern"
312
- ],
313
- "optional": [
314
- "isRegex",
315
- "caseInsensitive",
316
- "timeoutMs",
317
- "intervalMs"
318
- ],
319
- "inputSchema": {
320
- "type": "object",
321
- "description": "Poll the screen until a substring or regex appears, or timeout elapses.",
322
- "properties": {
323
- "pattern": {
324
- "type": "string",
325
- "description": "Substring or regex to find",
326
- "minLength": 1
327
- },
328
- "isRegex": {
329
- "type": [
330
- "boolean",
331
- "null"
332
- ],
333
- "description": "Interpret pattern as regular expression",
334
- "default": false
335
- },
336
- "caseInsensitive": {
337
- "type": [
338
- "boolean",
339
- "null"
340
- ],
341
- "description": "Case-insensitive search",
342
- "default": true
343
- },
344
- "timeoutMs": {
345
- "type": [
346
- "integer",
347
- "null"
348
- ],
349
- "description": "Overall timeout in milliseconds",
350
- "minimum": 1,
351
- "default": 3000
352
- },
353
- "intervalMs": {
354
- "type": [
355
- "integer",
356
- "null"
357
- ],
358
- "description": "Poll interval in milliseconds",
359
- "minimum": 1,
360
- "default": 100
361
- },
362
- "op": {
363
- "const": "wait_for_text"
364
- }
365
- },
366
- "required": [
367
- "pattern",
368
- "op"
369
- ],
370
- "additionalProperties": false
371
- }
372
- },
373
- {
374
- "op": "disassemble",
375
- "description": "Disassemble a memory region into annotated 6502/6510 instructions, including undocumented opcodes with canonical names. Symbol annotations from `.vs` files are applied when available. Works on C64U/U64, U2-family hardware, and VICE.",
376
- "required": [
377
- "address"
378
- ],
379
- "optional": [
380
- "length",
381
- "instructionCount"
382
- ],
383
- "inputSchema": {
384
- "type": "object",
385
- "description": "Disassemble a memory region into annotated 6502/6510 instructions, including undocumented opcodes with canonical names. Symbol annotations from `.vs` files are applied when available. Works on C64U/U64, U2-family hardware, and VICE.",
386
- "properties": {
387
- "address": {
388
- "type": "string",
389
- "description": "Start address as $HHHH, decimal, or symbol name.",
390
- "minLength": 1
391
- },
392
- "length": {
393
- "type": "integer",
394
- "description": "Number of bytes to read and disassemble.",
395
- "minimum": 1,
396
- "maximum": 4096,
397
- "default": 64
398
- },
399
- "instructionCount": {
400
- "type": [
401
- "integer",
402
- "null"
403
- ],
404
- "description": "Stop after this many instructions (overrides length as a termination condition).",
405
- "minimum": 1,
406
- "maximum": 512
407
- },
408
- "op": {
409
- "const": "disassemble"
410
- }
411
- },
412
- "required": [
413
- "address",
414
- "op"
415
- ],
416
- "additionalProperties": false
417
- }
418
- },
419
- {
420
- "op": "copy_memory",
421
- "description": "Copy a RAM region to another address.",
422
- "required": [
423
- "source",
424
- "dest",
425
- "length"
426
- ],
427
- "optional": [],
428
- "inputSchema": {
429
- "type": "object",
430
- "description": "Copy a RAM region to another address.",
431
- "properties": {
432
- "source": {
433
- "type": "string",
434
- "description": "Source start address ($HHHH, decimal, or symbol).",
435
- "minLength": 1
436
- },
437
- "dest": {
438
- "type": "string",
439
- "description": "Destination start address.",
440
- "minLength": 1
441
- },
442
- "length": {
443
- "type": "integer",
444
- "description": "Number of bytes to copy (1–16384).",
445
- "minimum": 1,
446
- "maximum": 16384
447
- },
448
- "op": {
449
- "const": "copy_memory"
450
- }
451
- },
452
- "required": [
453
- "source",
454
- "dest",
455
- "length",
456
- "op"
457
- ],
458
- "additionalProperties": false
459
- }
460
- },
461
- {
462
- "op": "fill_memory",
463
- "description": "Fill a memory range with a repeating byte pattern.",
464
- "required": [
465
- "address",
466
- "length",
467
- "pattern"
468
- ],
469
- "optional": [],
470
- "inputSchema": {
471
- "type": "object",
472
- "description": "Fill a memory range with a repeating byte pattern.",
473
- "properties": {
474
- "address": {
475
- "type": "string",
476
- "description": "Start address ($HHHH, decimal, or symbol).",
477
- "minLength": 1
478
- },
479
- "length": {
480
- "type": "integer",
481
- "description": "Number of bytes to fill (1–16384).",
482
- "minimum": 1,
483
- "maximum": 16384
484
- },
485
- "pattern": {
486
- "type": "string",
487
- "description": "Hex bytes to repeat, e.g. 'FF' or 'AA 55'. Space-separated or run together.",
488
- "minLength": 2,
489
- "pattern": "^[\\s0-9A-Fa-f$]+$"
490
- },
491
- "op": {
492
- "const": "fill_memory"
493
- }
494
- },
495
- "required": [
496
- "address",
497
- "length",
498
- "pattern",
499
- "op"
500
- ],
501
- "additionalProperties": false
502
- }
503
- },
504
- {
505
- "op": "search_memory",
506
- "description": "Search for a byte pattern within a memory range and return matching addresses.",
507
- "required": [
508
- "startAddress",
509
- "endAddress",
510
- "pattern"
511
- ],
512
- "optional": [
513
- "maxResults"
514
- ],
515
- "inputSchema": {
516
- "type": "object",
517
- "description": "Search for a byte pattern within a memory range and return matching addresses.",
518
- "properties": {
519
- "startAddress": {
520
- "type": "string",
521
- "description": "Start of search range ($HHHH, decimal, or symbol).",
522
- "minLength": 1
523
- },
524
- "endAddress": {
525
- "type": "string",
526
- "description": "End of search range (inclusive).",
527
- "minLength": 1
528
- },
529
- "pattern": {
530
- "type": "string",
531
- "description": "Hex bytes to find, e.g. 'A9 00' for LDA #$00.",
532
- "minLength": 2,
533
- "pattern": "^[\\s0-9A-Fa-f$]+$"
534
- },
535
- "maxResults": {
536
- "type": [
537
- "integer",
538
- "null"
539
- ],
540
- "description": "Maximum matches to return (default 10).",
541
- "minimum": 1,
542
- "maximum": 100,
543
- "default": 10
544
- },
545
- "op": {
546
- "const": "search_memory"
547
- }
548
- },
549
- "required": [
550
- "startAddress",
551
- "endAddress",
552
- "pattern",
553
- "op"
554
- ],
555
- "additionalProperties": false
556
- }
557
- },
558
- {
559
- "op": "compare_memory",
560
- "description": "Compare two memory regions byte-by-byte and report differences.",
561
- "required": [
562
- "address1",
563
- "address2",
564
- "length"
565
- ],
566
- "optional": [
567
- "maxDiffs"
568
- ],
569
- "inputSchema": {
570
- "type": "object",
571
- "description": "Compare two memory regions byte-by-byte and report differences.",
572
- "properties": {
573
- "address1": {
574
- "type": "string",
575
- "description": "First region start address.",
576
- "minLength": 1
577
- },
578
- "address2": {
579
- "type": "string",
580
- "description": "Second region start address.",
581
- "minLength": 1
582
- },
583
- "length": {
584
- "type": "integer",
585
- "description": "Number of bytes to compare (1–16384).",
586
- "minimum": 1,
587
- "maximum": 16384
588
- },
589
- "maxDiffs": {
590
- "type": [
591
- "integer",
592
- "null"
593
- ],
594
- "description": "Max differences to report (default 10).",
595
- "minimum": 1,
596
- "maximum": 200,
597
- "default": 10
598
- },
599
- "op": {
600
- "const": "compare_memory"
601
- }
602
- },
603
- "required": [
604
- "address1",
605
- "address2",
606
- "length",
607
- "op"
608
- ],
609
- "additionalProperties": false
610
- }
611
- },
612
- {
613
- "op": "save_memory",
614
- "description": "Dump a memory range to a local file, with an optional PRG load-address header.",
615
- "required": [
616
- "startAddress",
617
- "endAddress",
618
- "filePath"
619
- ],
620
- "optional": [
621
- "asPrg"
622
- ],
623
- "inputSchema": {
624
- "type": "object",
625
- "description": "Dump a memory range to a local file, with an optional PRG load-address header.",
626
- "properties": {
627
- "startAddress": {
628
- "type": "string",
629
- "description": "Start address of region to save.",
630
- "minLength": 1
631
- },
632
- "endAddress": {
633
- "type": "string",
634
- "description": "End address (inclusive).",
635
- "minLength": 1
636
- },
637
- "filePath": {
638
- "type": "string",
639
- "description": "Absolute or relative path for the output file.",
640
- "minLength": 1
641
- },
642
- "asPrg": {
643
- "type": [
644
- "boolean",
645
- "null"
646
- ],
647
- "description": "Prepend a 2-byte little-endian load-address header (PRG format). Default: true.",
648
- "default": true
649
- },
650
- "op": {
651
- "const": "save_memory"
652
- }
653
- },
654
- "required": [
655
- "startAddress",
656
- "endAddress",
657
- "filePath",
658
- "op"
659
- ],
660
- "additionalProperties": false
661
- }
662
- }
663
- ]
194
+ "description": "Memory operations available via the c64_memory tool.\n\nOperations:\n- read: Read a range of bytes and return a hex dump with address metadata. Required inputs: address. Optional inputs: length, format.\n- write [write]: Write a hexadecimal byte sequence into RAM. Required inputs: address, bytes. Optional inputs: verify, expected, mask, abortOnMismatch.\n- read_screen: Return the current 40x25 text screen converted to ASCII. Required inputs: none.\n- wait_for_text: Poll the screen until a substring or regex appears, or timeout elapses. Required inputs: pattern. Optional inputs: isRegex, caseInsensitive, timeoutMs, intervalMs.\n- list_basic: List the BASIC program in memory as text: reads the $2B-$2E pointers, walks the line links and detokenises. Works on C64U/U64, U2-family hardware, and VICE. Required inputs: none.\n- disassemble: Disassemble a memory region into annotated 6502/6510 instructions, including undocumented opcodes with canonical names. Symbol annotations from `.vs` files are applied when available. Works on C64U/U64, U2-family hardware, and VICE. Required inputs: address. Optional inputs: length, instructionCount.\n- copy_memory [write]: Copy a RAM region to another address. Required inputs: source, dest, length.\n- fill_memory [write]: Fill a memory range with a repeating byte pattern. Required inputs: address, length, pattern.\n- search_memory: Search for a byte pattern within a memory range and return matching addresses. Required inputs: startAddress, endAddress, pattern. Optional inputs: maxResults.\n- compare_memory: Compare two memory regions byte-by-byte and report differences. Required inputs: address1, address2, length. Optional inputs: maxDiffs.\n- save_memory [write]: Dump a memory range to a local file, with an optional PRG load-address header. Required inputs: startAddress, endAddress, filePath. Optional inputs: asPrg.",
195
+ "additionalProperties": false
664
196
  }