c64bridge 0.7.4 → 0.8.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 (107) hide show
  1. package/.github/prompts/README.md +14 -4
  2. package/.github/prompts/assembly-routine-session.prompt.md +9 -9
  3. package/.github/prompts/basic-program-session.prompt.md +11 -9
  4. package/.github/prompts/drive-management-session.prompt.md +9 -9
  5. package/.github/prompts/hello-world-session.prompt.md +17 -0
  6. package/.github/prompts/petscii-art-session.prompt.md +9 -9
  7. package/.github/prompts/play-classic-game.prompt.md +9 -9
  8. package/.github/prompts/pr-converge.prompt.md +13 -0
  9. package/.github/prompts/sid-music-session.prompt.md +9 -9
  10. package/AGENTS.md +59 -60
  11. package/README.md +550 -191
  12. package/data/assembly/assembly-spec.md +290 -1
  13. package/data/context/bootstrap.md +26 -2
  14. package/data/context/fast-paths.md +44 -0
  15. package/data/graphics/petscii-style-guide.md +6 -2
  16. package/data/graphics/sprite-charset-best-practices.md +5 -5
  17. package/dist/.tsbuildinfo +1 -1
  18. package/dist/c64Client.js +990 -26
  19. package/dist/config.js +5 -1
  20. package/dist/device.js +680 -57
  21. package/dist/diagnostics.js +371 -0
  22. package/dist/mcp/metadata.js +39 -0
  23. package/dist/mcp-server.js +170 -20
  24. package/dist/platform.js +10 -2
  25. package/dist/prompts/registry.js +166 -309
  26. package/dist/rag/init.js +37 -1
  27. package/dist/rag/knowledgeIndex.js +18 -6
  28. package/dist/rag/rateLimiter.js +2 -2
  29. package/dist/streamCapture.js +135 -0
  30. package/dist/tools/audio.js +3 -1
  31. package/dist/tools/debug.js +470 -0
  32. package/dist/tools/developer.js +10 -4
  33. package/dist/tools/graphics.js +183 -17
  34. package/dist/tools/machineControl.js +11 -5
  35. package/dist/tools/memory.js +19 -10
  36. package/dist/tools/meta/audio.js +240 -1
  37. package/dist/tools/meta/config.js +20 -28
  38. package/dist/tools/meta/configInventory.js +104 -0
  39. package/dist/tools/meta/diagnostics.js +45 -2
  40. package/dist/tools/meta/graphics.js +14 -6
  41. package/dist/tools/meta/index.js +1 -0
  42. package/dist/tools/meta/memory.js +20 -6
  43. package/dist/tools/meta/program.js +473 -0
  44. package/dist/tools/pollValidator.js +4 -2
  45. package/dist/tools/programRunners.js +8 -4
  46. package/dist/tools/registry/config.js +17 -0
  47. package/dist/tools/registry/disk.js +7 -0
  48. package/dist/tools/registry/drive.js +3 -0
  49. package/dist/tools/registry/graphics.js +111 -27
  50. package/dist/tools/registry/index.js +6 -0
  51. package/dist/tools/registry/memory.js +1 -0
  52. package/dist/tools/registry/platform.js +121 -0
  53. package/dist/tools/registry/program.js +26 -8
  54. package/dist/tools/registry/sound.js +96 -0
  55. package/dist/tools/registry/system.js +15 -2
  56. package/dist/tools/storage.js +1 -0
  57. package/dist/tools/streaming.js +1 -0
  58. package/dist/tools/types.js +38 -4
  59. package/dist/tools/vice.js +160 -0
  60. package/dist/vicBitmap.js +317 -0
  61. package/dist/vice/mockServer.js +439 -0
  62. package/dist/vice/process.js +310 -0
  63. package/dist/vice/readiness.js +18 -2
  64. package/dist/vice/viceClient.js +382 -22
  65. package/doc/developer.md +62 -24
  66. package/doc/img/backend-switch/hello-c64u.png +0 -0
  67. package/doc/img/backend-switch/hello-vice-and-c64u.png +0 -0
  68. package/doc/img/backend-switch/hello-vice.png +0 -0
  69. package/doc/img/backend-switch/metadata.json +50 -0
  70. package/doc/plans/vice-backend-switch/plan.md +486 -0
  71. package/doc/plans/vice-backend-switch-2/plan.md +48 -0
  72. package/doc/plans/vice-support/notes.md +1 -0
  73. package/doc/plans/vice-support/plan.md +5 -0
  74. package/doc/plans/vice-support/rollout.md +23 -17
  75. package/doc/reviews/vice-support-review.md +185 -0
  76. package/doc/troubleshooting-mcp.md +35 -6
  77. package/doc/vice/support-matrix.md +54 -0
  78. package/mcp/prompts.json +292 -0
  79. package/mcp/protocol-examples.json +46 -0
  80. package/mcp/resources.json +940 -0
  81. package/mcp/schemas/c64_config.schema.json +350 -0
  82. package/mcp/schemas/c64_debug.schema.json +380 -0
  83. package/mcp/schemas/c64_disk.schema.json +278 -0
  84. package/mcp/schemas/c64_drive.schema.json +120 -0
  85. package/mcp/schemas/c64_extract.schema.json +302 -0
  86. package/mcp/schemas/c64_graphics.schema.json +333 -0
  87. package/mcp/schemas/c64_memory.schema.json +155 -0
  88. package/mcp/schemas/c64_printer.schema.json +218 -0
  89. package/mcp/schemas/c64_program.schema.json +391 -0
  90. package/mcp/schemas/c64_rag.schema.json +67 -0
  91. package/mcp/schemas/c64_select_backend.schema.json +32 -0
  92. package/mcp/schemas/c64_sound.schema.json +644 -0
  93. package/mcp/schemas/c64_stream.schema.json +61 -0
  94. package/mcp/schemas/c64_system.schema.json +227 -0
  95. package/mcp/schemas/c64_vice.schema.json +63 -0
  96. package/mcp/server.json +15 -0
  97. package/mcp/tools.json +4517 -0
  98. package/mcp.json +83 -9
  99. package/package.json +8 -3
  100. package/scripts/capture-backend-switch-screenshots.mjs +276 -0
  101. package/scripts/generate-mcp-interface.ts +289 -0
  102. package/scripts/invoke-bun.mjs +67 -21
  103. package/scripts/mockC64Server.mjs +162 -6
  104. package/scripts/run-coverage.mjs +284 -0
  105. package/scripts/run-tests.mjs +95 -39
  106. package/scripts/run-tests.ts +378 -73
  107. package/scripts/update-readme.ts +147 -13
@@ -1,4 +1,4 @@
1
- # Language
1
+ # 6510 Assembly Language
2
2
 
3
3
  ## Overview
4
4
 
@@ -184,6 +184,295 @@ Modes (columns): `A # ZP ZPX ZPY ABS ABSX ABSY IND IZX IZY REL IMP`
184
184
  | TXS | | | | | | | | | | | | |✓|
185
185
  | TYA | | | | | | | | | | | | |✓|
186
186
 
187
+ ### Opcode Decode Table
188
+
189
+ #### Scope
190
+
191
+ - Table order is strictly ascending by opcode from `00` to `FF`.
192
+ - `IMM` is the canonical mode token for **immediate** addressing.
193
+ - Elsewhere in the spec, immediate operands may be written with `#`, e.g. `LDA #$01`.
194
+ - `cycles` is the base cycle count.
195
+ - `page_cross_penalty` is only populated where an extra cycle can occur due to page crossing or branch flow.
196
+ - `KIL` does not complete normal execution; `cycles=halt`.
197
+
198
+ #### Semantic Conventions
199
+
200
+ - `M` = operand value after address resolution
201
+ - `[EA]` = memory at effective address
202
+ - `EA.hi` = high byte of effective address
203
+ - `push(x)` / `pop` / `pop16` = stack operations
204
+ - `set(...)` = update listed flags from result
205
+ - `ROL(x)` / `ROR(x)` = rotate through carry
206
+ - `rel` = signed relative branch displacement
207
+ - Unofficial unstable opcodes are marked explicitly with `unstable;`
208
+
209
+ #### Table Format
210
+
211
+ ```text
212
+ opcode mnemonic mode flags cycles page_cross_penalty semantics
213
+ ```
214
+
215
+ #### Table
216
+
217
+ ```text
218
+ 00 BRK IMP O 7 - interrupt; push(PC+2,P|B); I←1; PC←[FFFE]
219
+ 01 ORA IZX O 6 - A←A|M; set(Z,N)
220
+ 02 KIL IMP U,H halt - halt
221
+ 03 SLO IZX U 8 - M←M<<1; A←A|M; set(C,Z,N)
222
+ 04 NOP ZP U 3 - no-op
223
+ 05 ORA ZP O 3 - A←A|M; set(Z,N)
224
+ 06 ASL ZP O 5 - M←M<<1; set(C,Z,N)
225
+ 07 SLO ZP U 5 - M←M<<1; A←A|M; set(C,Z,N)
226
+ 08 PHP IMP O 3 - push(P|B)
227
+ 09 ORA IMM O 2 - A←A|M; set(Z,N)
228
+ 0A ASL A O 2 - A←A<<1; set(C,Z,N)
229
+ 0B ANC IMM U 2 - A←A&#; C←bit7(A); set(Z,N)
230
+ 0C NOP ABS U 4 - no-op
231
+ 0D ORA ABS O 4 - A←A|M; set(Z,N)
232
+ 0E ASL ABS O 6 - M←M<<1; set(C,Z,N)
233
+ 0F SLO ABS U 6 - M←M<<1; A←A|M; set(C,Z,N)
234
+ 10 BPL REL O 2 +1 if branch taken; +1 more if page-cross if N=0 then PC←PC+rel
235
+ 11 ORA IZY O 5 +1 if page-cross A←A|M; set(Z,N)
236
+ 12 KIL IMP U,H halt - halt
237
+ 13 SLO IZY U 8 - M←M<<1; A←A|M; set(C,Z,N)
238
+ 14 NOP ZPX U 4 - no-op
239
+ 15 ORA ZPX O 4 - A←A|M; set(Z,N)
240
+ 16 ASL ZPX O 6 - M←M<<1; set(C,Z,N)
241
+ 17 SLO ZPX U 6 - M←M<<1; A←A|M; set(C,Z,N)
242
+ 18 CLC IMP O 2 - C←0
243
+ 19 ORA ABSY O 4 +1 if page-cross A←A|M; set(Z,N)
244
+ 1A NOP IMP U 2 - no-op
245
+ 1B SLO ABSY U 7 - M←M<<1; A←A|M; set(C,Z,N)
246
+ 1C NOP ABSX U 4 +1 if page-cross no-op
247
+ 1D ORA ABSX O 4 +1 if page-cross A←A|M; set(Z,N)
248
+ 1E ASL ABSX O 7 - M←M<<1; set(C,Z,N)
249
+ 1F SLO ABSX U 7 - M←M<<1; A←A|M; set(C,Z,N)
250
+ 20 JSR ABS O 6 - push(PC-1); PC←EA
251
+ 21 AND IZX O 6 - A←A&M; set(Z,N)
252
+ 22 KIL IMP U,H halt - halt
253
+ 23 RLA IZX U 8 - M←ROL(M); A←A&M; set(C,Z,N)
254
+ 24 BIT ZP O 3 - Z←(A&M)=0; N←bit7(M); V←bit6(M)
255
+ 25 AND ZP O 3 - A←A&M; set(Z,N)
256
+ 26 ROL ZP O 5 - M←ROL(M); set(C,Z,N)
257
+ 27 RLA ZP U 5 - M←ROL(M); A←A&M; set(C,Z,N)
258
+ 28 PLP IMP O 4 - P←pop
259
+ 29 AND IMM O 2 - A←A&#; set(Z,N)
260
+ 2A ROL A O 2 - A←ROL(A); set(C,Z,N)
261
+ 2B ANC IMM U 2 - A←A&#; C←bit7(A); set(Z,N)
262
+ 2C BIT ABS O 4 - Z←(A&M)=0; N←bit7(M); V←bit6(M)
263
+ 2D AND ABS O 4 - A←A&M; set(Z,N)
264
+ 2E ROL ABS O 6 - M←ROL(M); set(C,Z,N)
265
+ 2F RLA ABS U 6 - M←ROL(M); A←A&M; set(C,Z,N)
266
+ 30 BMI REL O 2 +1 if branch taken; +1 more if page-cross if N=1 then PC←PC+rel
267
+ 31 AND IZY O 5 +1 if page-cross A←A&M; set(Z,N)
268
+ 32 KIL IMP U,H halt - halt
269
+ 33 RLA IZY U 8 - M←ROL(M); A←A&M; set(C,Z,N)
270
+ 34 NOP ZPX U 4 - no-op
271
+ 35 AND ZPX O 4 - A←A&M; set(Z,N)
272
+ 36 ROL ZPX O 6 - M←ROL(M); set(C,Z,N)
273
+ 37 RLA ZPX U 6 - M←ROL(M); A←A&M; set(C,Z,N)
274
+ 38 SEC IMP O 2 - C←1
275
+ 39 AND ABSY O 4 +1 if page-cross A←A&M; set(Z,N)
276
+ 3A NOP IMP U 2 - no-op
277
+ 3B RLA ABSY U 7 - M←ROL(M); A←A&M; set(C,Z,N)
278
+ 3C NOP ABSX U 4 +1 if page-cross no-op
279
+ 3D AND ABSX O 4 +1 if page-cross A←A&M; set(Z,N)
280
+ 3E ROL ABSX O 7 - M←ROL(M); set(C,Z,N)
281
+ 3F RLA ABSX U 7 - M←ROL(M); A←A&M; set(C,Z,N)
282
+ 40 RTI IMP O 6 - P←pop; PC←pop16
283
+ 41 EOR IZX O 6 - A←A^M; set(Z,N)
284
+ 42 KIL IMP U,H halt - halt
285
+ 43 SRE IZX U 8 - M←M>>1; A←A^M; set(C,Z,N)
286
+ 44 NOP ZP U 3 - no-op
287
+ 45 EOR ZP O 3 - A←A^M; set(Z,N)
288
+ 46 LSR ZP O 5 - M←M>>1; set(C,Z,N)
289
+ 47 SRE ZP U 5 - M←M>>1; A←A^M; set(C,Z,N)
290
+ 48 PHA IMP O 3 - push(A)
291
+ 49 EOR IMM O 2 - A←A^M; set(Z,N)
292
+ 4A LSR A O 2 - A←A>>1; set(C,Z,N)
293
+ 4B ALR IMM U 2 - A←(A&#)>>1; set(C,Z,N)
294
+ 4C JMP ABS O 3 - PC←EA
295
+ 4D EOR ABS O 4 - A←A^M; set(Z,N)
296
+ 4E LSR ABS O 6 - M←M>>1; set(C,Z,N)
297
+ 4F SRE ABS U 6 - M←M>>1; A←A^M; set(C,Z,N)
298
+ 50 BVC REL O 2 +1 if branch taken; +1 more if page-cross if V=0 then PC←PC+rel
299
+ 51 EOR IZY O 5 +1 if page-cross A←A^M; set(Z,N)
300
+ 52 KIL IMP U,H halt - halt
301
+ 53 SRE IZY U 8 - M←M>>1; A←A^M; set(C,Z,N)
302
+ 54 NOP ZPX U 4 - no-op
303
+ 55 EOR ZPX O 4 - A←A^M; set(Z,N)
304
+ 56 LSR ZPX O 6 - M←M>>1; set(C,Z,N)
305
+ 57 SRE ZPX U 6 - M←M>>1; A←A^M; set(C,Z,N)
306
+ 58 CLI IMP O 2 - I←0
307
+ 59 EOR ABSY O 4 +1 if page-cross A←A^M; set(Z,N)
308
+ 5A NOP IMP U 2 - no-op
309
+ 5B SRE ABSY U 7 - M←M>>1; A←A^M; set(C,Z,N)
310
+ 5C NOP ABSX U 4 +1 if page-cross no-op
311
+ 5D EOR ABSX O 4 +1 if page-cross A←A^M; set(Z,N)
312
+ 5E LSR ABSX O 7 - M←M>>1; set(C,Z,N)
313
+ 5F SRE ABSX U 7 - M←M>>1; A←A^M; set(C,Z,N)
314
+ 60 RTS IMP O 6 - PC←pop16+1
315
+ 61 ADC IZX O 6 - A←A+M+C; set(C,Z,N,V)
316
+ 62 KIL IMP U,H halt - halt
317
+ 63 RRA IZX U 8 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
318
+ 64 NOP ZP U 3 - no-op
319
+ 65 ADC ZP O 3 - A←A+M+C; set(C,Z,N,V)
320
+ 66 ROR ZP O 5 - M←ROR(M); set(C,Z,N)
321
+ 67 RRA ZP U 5 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
322
+ 68 PLA IMP O 4 - A←pop; set(Z,N)
323
+ 69 ADC IMM O 2 - A←A+#+C; set(C,Z,N,V)
324
+ 6A ROR A O 2 - A←ROR(A); set(C,Z,N)
325
+ 6B ARR IMM U 2 - A←ROR(A&#); C←bit6(A); V←bit6(A)^bit5(A); set(Z,N)
326
+ 6C JMP IND O 5 - PC←EA
327
+ 6D ADC ABS O 4 - A←A+M+C; set(C,Z,N,V)
328
+ 6E ROR ABS O 6 - M←ROR(M); set(C,Z,N)
329
+ 6F RRA ABS U 6 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
330
+ 70 BVS REL O 2 +1 if branch taken; +1 more if page-cross if V=1 then PC←PC+rel
331
+ 71 ADC IZY O 5 +1 if page-cross A←A+M+C; set(C,Z,N,V)
332
+ 72 KIL IMP U,H halt - halt
333
+ 73 RRA IZY U 8 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
334
+ 74 NOP ZPX U 4 - no-op
335
+ 75 ADC ZPX O 4 - A←A+M+C; set(C,Z,N,V)
336
+ 76 ROR ZPX O 6 - M←ROR(M); set(C,Z,N)
337
+ 77 RRA ZPX U 6 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
338
+ 78 SEI IMP O 2 - I←1
339
+ 79 ADC ABSY O 4 +1 if page-cross A←A+M+C; set(C,Z,N,V)
340
+ 7A NOP IMP U 2 - no-op
341
+ 7B RRA ABSY U 7 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
342
+ 7C NOP ABSX U 4 +1 if page-cross no-op
343
+ 7D ADC ABSX O 4 +1 if page-cross A←A+M+C; set(C,Z,N,V)
344
+ 7E ROR ABSX O 7 - M←ROR(M); set(C,Z,N)
345
+ 7F RRA ABSX U 7 - M←ROR(M); A←A+M+C; set(C,Z,N,V)
346
+ 80 NOP IMM U 2 - no-op
347
+ 81 STA IZX O 6 - [EA]←A
348
+ 82 NOP IMM U 2 - no-op
349
+ 83 SAX IZX U 6 - [EA]←A&X
350
+ 84 STY ZP O 3 - [EA]←Y
351
+ 85 STA ZP O 3 - [EA]←A
352
+ 86 STX ZP O 3 - [EA]←X
353
+ 87 SAX ZP U 3 - [EA]←A&X
354
+ 88 DEY IMP O 2 - Y←Y-1; set(Z,N)
355
+ 89 NOP IMM U 2 - no-op
356
+ 8A TXA IMP O 2 - A←X; set(Z,N)
357
+ 8B XAA IMM U 2 - unstable; A←X&#; set(Z,N)
358
+ 8C STY ABS O 4 - [EA]←Y
359
+ 8D STA ABS O 4 - [EA]←A
360
+ 8E STX ABS O 4 - [EA]←X
361
+ 8F SAX ABS U 4 - [EA]←A&X
362
+ 90 BCC REL O 2 +1 if branch taken; +1 more if page-cross if C=0 then PC←PC+rel
363
+ 91 STA IZY O 6 - [EA]←A
364
+ 92 KIL IMP U,H halt - halt
365
+ 93 AHX IZY U,S 6 - unstable; [EA]←A&X&(EA.hi+1)
366
+ 94 STY ZPX O 4 - [EA]←Y
367
+ 95 STA ZPX O 4 - [EA]←A
368
+ 96 STX ZPY O 4 - [EA]←X
369
+ 97 SAX ZPY U 4 - [EA]←A&X
370
+ 98 TYA IMP O 2 - A←Y; set(Z,N)
371
+ 99 STA ABSY O 5 - [EA]←A
372
+ 9A TXS IMP O 2 - SP←X
373
+ 9B TAS ABSY U,S 5 - unstable; SP←A&X; [EA]←SP&(EA.hi+1)
374
+ 9C SHY ABSX U,S 5 - unstable; [EA]←Y&(EA.hi+1)
375
+ 9D STA ABSX O 5 - [EA]←A
376
+ 9E SHX ABSY U,S 5 - unstable; [EA]←X&(EA.hi+1)
377
+ 9F AHX ABSY U,S 5 - unstable; [EA]←A&X&(EA.hi+1)
378
+ A0 LDY IMM O 2 - Y←#; set(Z,N)
379
+ A1 LDA IZX O 6 - A←M; set(Z,N)
380
+ A2 LDX IMM O 2 - X←#; set(Z,N)
381
+ A3 LAX IZX U 6 - A←M; X←M; set(Z,N)
382
+ A4 LDY ZP O 3 - Y←M; set(Z,N)
383
+ A5 LDA ZP O 3 - A←M; set(Z,N)
384
+ A6 LDX ZP O 3 - X←M; set(Z,N)
385
+ A7 LAX ZP U 3 - A←M; X←M; set(Z,N)
386
+ A8 TAY IMP O 2 - Y←A; set(Z,N)
387
+ A9 LDA IMM O 2 - A←#; set(Z,N)
388
+ AA TAX IMP O 2 - X←A; set(Z,N)
389
+ AB LAX IMM U 2 - A←#; X←#; set(Z,N)
390
+ AC LDY ABS O 4 - Y←M; set(Z,N)
391
+ AD LDA ABS O 4 - A←M; set(Z,N)
392
+ AE LDX ABS O 4 - X←M; set(Z,N)
393
+ AF LAX ABS U 4 - A←M; X←M; set(Z,N)
394
+ B0 BCS REL O 2 +1 if branch taken; +1 more if page-cross if C=1 then PC←PC+rel
395
+ B1 LDA IZY O 5 +1 if page-cross A←M; set(Z,N)
396
+ B2 KIL IMP U,H halt - halt
397
+ B3 LAX IZY U 5 +1 if page-cross A←M; X←M; set(Z,N)
398
+ B4 LDY ZPX O 4 - Y←M; set(Z,N)
399
+ B5 LDA ZPX O 4 - A←M; set(Z,N)
400
+ B6 LDX ZPY O 4 - X←M; set(Z,N)
401
+ B7 LAX ZPY U 4 - A←M; X←M; set(Z,N)
402
+ B8 CLV IMP O 2 - V←0
403
+ B9 LDA ABSY O 4 +1 if page-cross A←M; set(Z,N)
404
+ BA TSX IMP O 2 - X←SP; set(Z,N)
405
+ BB LAS ABSY U 4 +1 if page-cross unstable; A←M&SP; X←A; SP←A; set(Z,N)
406
+ BC LDY ABSX O 4 +1 if page-cross Y←M; set(Z,N)
407
+ BD LDA ABSX O 4 +1 if page-cross A←M; set(Z,N)
408
+ BE LDX ABSY O 4 +1 if page-cross X←M; set(Z,N)
409
+ BF LAX ABSY U 4 +1 if page-cross A←M; X←M; set(Z,N)
410
+ C0 CPY IMM O 2 - tmp←Y-#; set(C,Z,N)
411
+ C1 CMP IZX O 6 - tmp←A-M; set(C,Z,N)
412
+ C2 NOP IMM U 2 - no-op
413
+ C3 DCP IZX U 8 - M←M-1; tmp←A-M; set(C,Z,N)
414
+ C4 CPY ZP O 3 - tmp←Y-M; set(C,Z,N)
415
+ C5 CMP ZP O 3 - tmp←A-M; set(C,Z,N)
416
+ C6 DEC ZP O 5 - M←M-1; set(Z,N)
417
+ C7 DCP ZP U 5 - M←M-1; tmp←A-M; set(C,Z,N)
418
+ C8 INY IMP O 2 - Y←Y+1; set(Z,N)
419
+ C9 CMP IMM O 2 - tmp←A-#; set(C,Z,N)
420
+ CA DEX IMP O 2 - X←X-1; set(Z,N)
421
+ CB AXS IMM U 2 - X←(A&X)-#; set(C,Z,N)
422
+ CC CPY ABS O 4 - tmp←Y-M; set(C,Z,N)
423
+ CD CMP ABS O 4 - tmp←A-M; set(C,Z,N)
424
+ CE DEC ABS O 6 - M←M-1; set(Z,N)
425
+ CF DCP ABS U 6 - M←M-1; tmp←A-M; set(C,Z,N)
426
+ D0 BNE REL O 2 +1 if branch taken; +1 more if page-cross if Z=0 then PC←PC+rel
427
+ D1 CMP IZY O 5 +1 if page-cross tmp←A-M; set(C,Z,N)
428
+ D2 KIL IMP U,H halt - halt
429
+ D3 DCP IZY U 8 - M←M-1; tmp←A-M; set(C,Z,N)
430
+ D4 NOP ZPX U 4 - no-op
431
+ D5 CMP ZPX O 4 - tmp←A-M; set(C,Z,N)
432
+ D6 DEC ZPX O 6 - M←M-1; set(Z,N)
433
+ D7 DCP ZPX U 6 - M←M-1; tmp←A-M; set(C,Z,N)
434
+ D8 CLD IMP O 2 - D←0
435
+ D9 CMP ABSY O 4 +1 if page-cross tmp←A-M; set(C,Z,N)
436
+ DA NOP IMP U 2 - no-op
437
+ DB DCP ABSY U 7 - M←M-1; tmp←A-M; set(C,Z,N)
438
+ DC NOP ABSX U 4 +1 if page-cross no-op
439
+ DD CMP ABSX O 4 +1 if page-cross tmp←A-M; set(C,Z,N)
440
+ DE DEC ABSX O 7 - M←M-1; set(Z,N)
441
+ DF DCP ABSX U 7 - M←M-1; tmp←A-M; set(C,Z,N)
442
+ E0 CPX IMM O 2 - tmp←X-#; set(C,Z,N)
443
+ E1 SBC IZX O 6 - A←A-M-(1-C); set(C,Z,N,V)
444
+ E2 NOP IMM U 2 - no-op
445
+ E3 ISC IZX U 8 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
446
+ E4 CPX ZP O 3 - tmp←X-M; set(C,Z,N)
447
+ E5 SBC ZP O 3 - A←A-M-(1-C); set(C,Z,N,V)
448
+ E6 INC ZP O 5 - M←M+1; set(Z,N)
449
+ E7 ISC ZP U 5 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
450
+ E8 INX IMP O 2 - X←X+1; set(Z,N)
451
+ E9 SBC IMM O 2 - A←A-#-(1-C); set(C,Z,N,V)
452
+ EA NOP IMP O 2 - no-op
453
+ EB SBC IMM U 2 - A←A-#-(1-C); set(C,Z,N,V)
454
+ EC CPX ABS O 4 - tmp←X-M; set(C,Z,N)
455
+ ED SBC ABS O 4 - A←A-M-(1-C); set(C,Z,N,V)
456
+ EE INC ABS O 6 - M←M+1; set(Z,N)
457
+ EF ISC ABS U 6 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
458
+ F0 BEQ REL O 2 +1 if branch taken; +1 more if page-cross if Z=1 then PC←PC+rel
459
+ F1 SBC IZY O 5 +1 if page-cross A←A-M-(1-C); set(C,Z,N,V)
460
+ F2 KIL IMP U,H halt - halt
461
+ F3 ISC IZY U 8 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
462
+ F4 NOP ZPX U 4 - no-op
463
+ F5 SBC ZPX O 4 - A←A-M-(1-C); set(C,Z,N,V)
464
+ F6 INC ZPX O 6 - M←M+1; set(Z,N)
465
+ F7 ISC ZPX U 6 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
466
+ F8 SED IMP O 2 - D←1
467
+ F9 SBC ABSY O 4 +1 if page-cross A←A-M-(1-C); set(C,Z,N,V)
468
+ FA NOP IMP U 2 - no-op
469
+ FB ISC ABSY U 7 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
470
+ FC NOP ABSX U 4 +1 if page-cross no-op
471
+ FD SBC ABSX O 4 +1 if page-cross A←A-M-(1-C); set(C,Z,N,V)
472
+ FE INC ABSX O 7 - M←M+1; set(Z,N)
473
+ FF ISC ABSX U 7 - M←M+1; A←A-M-(1-C); set(C,Z,N,V)
474
+ ```
475
+
187
476
  ### Vector Entry Points (C64)
188
477
 
189
478
  - NMI `$FFFA/B`, RESET `$FFFC/D`, IRQ/BRK `$FFFE/F`. After RESET, execution starts at vector `$FFFC` (KERNAL init).
@@ -2,6 +2,30 @@
2
2
 
3
3
  High-level overview for C64 development. For more details, see linked spec documents.
4
4
 
5
+ ## Backend Selection
6
+
7
+ Two backends may be available: `c64u` (physical C64 Ultimate hardware) and `vice`
8
+ (VICE emulator). Use `c64_select_backend` to switch.
9
+
10
+ **Routing rules — call `c64_select_backend` first when the user:**
11
+ - Says "use vice", "on vice", "in the emulator", "via vice", or similar
12
+ - Says "use c64u", "on hardware", "on the Ultimate", "on the real machine", or similar
13
+ - Prefixes a request with a backend name, e.g. "vice: run this program"
14
+
15
+ Do not assume the current backend is correct without checking
16
+ `c64://platform/status` if the user has expressed a preference.
17
+
18
+ ## Fast Paths
19
+
20
+ - Grouped MCP tools are never called bare. For tools such as `c64_program`, `c64_memory`, `c64_graphics`, `c64_sound`, and `c64_system`, always send an object with `op` first.
21
+ - Wrong: `c64_program {}`. Correct: `c64_program { op: "cross_platform_greeting" }`.
22
+ - For simple visible confirmation on `vice`, `c64u`, or both, prefer `c64_program` with `op: "cross_platform_greeting"`.
23
+ - For trivial hello-world and smoke-test requests, route to `.github/skills/hello-world/SKILL.md` and let that skill use the shortest greeting workflow.
24
+ - That workflow switches backends internally, writes a platform-customized BASIC greeting, captures screenshots, and verifies the rendered text without extra tool composition.
25
+ - Use manual `c64_select_backend` plus `upload_run_basic` only when the user needs custom program logic beyond a quick greeting or text demo.
26
+ - On local machines with a graphical session, assume VICE should be visible by default. Only expect Xvfb or other headless fallback in CI or when no framebuffer/display session exists.
27
+ - For manual visible VICE BASIC runs, avoid immediate `read_screen` or `wait_for_text` calls, because Binary Monitor traffic traps execution while servicing requests.
28
+
5
29
  ## Device & Services
6
30
 
7
31
  - MCP server controls Ultimate 64/C64 via REST: upload/run BASIC or ASM, screen/memory I/O, drives, SID music, audio analysis, local RAG.
@@ -126,7 +150,7 @@ Basic is used for simple programs and quick prototyping. It is very slow compare
126
150
 
127
151
  ## 6502/6510 Assembly
128
152
 
129
- Assembly is used for maximum performance and control. For more information see `data/asssembly/assembly-spec.md`.
153
+ Assembly is used for maximum performance and control. For more information see `data/assembly/assembly-spec.md`.
130
154
 
131
155
  - Addressing modes: `#imm, zp, zp,X, zp,Y, abs, abs,X, abs,Y, (zp), (zp,X), (zp),Y, rel`.
132
156
  - Key opcodes (full set):
@@ -144,5 +168,5 @@ Assembly is used for maximum performance and control. For more information see `
144
168
 
145
169
  ## Context & RAG
146
170
 
147
- - Layers: `data/context/bootstrap.md` → `AGENTS.md` → `.github/prompts/*.prompt.md` → `data/context/chat.md` → RAG docs (`doc/**/*.md`, `data/**/*.md`).
171
+ - Layers: `data/context/bootstrap.md` → `AGENTS.md` / `CLAUDE.md` / `.github/copilot-instructions.md` → `.github/prompts/*.prompt.md` → `.github/skills/*/SKILL.md` → `data/context/chat.md` → RAG docs (`doc/**/*.md`, `data/**/*.md`).
148
172
  - Retrieval returns relevant chunks with provenance comments for transparency.
@@ -0,0 +1,44 @@
1
+ # Fast Path Workflows
2
+
3
+ Use these routing shortcuts when the user wants a quick visible or audible result and does not need a bespoke workflow.
4
+
5
+ ## Quick Visible Demo
6
+
7
+ - Route quick greetings, smoke tests, and visible backend confirmation to `.github/skills/cross-platform-demo/SKILL.md`.
8
+ - Use the custom BASIC path only when the user needs logic beyond a simple demo.
9
+
10
+ ## Ultra-Fast Hello World
11
+
12
+ - Route trivial hello-world, greeting, and smoke-test requests to `.github/skills/hello-world/SKILL.md`.
13
+ - On local machines with a graphical session, assume VICE should render visibly in a real emulator window.
14
+ - Only expect Xvfb or other headless fallback in CI or when no framebuffer/display session exists.
15
+
16
+ ## Backend-Pinned BASIC Fast Path
17
+
18
+ - When the prompt already pins the backend with prefixes such as `vice:` or `c64u:` and asks for a tiny static greeting or hello-world style BASIC output, route directly to `.github/skills/hello-world/SKILL.md`.
19
+ - Treat requests such as `vice: write a small BASIC program that clears the screen and prints HELLO VICE` as unambiguous; do not spend extra turns re-reading README sections, MCP manifests, or BASIC references before executing.
20
+ - Fall back to `.github/skills/basic-program/SKILL.md` only when the user asks for custom program logic, hardware-specific behavior, or deeper debugging.
21
+
22
+ ## Quick Music Demo
23
+
24
+ - Route recognizable demo-tune requests to `.github/skills/sid-music/SKILL.md`.
25
+ - The canonical built-in preset is `fuer_elise`.
26
+ - Legacy preset callers should still normalize to the same playback path rather than failing.
27
+
28
+ Example:
29
+
30
+ ```json
31
+ {
32
+ "op": "play_preset",
33
+ "preset": "fuer_elise"
34
+ }
35
+ ```
36
+
37
+ ## Longer Interactive Sessions
38
+
39
+ - Use the dedicated skill for the underlying task when the user needs a pinned backend, custom program logic, or deeper debugging.
40
+
41
+ ## Verification Order
42
+
43
+ 1. Trust the verification defined by the selected skill first.
44
+ 2. Use captured artifacts or follow-up inspection only when the selected skill indicates that extra verification is needed.
@@ -37,13 +37,16 @@ Colour presets and character codes for C64 PETSCII art. Target: LLM optimization
37
37
  ## Contrast Guidelines
38
38
 
39
39
  **Readable combinations** (luminance difference ≥3):
40
+
40
41
  - 0/1 (Black/White), 0/7 (Black/Yellow), 0/13 (Black/Lt.Green)
41
42
  - 6/1 (Blue/White), 6/7 (Blue/Yellow), 11/1 (Dk.Grey/White)
42
43
 
43
44
  **Marginal** (luminance difference 2):
45
+
44
46
  - 0/3 (Black/Cyan), 6/14 (Blue/Lt.Blue), 12/1 (Grey/White)
45
47
 
46
48
  **Unreadable** (insufficient contrast):
49
+
47
50
  - 12/15 (Grey/Lt.Grey), 11/12 (Dk.Grey/Grey), 2/4 (Red/Purple)
48
51
  - 6/11 (Blue/Dk.Grey), 9/11 (Brown/Dk.Grey)
49
52
 
@@ -57,9 +60,10 @@ Border matching: Set border=background for seamless look.
57
60
  Conversion: Screen code ≠ PETSCII code. Use charset reference (c64://specs/charset) for mapping.
58
61
 
59
62
  **Usage**:
63
+
60
64
  - BASIC/printing: Use PETSCII codes with CHR$() or PRINT
61
65
  - Direct screen memory: Use screen codes with POKE to $0400+offset
62
- - Tools: `c64_graphics` (`create_petscii`) returns both `petsciiCodes` array and screen memory data
66
+ - Tools: `c64_graphics` (`render_petscii_art`) returns both `petsciiCodes` array and screen memory data
63
67
 
64
68
  ## Essential PETSCII Symbols
65
69
 
@@ -89,7 +93,7 @@ Conversion: Screen code ≠ PETSCII code. Use charset reference (c64://specs/cha
89
93
 
90
94
  ```javascript
91
95
  await callTool("c64_graphics", {
92
- op: "create_petscii",
96
+ op: "render_petscii_art",
93
97
  prompt: "cat",
94
98
  borderColor: 0,
95
99
  backgroundColor: 6,
@@ -243,7 +243,7 @@ Custom charsets have minimal performance impact:
243
243
 
244
244
  ## Tool Integration
245
245
 
246
- ### Using generate_sprite_prg
246
+ ### Using render_sprite
247
247
 
248
248
  ```javascript
249
249
  {
@@ -258,7 +258,7 @@ Custom charsets have minimal performance impact:
258
258
  The tool:
259
259
 
260
260
  - Validates 63-byte sprite format
261
- - Generates BASIC program to display sprite
261
+ - Writes sprite data directly into RAM
262
262
  - Handles sprite pointer and VIC-II register setup
263
263
  - Returns structured metadata for follow-up operations
264
264
 
@@ -277,8 +277,8 @@ When working with sprites and charsets:
277
277
  ### Simple Sprite Display
278
278
 
279
279
  1. Prepare 24×21 sprite bitmap
280
- 2. Call `generate_sprite_prg` with sprite data
281
- 3. Tool returns PRG that sets up sprite automatically
280
+ 2. Call `render_sprite` with sprite data
281
+ 3. Tool writes sprite data and patches VIC-II state automatically
282
282
  4. Use `read_screen` to verify appearance
283
283
  5. Optionally call `c64_memory` `write` to adjust position/colour
284
284
 
@@ -303,7 +303,7 @@ When working with sprites and charsets:
303
303
 
304
304
  1. **Plan Memory Layout**: Map out sprite and charset locations before coding
305
305
  2. **Test Incrementally**: Display one sprite/char before adding more
306
- 3. **Use Tools**: Leverage `generate_sprite_prg` and memory tools
306
+ 3. **Use Tools**: Leverage `render_sprite` and memory tools
307
307
  4. **Document State**: Note which sprites/chars are active
308
308
  5. **Handle Errors**: Check return values and screen output
309
309
  6. **Optimize Last**: Get it working, then optimize if needed