c64bridge 0.5.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 (138) hide show
  1. package/.github/prompts/README.md +6 -0
  2. package/.github/prompts/assembly-routine-session.prompt.md +13 -0
  3. package/.github/prompts/basic-program-session.prompt.md +13 -0
  4. package/.github/prompts/drive-management-session.prompt.md +13 -0
  5. package/.github/prompts/petscii-art-session.prompt.md +13 -0
  6. package/.github/prompts/play-classic-game.prompt.md +13 -0
  7. package/.github/prompts/sid-music-session.prompt.md +13 -0
  8. package/AGENTS.md +173 -0
  9. package/LICENSE +339 -0
  10. package/README.md +582 -0
  11. package/data/README.md +16 -0
  12. package/data/api/basic-api-spec.md +154 -0
  13. package/data/api/kernal-api-spec.md +68 -0
  14. package/data/assembly/assembly-spec.md +196 -0
  15. package/data/assembly/examples/effects/sinewave.asm +5 -0
  16. package/data/assembly/examples/graphics/sprite/mover.asm +15 -0
  17. package/data/assembly/examples/sid-file-structure.md +8 -0
  18. package/data/assembly/examples/sid-overview.md +11 -0
  19. package/data/audio/examples/Biosphere.sid +0 -0
  20. package/data/audio/sid-file-structure.md +91 -0
  21. package/data/audio/sid-programming-best-practices.md +198 -0
  22. package/data/audio/sid-spec.md +166 -0
  23. package/data/audio/sidwave.md +131 -0
  24. package/data/audio/sidwave.schema.json +64 -0
  25. package/data/basic/basic-spec.md +230 -0
  26. package/data/basic/examples/audio/alle-meine-entchen-expressive.bas +41 -0
  27. package/data/basic/examples/audio/c-major-scale-pleasant.bas +29 -0
  28. package/data/basic/examples/io/joystick.bas +5 -0
  29. package/data/basic/examples/video/bounce.bas +8 -0
  30. package/data/basic/examples/video/entchen-petscii.bas +16 -0
  31. package/data/basic/examples/video/hello-world.bas +4 -0
  32. package/data/basic/examples/video/wave.bas +7 -0
  33. package/data/context/bootstrap.md +148 -0
  34. package/data/context/chat.md +36 -0
  35. package/data/drive/drive-spec.md +215 -0
  36. package/data/embeddings_asm.json +1 -0
  37. package/data/embeddings_basic.json +1 -0
  38. package/data/embeddings_hardware.json +1 -0
  39. package/data/embeddings_mixed.json +1 -0
  40. package/data/embeddings_other.json +1 -0
  41. package/data/io/cia-spec.md +115 -0
  42. package/data/io/io-spec.md +124 -0
  43. package/data/memory/kernal-memory-map.md +227 -0
  44. package/data/memory/low-memory-map.md +133 -0
  45. package/data/memory/memory-map.md +186 -0
  46. package/data/printer/printer-commodore-bitmap.md +31 -0
  47. package/data/printer/printer-commodore.md +28 -0
  48. package/data/printer/printer-epson-bitmap.md +29 -0
  49. package/data/printer/printer-epson.md +30 -0
  50. package/data/printer/printer-prompts.md +29 -0
  51. package/data/printer/printer-spec.md +180 -0
  52. package/data/video/character-set.csv +257 -0
  53. package/data/video/vic-spec.md +276 -0
  54. package/dist/assemblyConverter.js +1299 -0
  55. package/dist/audio/record_and_analyze_audio.js +292 -0
  56. package/dist/basicConverter.js +193 -0
  57. package/dist/bootstrap/stdio-logger.js +32 -0
  58. package/dist/c64Client.js +1052 -0
  59. package/dist/chargen.js +197 -0
  60. package/dist/config.js +142 -0
  61. package/dist/context.js +157 -0
  62. package/dist/device.js +413 -0
  63. package/dist/index.js +7 -0
  64. package/dist/knowledge.js +454 -0
  65. package/dist/logger.js +182 -0
  66. package/dist/loggingHttpClient.js +88 -0
  67. package/dist/mcp-server.js +426 -0
  68. package/dist/petscii.js +135 -0
  69. package/dist/petsciiArt.js +356 -0
  70. package/dist/platform.js +82 -0
  71. package/dist/prompts/registry.js +560 -0
  72. package/dist/rag/discover.config.json +41 -0
  73. package/dist/rag/discover.js +401 -0
  74. package/dist/rag/embeddings.js +60 -0
  75. package/dist/rag/externalFetcher.js +934 -0
  76. package/dist/rag/indexer.js +770 -0
  77. package/dist/rag/init.js +139 -0
  78. package/dist/rag/knowledgeIndex.js +361 -0
  79. package/dist/rag/loggingRetriever.js +46 -0
  80. package/dist/rag/rateLimiter.js +127 -0
  81. package/dist/rag/retriever.js +74 -0
  82. package/dist/rag/sources.csv +31 -0
  83. package/dist/rag/types.js +5 -0
  84. package/dist/rag/urlUtils.js +38 -0
  85. package/dist/sidplayRunner.js +240 -0
  86. package/dist/sidwave.js +101 -0
  87. package/dist/sidwaveCompiler.js +329 -0
  88. package/dist/tools/audio.js +944 -0
  89. package/dist/tools/developer.js +515 -0
  90. package/dist/tools/errors.js +59 -0
  91. package/dist/tools/graphics.js +469 -0
  92. package/dist/tools/machineControl.js +267 -0
  93. package/dist/tools/memory.js +224 -0
  94. package/dist/tools/printer.js +482 -0
  95. package/dist/tools/programRunners.js +315 -0
  96. package/dist/tools/rag.js +153 -0
  97. package/dist/tools/registry.js +58 -0
  98. package/dist/tools/responses.js +36 -0
  99. package/dist/tools/schema.js +304 -0
  100. package/dist/tools/storage.js +740 -0
  101. package/dist/tools/streaming.js +132 -0
  102. package/dist/tools/types.js +99 -0
  103. package/dist/viceRunner.js +239 -0
  104. package/doc/MCP_SETUP.md +153 -0
  105. package/doc/README.md +7 -0
  106. package/doc/developer.md +312 -0
  107. package/doc/img/logo.png +0 -0
  108. package/doc/img/prompts/duck_petscii.png +0 -0
  109. package/doc/img/prompts/duck_song.png +0 -0
  110. package/doc/img/vscode/vscode-copilot-c64-chat-mode.png +0 -0
  111. package/doc/img/vscode/vscode-copilot-hello-world.png +0 -0
  112. package/doc/prompts/README.md +96 -0
  113. package/doc/prompts/user-prompt-ideas.md +147 -0
  114. package/doc/rest/c64-openapi.yaml +979 -0
  115. package/doc/rest/c64-rest-api.md +106 -0
  116. package/doc/troubleshooting-mcp.md +177 -0
  117. package/generated/c64/index.js +857 -0
  118. package/mcp.json +106 -0
  119. package/package.json +79 -0
  120. package/scripts/c64-cli.mjs +142 -0
  121. package/scripts/c64-tool.sh +83 -0
  122. package/scripts/check-package.mjs +89 -0
  123. package/scripts/cli.js +61 -0
  124. package/scripts/fetch-external-sources.mjs +67 -0
  125. package/scripts/generate-changelog.mjs +131 -0
  126. package/scripts/postbuild.mjs +101 -0
  127. package/scripts/prepare-release.mjs +58 -0
  128. package/scripts/rag-rebuild.mjs +53 -0
  129. package/scripts/register-ts-node.mjs +6 -0
  130. package/scripts/run-mcp-check.sh +104 -0
  131. package/scripts/run-tests.mjs +195 -0
  132. package/scripts/sid2wav.sh +94 -0
  133. package/scripts/smoke-run.sh +65 -0
  134. package/scripts/start-mock-c64.mjs +51 -0
  135. package/scripts/start-mock.mjs +31 -0
  136. package/scripts/start.mjs +72 -0
  137. package/scripts/update-readme.ts +164 -0
  138. package/scripts/verify-package.mjs +147 -0
@@ -0,0 +1,230 @@
1
+ # C64 BASIC V2 Specification
2
+
3
+ ## Language
4
+
5
+ ### Overview
6
+
7
+ C64 BASIC V2 is an interpreted language with line-numbered statements, tokenised keywords, and a limited variable model. Execution flows linearly unless redirected by control statements.
8
+
9
+ ### Variable Types
10
+
11
+ | Type | Suffix | Range | Storage | Notes |
12
+ |------|---------|--------|----------|-------|
13
+ | **Real (Float)** | none | ±2.9×10⁻³⁸ … ±1.7×10³⁸ | 5 bytes (1 exp, 4 mantissa) | Default type. |
14
+ | **Integer** | `%` | −32768 … 32767 | 2 bytes | Converted from float on assignment, slower. |
15
+ | **String** | `$` | 0–255 chars | 3-byte descriptor | Holds PETSCII text. |
16
+
17
+ Booleans are represented numerically: `FALSE=0`, `TRUE=−1` or any non-zero value.
18
+
19
+ ### Variable Naming
20
+
21
+ - Only the **first two letters** of a name are significant (`CO`, `COCOS` → same variable).
22
+ - Type suffix (`%`, `$`) distinguishes otherwise identical names.
23
+ - Allowed: `A–Z`, `0–9`; must start with a letter.
24
+ - Keywords and system variables (`ST`, `TI`, `TI$`, `FN`) are reserved.
25
+ - Maximum logical name length ≈80 characters.
26
+
27
+ ### Arrays
28
+
29
+ Declared via `DIM`, e.g. `DIM A(7)` (indices 0–7). Multi-dimensional arrays are supported (`DIM B$(4,5)`).
30
+
31
+ ### Operators and Precedence
32
+
33
+ | Rank | Operators | Description |
34
+ |------|------------|-------------|
35
+ | 1 | `^` | Exponentiation |
36
+ | 2 | unary `+` `-` | Sign |
37
+ | 3 | `*` `/` | Multiplication, Division |
38
+ | 4 | `+` `-` | Addition, Subtraction, String concat |
39
+ | 5 | `<` `<=` `=` `>=` `>` `<>` | Comparison |
40
+ | 6 | `NOT` | Logical NOT |
41
+ | 7 | `AND` | Logical AND |
42
+ | 8 | `OR` | Logical OR |
43
+
44
+ Parentheses may nest up to 10 levels. Logical operators can also perform bitwise operations on 16‑bit integers.
45
+
46
+ ### Syntax Definition (EBNF)
47
+
48
+ ```
49
+ program = { line }, endmarker ;
50
+ line = nextptr word , lineno word , stmtlist , 0x00 ;
51
+ stmtlist = statement , { ":" , statement } ;
52
+
53
+ statement =
54
+ "REM" , { <any PETSCII except CR> } |
55
+ "FOR" , var , "=" , expr , "TO" , expr , [ "STEP" , expr ] |
56
+ "NEXT" , [ var ] |
57
+ "IF" , expr , "THEN" , ( stmtlist | lineno ) |
58
+ ( "GOTO" | "GO" , "TO" ) , lineno |
59
+ "GOSUB" , lineno | "RETURN" |
60
+ "ON" , expr , ( "GOTO" | "GOSUB" ) , lineno , { "," , lineno } |
61
+ "DEF" , "FN" , fnname , "(" , var , ")" , "=" , expr |
62
+ "INPUT" , [ prompt ] , varlist | "GET" , var | "PRINT" , [ printlist ] |
63
+ "OPEN" , expr , "," , expr , [ "," , expr , [ "," , fnameMode ] ] |
64
+ "CLOSE" , expr | "CMD" , expr , [ "," , exprlist ] |
65
+ "LOAD" , fname [ "," , dev [ "," , secdev ] ] |
66
+ "SAVE" , fname [ "," , dev [ "," , secdev ] ] |
67
+ "VERIFY" , fname [ "," , dev [ "," , secdev ] ] |
68
+ "READ" , varlist | "RESTORE" | "DATA" , datalist |
69
+ "POKE" , expr , "," , expr | "PEEK" , "(" , expr , ")" |
70
+ "WAIT" , expr , "," , expr , [ "," , expr ] |
71
+ "SYS" , expr , { "," , expr } | var , "=" , expr |
72
+ "USR" , "(" , expr , ")" |
73
+ "RUN" , [ lineno ] | "STOP" | "END" | "CONT" |
74
+ "LIST" , [ listRange ] | "NEW" | "CLR" |
75
+ "FRE" , "(" , expr , ")" ;
76
+
77
+ expr = term , { "OR" , term } ;
78
+ term = factor , { "AND" , factor } ;
79
+ factor = [ "NOT" ] , relation ;
80
+ relation = sum , { ( "=" | "<" | ">" | "<=" | ">=" | "<>" ) , sum } ;
81
+ sum = product , { ( "+" | "-" ) , product } ;
82
+ product = power , { ( "*" | "/" ) , power } ;
83
+ power = unary , { "^" , unary } ;
84
+ unary = [ "+" | "-" ] , primary ;
85
+ primary = number | string | var | fncall | "(" , expr , ")" ;
86
+
87
+ fncall = ( "SGN" | "INT" | "ABS" | "USR" | "FRE" | "POS" | "SQR" | "RND" |
88
+ "LOG" | "EXP" | "COS" | "SIN" | "TAN" | "ATN" | "PEEK" | "LEN" |
89
+ "STR$" | "VAL" | "ASC" | "CHR$" | "LEFT$" | "RIGHT$" | "MID$" |
90
+ "TAB" | "SPC" ), "(" , [ expr , { "," , expr } ] , ")" ;
91
+
92
+ printlist = [ expr | "#" , expr ] , { "," | ";" , [ expr | "#" , expr ] } ;
93
+ varlist = var , { "," , var } ;
94
+ datalist = datum , { "," , datum } ;
95
+ datum = number | string | expr ;
96
+
97
+ fname = string ; dev = expr ; secdev = expr ; fnameMode = string ;
98
+ lineno = 0..65535 ;
99
+ var = name [ "%" | "$" ] ; fnname = "FN" , name ;
100
+ name = letter , { letter | digit } ;
101
+ prompt = string , ";" ;
102
+ listRange = lineno | "-" , lineno | lineno , "-" ;
103
+ number = integer | float ; string = quoted PETSCII ;
104
+ ```
105
+
106
+ ### Commands and Functions
107
+
108
+ - **Flow:** `FOR…TO…[STEP…]…NEXT [var]`, `IF expr THEN (stmts|line)`, `GOTO`, `GO TO`, `GOSUB`, `RETURN`, `ON expr GOTO/GOSUB`, `DEF FN name(x)=expr`
109
+ - **I/O:** `GET var$`, `INPUT ["prompt";] var[,var…]`, `PRINT [items]`, `SPC(n)`, `TAB(n)`, `POS(dummy)`
110
+ - **Files:** `LOAD`, `SAVE`, `VERIFY`, `OPEN`, `CLOSE`, `GET#`, `INPUT#`, `PRINT#`, `CMD`, `ST`
111
+ - **DATA:** `DATA`, `READ`, `RESTORE`
112
+ - **Math/Logic:** `+ - * / ^`, comparisons, `AND OR NOT`; `SGN INT ABS RND SQR LOG EXP SIN COS TAN ATN`
113
+ - **Strings:** `+` (concat), `LEN LEFT$ RIGHT$ MID$ STR$ VAL ASC CHR$`
114
+ - **Memory:** `PEEK(addr)`, `POKE addr,val`, `WAIT addr,mask[,invert]`
115
+ - **System:** `SYS addr[,p…]`, `USR(expr)` (fixed $0310)
116
+ - **Execution:** `RUN [line]`, `STOP`, `END`, `CONT`
117
+ - **Misc:** `REM`, `LIST`, `NEW`, `CLR`, `FRE(0)`, constants `π`, timers `TI`, `TI$`
118
+
119
+ ---
120
+
121
+ ## Tokenization
122
+
123
+ ### Encoding Rules
124
+
125
+ - Keywords occupy **$80–$CB**; single‑byte tokens replace text during encoding.
126
+ - Tokenisation **skips inside** strings (`"..."`) and remarks (`REM`).
127
+ - Matching is **greedy**, **case‑insensitive**; e.g. `PRINT#` before `PRINT`.
128
+ - If a line becomes empty, insert a single space (`$20`).
129
+ - Characters are written as **PETSCII**, with identifiers uppercased; strings/comments unchanged.
130
+
131
+ ### Keyword Table
132
+
133
+ | Hex | Keyword | Notes |
134
+ |------|----------|-------|
135
+ | 80 | END | |
136
+ | 81 | FOR | |
137
+ | 82 | NEXT | |
138
+ | 83 | DATA | |
139
+ | 84 | INPUT# | |
140
+ | 85 | INPUT | |
141
+ | 86 | DIM | |
142
+ | 87 | READ | |
143
+ | 88 | LET | Optional |
144
+ | 89 | GOTO | |
145
+ | 8A | RUN | |
146
+ | 8B | IF | |
147
+ | 8C | RESTORE | |
148
+ | 8D | GOSUB | |
149
+ | 8E | RETURN | |
150
+ | 8F | REM | De-tokenises remainder |
151
+ | 90 | STOP | |
152
+ | 91 | ON | |
153
+ | 92 | WAIT | |
154
+ | 93 | LOAD | |
155
+ | 94 | SAVE | |
156
+ | 95 | VERIFY | |
157
+ | 96 | DEF | |
158
+ | 97 | POKE | |
159
+ | 98 | PRINT# | |
160
+ | 99 | PRINT | |
161
+ | 9A | CONT | |
162
+ | 9B | LIST | |
163
+ | 9C | CLR | |
164
+ | 9D | CMD | |
165
+ | 9E | SYS | |
166
+ | 9F | OPEN | |
167
+ | A0 | CLOSE | |
168
+ | A1 | GET | |
169
+ | A2 | NEW | |
170
+ | A3 | TAB( | |
171
+ | A4 | TO | |
172
+ | A5 | FN | |
173
+ | A6 | SPC( | |
174
+ | A7 | THEN | |
175
+ | A8 | NOT | |
176
+ | A9 | STEP | |
177
+ | AA | + | |
178
+ | AB | - | |
179
+ | AC | * | |
180
+ | AD | / | |
181
+ | AE | ^ | |
182
+ | AF | AND | |
183
+ | B0 | OR | |
184
+ | B1 | > | |
185
+ | B2 | = | |
186
+ | B3 | < | |
187
+ | B4 | SGN | |
188
+ | B5 | INT | |
189
+ | B6 | ABS | |
190
+ | B7 | USR | |
191
+ | B8 | FRE | |
192
+ | B9 | POS | |
193
+ | BA | SQR | |
194
+ | BB | RND | |
195
+ | BC | LOG | |
196
+ | BD | EXP | |
197
+ | BE | COS | |
198
+ | BF | SIN | |
199
+ | C0 | TAN | |
200
+ | C1 | ATN | |
201
+ | C2 | PEEK | |
202
+ | C3 | LEN | |
203
+ | C4 | STR$ | |
204
+ | C5 | VAL | |
205
+ | C6 | ASC | |
206
+ | C7 | CHR$ | |
207
+ | C8 | LEFT$ | |
208
+ | C9 | RIGHT$ | |
209
+ | CA | MID$ | |
210
+ | CB | GO | For GO TO / GO SUB |
211
+
212
+ ### PRG Layout
213
+
214
+ Each BASIC program is stored as a contiguous memory block starting at `$0801`:
215
+
216
+ 1. **Load address** `$0801` (little‑endian).
217
+ 2. Repeated **line records**:
218
+ - Pointer to next line (absolute address, word LE)
219
+ - Line number (word LE)
220
+ - Tokenised bytes ending with `00`
221
+ 3. Final **terminator word `0000`**.
222
+
223
+ Pointers increase monotonically. The last line points to the terminator.
224
+
225
+ ### Validation Rules
226
+
227
+ - Line numbers `0–65535` only.
228
+ - Final sentinel `0000` required.
229
+ - `ST` bits: 6 = EOF, 7 = Device not present.
230
+ - `RND(seed<0)` re‑initialises RNG; `RND(0)` continues sequence.
@@ -0,0 +1,41 @@
1
+ 10 REM ALLE MEINE ENTCHEN - MUSICAL PHRASING
2
+ 20 REM WITH PROPER EMPHASIS AND BREATHING
3
+ 30 REM USING TRIANGLE WAVE AND PROPER ADSR
4
+ 40 REM
5
+ 50 POKE 54296,15:REM VOLUME TO MAXIMUM
6
+ 60 POKE 54277,17:POKE 54278,240:REM FAST ATTACK, SLOW RELEASE
7
+ 70 REM
8
+ 80 PRINT "PLAYING ALLE MEINE ENTCHEN..."
9
+ 90 PRINT "WITH MUSICAL EXPRESSION!"
10
+ 100 REM
11
+ 110 REM ALLE MEINE ENTCHEN (C-D-E-F-G-G) - OPENING PHRASE
12
+ 120 POKE 54273,30:POKE 54274,0:POKE 54276,17:FOR I=1 TO 250:NEXT I:POKE 54276,16:FOR I=1 TO 40:NEXT I
13
+ 130 POKE 54273,34:POKE 54274,0:POKE 54276,17:FOR I=1 TO 180:NEXT I:POKE 54276,16:FOR I=1 TO 40:NEXT I
14
+ 140 POKE 54273,38:POKE 54274,0:POKE 54276,17:FOR I=1 TO 180:NEXT I:POKE 54276,16:FOR I=1 TO 40:NEXT I
15
+ 150 POKE 54273,40:POKE 54274,0:POKE 54276,17:FOR I=1 TO 180:NEXT I:POKE 54276,16:FOR I=1 TO 40:NEXT I
16
+ 160 POKE 54273,45:POKE 54274,0:POKE 54276,17:FOR I=1 TO 200:NEXT I:POKE 54276,16:FOR I=1 TO 50:NEXT I
17
+ 170 POKE 54273,45:POKE 54274,0:POKE 54276,17:FOR I=1 TO 400:NEXT I:POKE 54276,16:FOR I=1 TO 150:NEXT I
18
+ 180 REM
19
+ 190 REM SCHWIMMEN AUF DEM SEE (A-A-A-A-G) - FLOATING PHRASE
20
+ 200 POKE 54273,51:POKE 54274,0:POKE 54276,17:FOR I=1 TO 160:NEXT I:POKE 54276,16:FOR I=1 TO 30:NEXT I
21
+ 210 POKE 54273,51:POKE 54274,0:POKE 54276,17:FOR I=1 TO 160:NEXT I:POKE 54276,16:FOR I=1 TO 30:NEXT I
22
+ 220 POKE 54273,51:POKE 54274,0:POKE 54276,17:FOR I=1 TO 160:NEXT I:POKE 54276,16:FOR I=1 TO 30:NEXT I
23
+ 230 POKE 54273,51:POKE 54274,0:POKE 54276,17:FOR I=1 TO 160:NEXT I:POKE 54276,16:FOR I=1 TO 50:NEXT I
24
+ 240 POKE 54273,45:POKE 54274,0:POKE 54276,17:FOR I=1 TO 450:NEXT I:POKE 54276,16:FOR I=1 TO 200:NEXT I
25
+ 250 REM
26
+ 260 REM KOEPFCHEN IN DAS WASSER (F-F-F-F-E) - DIVING MOTION
27
+ 270 POKE 54273,40:POKE 54274,0:POKE 54276,17:FOR I=1 TO 140:NEXT I:POKE 54276,16:FOR I=1 TO 25:NEXT I
28
+ 280 POKE 54273,40:POKE 54274,0:POKE 54276,17:FOR I=1 TO 140:NEXT I:POKE 54276,16:FOR I=1 TO 25:NEXT I
29
+ 290 POKE 54273,40:POKE 54274,0:POKE 54276,17:FOR I=1 TO 140:NEXT I:POKE 54276,16:FOR I=1 TO 25:NEXT I
30
+ 300 POKE 54273,40:POKE 54274,0:POKE 54276,17:FOR I=1 TO 140:NEXT I:POKE 54276,16:FOR I=1 TO 50:NEXT I
31
+ 310 POKE 54273,38:POKE 54274,0:POKE 54276,17:FOR I=1 TO 350:NEXT I:POKE 54276,16:FOR I=1 TO 120:NEXT I
32
+ 320 REM
33
+ 330 REM SCHWAENZCHEN IN DIE HOEH (D-D-D-D-C) - TRIUMPHANT ENDING
34
+ 340 POKE 54273,34:POKE 54274,0:POKE 54276,17:FOR I=1 TO 180:NEXT I:POKE 54276,16:FOR I=1 TO 30:NEXT I
35
+ 350 POKE 54273,34:POKE 54274,0:POKE 54276,17:FOR I=1 TO 180:NEXT I:POKE 54276,16:FOR I=1 TO 30:NEXT I
36
+ 360 POKE 54273,34:POKE 54274,0:POKE 54276,17:FOR I=1 TO 180:NEXT I:POKE 54276,16:FOR I=1 TO 30:NEXT I
37
+ 370 POKE 54273,34:POKE 54274,0:POKE 54276,17:FOR I=1 TO 200:NEXT I:POKE 54276,16:FOR I=1 TO 50:NEXT I
38
+ 380 POKE 54273,30:POKE 54274,0:POKE 54276,17:FOR I=1 TO 600:NEXT I:POKE 54276,16
39
+ 390 REM
40
+ 400 POKE 54276,0:PRINT "ALLE MEINE ENTCHEN COMPLETE!"
41
+ 410 PRINT "WITH MUSICAL EXPRESSION AND PHRASING!"
@@ -0,0 +1,29 @@
1
+ 10 REM PLEASANT C MAJOR SCALE
2
+ 20 REM USES TRIANGLE WAVE AND PROPER ADSR
3
+ 30 REM BASED ON REAL HARDWARE TESTING
4
+ 40 REM
5
+ 50 POKE 54296,15:REM VOLUME TO MAXIMUM
6
+ 60 POKE 54277,17:POKE 54278,240:REM FAST ATTACK, SLOW RELEASE
7
+ 70 REM
8
+ 80 REM LOWER C MAJOR SCALE WITH TRIANGLE WAVE
9
+ 90 PRINT "PLAYING C MAJOR SCALE..."
10
+ 100 REM
11
+ 110 REM C (30)
12
+ 120 POKE 54273,30:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
13
+ 130 REM D (34)
14
+ 140 POKE 54273,34:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
15
+ 150 REM E (38)
16
+ 160 POKE 54273,38:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
17
+ 170 REM F (40)
18
+ 180 POKE 54273,40:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
19
+ 190 REM G (45)
20
+ 200 POKE 54273,45:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
21
+ 210 REM A (51)
22
+ 220 POKE 54273,51:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
23
+ 230 REM B (57)
24
+ 240 POKE 54273,57:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16:FOR I=1 TO 500:NEXT I
25
+ 250 REM C (60)
26
+ 260 POKE 54273,60:POKE 54274,0:POKE 54276,17:FOR I=1 TO 3000:NEXT I:POKE 54276,16
27
+ 270 REM
28
+ 280 POKE 54276,0:PRINT "SMOOTH SCALE COMPLETE"
29
+ 290 PRINT "SID REGISTERS CLEARED"
@@ -0,0 +1,5 @@
1
+ 10 PRINT "READING JOYSTICK PORT 2"
2
+ 20 J=PEEK(56320)
3
+ 30 PRINT "PORT2:";J
4
+ 40 FOR T=1 TO 200:NEXT
5
+ 50 GOTO 20
@@ -0,0 +1,8 @@
1
+ 10 POKE 53280,0:POKE 53281,0
2
+ 20 X=10:DX=1
3
+ 30 PRINT CHR$(147)
4
+ 40 PRINT TAB(X);"O"
5
+ 50 X=X+DX
6
+ 60 IF X=1 OR X=38 THEN DX=-DX
7
+ 70 FOR T=1 TO 50:NEXT
8
+ 80 GOTO 30
@@ -0,0 +1,16 @@
1
+ 10 REM ENTCHEN PETSCII SCENE
2
+ 20 POKE 53280,6:POKE 53281,14:REM BLUE BORDER, LIGHT BLUE BACKGROUND
3
+ 30 POKE 646,7:PRINT CHR$(147);CHR$(14):REM CLEAR SCREEN, SET YELLOW, LOWERCASE MODE
4
+ 40 PRINT " ~~~~~ ~~~~ ~~~~"
5
+ 50 PRINT " ~~~~ ~~~~~ ~~~~ ~~~~"
6
+ 60 PRINT " __ __"
7
+ 70 PRINT " ___<( o)___ ___(o )>___"
8
+ 80 PRINT " ( ) ( )"
9
+ 90 PRINT " (_____) (_____ )"
10
+ 100 PRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
11
+ 110 POKE 646,1:PRINT
12
+ 120 PRINT "ALLE MEINE ENTCHEN"
13
+ 130 PRINT "SCHWIMMEN AUF DEM SEE"
14
+ 140 PRINT "KOPFCHEN IN DAS WASSER"
15
+ 150 PRINT "SCHWANZCHEN IN DIE HOH'"
16
+ 160 END
@@ -0,0 +1,4 @@
1
+ 10 PRINT "HELLO WORLD!"
2
+ 20 PRINT "WELCOME TO C64 PROGRAMMING"
3
+ 30 PRINT "FROM THE YEAR 2025!"
4
+ 40 END
@@ -0,0 +1,7 @@
1
+ 10 POKE 53280,0:POKE 53281,0
2
+ 20 PRINT CHR$(147)
3
+ 30 FOR X=0 TO 39
4
+ 40 Y=10+INT(8*SIN(X/6))
5
+ 50 PRINT TAB(X);TAB(Y);"*"
6
+ 60 NEXT X
7
+ 70 GOTO 30
@@ -0,0 +1,148 @@
1
+ # C64 Knowledge Bootstrap
2
+
3
+ High-level overview for C64 development. For more details, see linked spec documents.
4
+
5
+ ## Device & Services
6
+
7
+ - MCP server controls Ultimate 64/C64 via REST: upload/run BASIC or ASM, screen/memory I/O, drives, SID music, audio analysis, local RAG.
8
+ - Key chips: VIC-II ($D000), SID ($D400), CIA1 ($DC00), CIA2 ($DD00).
9
+
10
+ ## Memory Map (default RAM layout)
11
+
12
+ For Full details see `../memory/memory-map.md` with focus on low-memory (pages 0-3) in `../memory/low-memory-map.md` and KERNAL memory in `../memory/kernal-memory-map.md`.
13
+
14
+ - $0000–$00FF: Zero page
15
+ - $0100–$01FF: Stack
16
+ - $0200–$02FF: Workspace, vectors ($0314/$0315 IRQ, $0318/$0319 BRK)
17
+ - $0400–$07E7: Screen RAM (text 40×25)
18
+ - $0801–: BASIC program area (defaults)
19
+ - $A000–$BFFF: BASIC ROM (banked; RAM when LORAM/HIRAM cleared)
20
+ - $C000–$CFFF: RAM (common for ASM)
21
+ - $D000–$DFFF: I/O area (VIC-II $D000–$D02E; SID $D400–$D418; Color RAM $D800–$DBE7; CIA1/2 $DC00/$DD00)
22
+ - $E000–$FFFF: KERNAL ROM (banked)
23
+
24
+ Bank control (6510 at $0001):
25
+
26
+ - Bits: 0 LORAM, 1 HIRAM, 2 CHAREN. Typical full RAM: %0000_0011 → clear for RAM, set for ROM.
27
+
28
+ ## Video (VIC-II)
29
+
30
+ The VIC-II chip handles graphics and sprites. Fore more information see `data/video/vic-spec.md`.
31
+
32
+ - Sprites: X ($D000..$D00E even), Y ($D001..$D00F odd), X MSBs $D010.
33
+ - Control: $D011 (bit 7: 25th row; bit 6: RST8; bit 5: bitmap on; bits 0–2: vertical scroll).
34
+ - Raster line: $D012 (LSB), $D011 bit 7 forms MSB; raster IRQ: mask $D01A, status $D019, vector $0314/$0315.
35
+ - Control 2/Multicolour: $D016 (bit 4: 38/40 cols; bit 5: multicolour; bits 0–2: horizontal scroll).
36
+ - Memory pointers: $D018 (bits 1–3: screen base; bits 4–7: charset/bitmap base).
37
+ - Sprite enable: $D015; expand X: $D01D; expand Y: $D017; priority: $D01B; multicolour: $D01C.
38
+ - Colors: Border $D020; background 0–3 $D021–$D023; sprite multicolour $D025–$D026; sprite colours $D027–$D02E.
39
+ - Collisions: sprite-sprite $D01E (read/clear by write); sprite-background $D01F.
40
+
41
+ Video modes:
42
+
43
+ - Text: $D011 bit 5=0; $D016 bit 5=0 (hi-res); charset and screen from $D018.
44
+ - Bitmap: $D011 bit 5=1; hi-res (single colour per 8×8) or multicolour ($D016 bit 5=1).
45
+ - Multicolour text/bitmap: wide pixels using $D022–$D024 and colour RAM.
46
+
47
+ Bitmap setup (typical):
48
+
49
+ - Screen map at $0400 ($D018 bits 1–3 = 1), bitmap at $2000 ($D018 bits 4–7 = 8).
50
+ - Enable bitmap: set $D011 bit 5; optional multicolour: set $D016 bit 5.
51
+
52
+ ### PETSCII, Screen & Colors
53
+
54
+ - Screen at $0400 (40×25); write screen codes. Colour RAM at $D800 (nybbles). Border $D020, background $D021.
55
+ - To draw pixels: use bitmap mode and write to bitmap memory; control colours via attributes (screen/colour RAM in text, nybbles per cell in bitmap multicolour).
56
+
57
+ ### PETSCII String Pitfalls
58
+
59
+ - PETSCII is not ASCII: characters such as the backslash map to control codes (e.g. `$1C` toggles reverse video in the default upper/graphics set). Switch to the lower/upper character set first (`CHR$(14)` or `POKE 53272,14`) or pick alternative glyphs if you need a literal `\` on screen.
60
+ - Commodore BASIC does not interpret `\n` as a newline. When emitting multi-line art, either print each line separately or inject carriage returns explicitly with `CHR$(13)`.
61
+
62
+ Example:
63
+
64
+ ```basic
65
+ 10 PRINT CHR$(147);CHR$(14);" /\\_/\\"
66
+ 20 PRINT " ( o.o )"
67
+ 30 PRINT " > ^ <"
68
+ 40 PRINT CHR$(142)
69
+ ```
70
+
71
+ ## Raster IRQ Setup
72
+
73
+ Use this to trigger code at a specific raster line, e.g. for split-screen effects, multiplexing sprites, or scrolling in the border without screen tear.
74
+
75
+ 1. Disable interrupts: `SEI`.
76
+ 2. Set raster line `$D012`, configure `$D011` bit 7 accordingly.
77
+ 3. Set IRQ vector `$0314/$0315` to handler.
78
+ 4. Enable IRQ in `$D01A` and global `CLI`.
79
+ 5. In handler: do work (e.g., change colours/sprites), then `LDA $D019`/`STA $D019` to clear and `RTI`.
80
+
81
+ ## Image & Sprites
82
+
83
+ - Bitmap (hi-res): set `$D011` bit 5=1, `$D016` bit 5=0; point `$D018` to screen/bitmap; write bits into bitmap memory.
84
+ - Multicolour bitmap: also set `$D016` bit 5=1; use `$D022–$D024` and colour RAM per cell.
85
+ - Sprites: define 63-byte patterns; set sprite pointers at $07F8–$07FF; position with `$D000–$D00F`, enable with `$D015`.
86
+
87
+ ## Audio (SID)
88
+
89
+ The SID chip handles audio synthesis. For more information see `data/audio/sid-spec.md`.
90
+
91
+ Per voice (1..3; base offsets +0x07 per voice):
92
+
93
+ - FREQ LO/HI: $D400/$D401, $D407/$D408, $D40E/$D40F.
94
+ - PULSE LO/HI: $D402/$D403, $D409/$D40A, $D410/$D411.
95
+ - CONTROL: $D404, $D40B, $D412 (bit 0 GATE; 1 SYNC; 2 RING; 3 TEST; 4 TRI; 5 SAW; 6 PULSE; 7 NOISE).
96
+ - ADSR: $D405 (A hi-nibble, D lo-nibble), $D406 (S hi-nibble, R lo-nibble).
97
+
98
+ Filter/Master:
99
+
100
+ - Cutoff: $D415/$D416; resonance/voice routing: $D417; volume/filter mode: $D418 (low 4 bits volume 0–15; bits 4–7 filter + third-voice mute).
101
+
102
+ Making sound (basic):
103
+
104
+ 1. Set frequency ($D400/01).
105
+ 2. Set pulse width ($D402/03) if pulse.
106
+ 3. Set ADSR ($D405/06).
107
+ 4. Set waveform + GATE in CONTROL ($D404).
108
+ 5. Set master volume at $D418.
109
+
110
+ ## BASIC
111
+
112
+ Basic is used for simple programs and quick prototyping. It is very slow compared to assembly. For more information see `data/basic/basic-spec.md`.
113
+
114
+ - Program: numbered lines; end with `END` or stop on last line.
115
+ - Variables: A–Z (and arrays A()(numeric), A$() string); strings end with `$`.
116
+ - Assignment: `LET A=expr` (LET optional) | `A$="TEXT"`.
117
+ - I/O: `PRINT expr[,;expr...]` | `INPUT var` | `GET A$` | `OPEN ch,dev,sa,"name"` | `PRINT#ch,expr` | `CLOSE ch`.
118
+ - Control: `IF expr THEN <stmt|line>` | `GOTO n` | `GOSUB n` | `RETURN` | `FOR v=start TO end STEP s: ... : NEXT v` | `ON x GOTO l1,...` | `ON x GOSUB l1,...`.
119
+ - Data: `DATA v1,v2,...` | `READ var` | `RESTORE`.
120
+ - System: `POKE addr,val` | `PEEK(addr)` | `SYS addr` | `RUN` | `STOP` | `NEW`.
121
+ - Strings: `LEFT$(s,n)` `RIGHT$(s,n)` `MID$(s,p[,n])` `CHR$(n)` `ASC(s)` `LEN(s)`.
122
+ - Math: `+ - * / ^` | `ABS` `INT` `SGN` `SQR` `SIN` `COS` `TAN` `ATN` `RND([n])` `FRE(0)` `TI$`.
123
+ - Relational: `= <> < > <= >=` (boolean as -1/0).
124
+ - Remarks: `REM text` (tokens ignored till end of line).
125
+ - Example (print to printer device 4): `OPEN 4,4:PRINT#4,"HELLO":CLOSE 4`.
126
+
127
+ ## 6502/6510 Assembly
128
+
129
+ Assembly is used for maximum performance and control. For more information see `data/asssembly/assembly-spec.md`.
130
+
131
+ - Addressing modes: `#imm, zp, zp,X, zp,Y, abs, abs,X, abs,Y, (zp), (zp,X), (zp),Y, rel`.
132
+ - Key opcodes (full set):
133
+ - Load/Store: `LDA LDX LDY` / `STA STX STY`.
134
+ - ALU: `ADC SBC AND ORA EOR ASL LSR ROL ROR`.
135
+ - Inc/Dec: `INC INX INY DEC DEX DEY`.
136
+ - Compare/Bit: `CMP CPX CPY BIT`.
137
+ - Branch: `BCC BCS BEQ BMI BNE BPL BVC BVS`.
138
+ - Jump/Call: `JMP JSR RTS RTI`.
139
+ - Status: `CLC SEC CLI SEI CLD SED CLV NOP`.
140
+ - Stack: `PHA PHP PLA PLP TAX TXA TAY TYA TSX TXS BRK`.
141
+ - Directives (assembler used here): `.org/*=`, `.byte`, `.word`, `.text/.ascii`, `ds` (fill), labels `name:`.
142
+ - Interrupts: set IRQ vector at $0314/$0315 to your routine; acknowledge VIC-II IRQ by writing back bit to $D019.
143
+ - Example (border flash): write to `$D020` inside raster IRQ (`$D012`/`$D011`), mask `$D01A`, acknowledge `$D019`.
144
+
145
+ ## Context & RAG
146
+
147
+ - Layers: `data/context/bootstrap.md` → `AGENTS.md` → `.github/prompts/*.prompt.md` → `data/context/chat.md` → RAG docs (`doc/**/*.md`, `data/**/*.md`).
148
+ - Retrieval returns relevant chunks with provenance comments for transparency.
@@ -0,0 +1,36 @@
1
+ # Chat Policy
2
+
3
+ Behavioral norms for assistants across personas.
4
+
5
+ ## Style
6
+
7
+ - Be concise, technically precise, and skimmable.
8
+ - Use code blocks only for relevant snippets; include provenance comments when injecting source-derived text.
9
+ - Use backticks for file, directory, or function names; avoid bare URLs; prefer markdown links with descriptive text.
10
+
11
+ ## Temperature
12
+
13
+ - Default low temperature; prioritize determinism and repeatability.
14
+ - Escalate creativity slightly for SID composition and art prompts.
15
+
16
+ ## Safety & Device Handling
17
+
18
+ - Warn before potentially disruptive actions (reset, poweroff, drive ops) unless the action is explicitly requested by the user or clearly implied by the requested task (for example, write and run a program).
19
+ - Prefer dry runs where possible; confirm preconditions.
20
+ - Avoid long-lived processes; commands must terminate.
21
+
22
+ ## Provenance & Transparency
23
+
24
+ - When injecting templates or retrieved references, add comments like:
25
+ <!-- Source: .github/prompts/compose-song.prompt.md | Section: Compose Song -->
26
+ <!-- Source: data/audio/sid-spec.md -->
27
+ - Summarize which layers were used (primer/agent/prompt/policy/RAG) if it helps troubleshooting.
28
+
29
+ ## Formatting
30
+
31
+ - Use headings and bullet lists; keep responses short by default.
32
+ - Embed short code; avoid over-formatting.
33
+
34
+ ## Refusal Policy
35
+
36
+ - Refuse unsafe or destructive requests; suggest safe alternatives.