c64bridge 0.7.4 → 0.8.1
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/.github/prompts/README.md +14 -4
- package/.github/prompts/assembly-routine-session.prompt.md +9 -9
- package/.github/prompts/basic-program-session.prompt.md +11 -9
- package/.github/prompts/drive-management-session.prompt.md +9 -9
- package/.github/prompts/hello-world-session.prompt.md +17 -0
- package/.github/prompts/petscii-art-session.prompt.md +9 -9
- package/.github/prompts/play-classic-game.prompt.md +9 -9
- package/.github/prompts/pr-converge.prompt.md +13 -0
- package/.github/prompts/sid-music-session.prompt.md +9 -9
- package/AGENTS.md +59 -60
- package/README.md +550 -191
- package/data/assembly/assembly-spec.md +290 -1
- package/data/context/bootstrap.md +26 -2
- package/data/context/fast-paths.md +44 -0
- package/data/graphics/petscii-style-guide.md +6 -2
- package/data/graphics/sprite-charset-best-practices.md +5 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/c64Client.js +990 -26
- package/dist/config.js +5 -1
- package/dist/device.js +680 -57
- package/dist/diagnostics.js +371 -0
- package/dist/mcp/metadata.js +39 -0
- package/dist/mcp-server.js +170 -20
- package/dist/platform.js +10 -2
- package/dist/prompts/registry.js +166 -309
- package/dist/rag/init.js +37 -1
- package/dist/rag/knowledgeIndex.js +18 -6
- package/dist/rag/rateLimiter.js +2 -2
- package/dist/streamCapture.js +135 -0
- package/dist/tools/audio.js +3 -1
- package/dist/tools/debug.js +470 -0
- package/dist/tools/developer.js +10 -4
- package/dist/tools/graphics.js +183 -17
- package/dist/tools/machineControl.js +11 -5
- package/dist/tools/memory.js +19 -10
- package/dist/tools/meta/audio.js +240 -1
- package/dist/tools/meta/config.js +20 -28
- package/dist/tools/meta/configInventory.js +104 -0
- package/dist/tools/meta/diagnostics.js +45 -2
- package/dist/tools/meta/graphics.js +14 -6
- package/dist/tools/meta/index.js +1 -0
- package/dist/tools/meta/memory.js +20 -6
- package/dist/tools/meta/program.js +473 -0
- package/dist/tools/pollValidator.js +4 -2
- package/dist/tools/programRunners.js +8 -4
- package/dist/tools/registry/config.js +17 -0
- package/dist/tools/registry/disk.js +7 -0
- package/dist/tools/registry/drive.js +3 -0
- package/dist/tools/registry/graphics.js +111 -27
- package/dist/tools/registry/index.js +6 -0
- package/dist/tools/registry/memory.js +1 -0
- package/dist/tools/registry/platform.js +121 -0
- package/dist/tools/registry/program.js +26 -8
- package/dist/tools/registry/sound.js +96 -0
- package/dist/tools/registry/system.js +15 -2
- package/dist/tools/storage.js +1 -0
- package/dist/tools/streaming.js +1 -0
- package/dist/tools/types.js +38 -4
- package/dist/tools/vice.js +160 -0
- package/dist/vicBitmap.js +317 -0
- package/dist/vice/mockServer.js +439 -0
- package/dist/vice/process.js +310 -0
- package/dist/vice/readiness.js +18 -2
- package/dist/vice/viceClient.js +382 -22
- package/doc/developer.md +71 -25
- package/doc/img/backend-switch/hello-c64u.png +0 -0
- package/doc/img/backend-switch/hello-vice-and-c64u.png +0 -0
- package/doc/img/backend-switch/hello-vice.png +0 -0
- package/doc/img/backend-switch/metadata.json +50 -0
- package/doc/plans/vice-backend-switch/plan.md +486 -0
- package/doc/plans/vice-backend-switch-2/plan.md +48 -0
- package/doc/plans/vice-support/notes.md +1 -0
- package/doc/plans/vice-support/plan.md +5 -0
- package/doc/plans/vice-support/rollout.md +23 -17
- package/doc/reviews/vice-support-review.md +185 -0
- package/doc/troubleshooting-mcp.md +35 -6
- package/doc/vice/support-matrix.md +54 -0
- package/mcp/prompts.json +292 -0
- package/mcp/protocol-examples.json +46 -0
- package/mcp/resources.json +940 -0
- package/mcp/schemas/c64_config.schema.json +350 -0
- package/mcp/schemas/c64_debug.schema.json +380 -0
- package/mcp/schemas/c64_disk.schema.json +278 -0
- package/mcp/schemas/c64_drive.schema.json +120 -0
- package/mcp/schemas/c64_extract.schema.json +302 -0
- package/mcp/schemas/c64_graphics.schema.json +333 -0
- package/mcp/schemas/c64_memory.schema.json +155 -0
- package/mcp/schemas/c64_printer.schema.json +218 -0
- package/mcp/schemas/c64_program.schema.json +391 -0
- package/mcp/schemas/c64_rag.schema.json +67 -0
- package/mcp/schemas/c64_select_backend.schema.json +32 -0
- package/mcp/schemas/c64_sound.schema.json +644 -0
- package/mcp/schemas/c64_stream.schema.json +61 -0
- package/mcp/schemas/c64_system.schema.json +227 -0
- package/mcp/schemas/c64_vice.schema.json +63 -0
- package/mcp/server.json +15 -0
- package/mcp/tools.json +4517 -0
- package/mcp.json +90 -15
- package/package.json +11 -4
- package/scripts/capture-backend-switch-screenshots.mjs +276 -0
- package/scripts/generate-mcp-interface.ts +289 -0
- package/scripts/invoke-bun.mjs +67 -21
- package/scripts/mockC64Server.mjs +162 -6
- package/scripts/prepare-release.mjs +59 -2
- package/scripts/run-coverage.mjs +284 -0
- package/scripts/run-tests.mjs +95 -39
- package/scripts/run-tests.ts +378 -73
- package/scripts/update-readme.ts +147 -13
- package/server.json +94 -0
|
@@ -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/
|
|
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` (`
|
|
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: "
|
|
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
|
|
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
|
-
-
|
|
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 `
|
|
281
|
-
3. Tool
|
|
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 `
|
|
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
|