romdev-mcp 0.1.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.
Files changed (1247) hide show
  1. package/AGENTS.md +726 -0
  2. package/LICENSE +45 -0
  3. package/NOTICE +86 -0
  4. package/README.md +46 -0
  5. package/examples/README.md +36 -0
  6. package/examples/art-first-workflow/README.md +205 -0
  7. package/examples/atari2600/main.asm +143 -0
  8. package/examples/atari2600/templates/default.asm +183 -0
  9. package/examples/atari2600/templates/mini_invaders.asm +381 -0
  10. package/examples/atari2600/templates/music_demo.asm +322 -0
  11. package/examples/atari2600/templates/paddle.asm +345 -0
  12. package/examples/atari2600/templates/single_screen.asm +242 -0
  13. package/examples/atari7800/main.c +88 -0
  14. package/examples/atari7800/templates/default.c +183 -0
  15. package/examples/atari7800/templates/hello_sprite.c +141 -0
  16. package/examples/atari7800/templates/music_demo.c +123 -0
  17. package/examples/atari7800/templates/platformer.c +159 -0
  18. package/examples/atari7800/templates/puzzle.c +164 -0
  19. package/examples/atari7800/templates/racing.c +139 -0
  20. package/examples/atari7800/templates/shmup.c +148 -0
  21. package/examples/atari7800/templates/sports.c +207 -0
  22. package/examples/c64/main.c +63 -0
  23. package/examples/c64/templates/hello_sprite.c +117 -0
  24. package/examples/c64/templates/music_demo.c +131 -0
  25. package/examples/c64/templates/platformer.c +194 -0
  26. package/examples/c64/templates/puzzle.c +178 -0
  27. package/examples/c64/templates/racing.c +140 -0
  28. package/examples/c64/templates/shmup.c +201 -0
  29. package/examples/c64/templates/sports.c +109 -0
  30. package/examples/c64/templates/tile_engine.c +174 -0
  31. package/examples/gb/main.asm +106 -0
  32. package/examples/gb/main.c +49 -0
  33. package/examples/gb/templates/default.c +58 -0
  34. package/examples/gb/templates/hello_sprite.c +130 -0
  35. package/examples/gb/templates/music_demo.c +52 -0
  36. package/examples/gb/templates/platformer.c +178 -0
  37. package/examples/gb/templates/puzzle.c +217 -0
  38. package/examples/gb/templates/racing.c +158 -0
  39. package/examples/gb/templates/shmup.c +172 -0
  40. package/examples/gb/templates/sports.c +136 -0
  41. package/examples/gb/templates/tile_engine.c +280 -0
  42. package/examples/gba/templates/gba_hello.c +64 -0
  43. package/examples/gba/templates/maxmod_demo.c +105 -0
  44. package/examples/gba/templates/platformer.c +215 -0
  45. package/examples/gba/templates/puzzle.c +237 -0
  46. package/examples/gba/templates/racing.c +175 -0
  47. package/examples/gba/templates/shmup.c +197 -0
  48. package/examples/gba/templates/sports.c +177 -0
  49. package/examples/gba/templates/tonc_hello.c +72 -0
  50. package/examples/gba/templates/tonc_hello_sprite.c +109 -0
  51. package/examples/gbc/main.asm +123 -0
  52. package/examples/gbc/templates/default.c +61 -0
  53. package/examples/gbc/templates/hello_sprite.c +140 -0
  54. package/examples/gbc/templates/music_demo.c +63 -0
  55. package/examples/gbc/templates/platformer.c +181 -0
  56. package/examples/gbc/templates/puzzle.c +217 -0
  57. package/examples/gbc/templates/racing.c +164 -0
  58. package/examples/gbc/templates/shmup.c +188 -0
  59. package/examples/gbc/templates/sports.c +142 -0
  60. package/examples/gbc/templates/tile_engine.c +280 -0
  61. package/examples/genesis/main.s +161 -0
  62. package/examples/genesis/templates/hello_sprite.c +75 -0
  63. package/examples/genesis/templates/platformer.c +166 -0
  64. package/examples/genesis/templates/puzzle.c +240 -0
  65. package/examples/genesis/templates/racing.c +170 -0
  66. package/examples/genesis/templates/sgdk_hello.c +41 -0
  67. package/examples/genesis/templates/shmup.c +188 -0
  68. package/examples/genesis/templates/shmup_2p.c +244 -0
  69. package/examples/genesis/templates/sports.c +172 -0
  70. package/examples/genesis/templates/tile_engine.c +135 -0
  71. package/examples/genesis/templates/xgm2_demo.c +53 -0
  72. package/examples/genesis/templates/xgm2_demo_data.s +27 -0
  73. package/examples/gg/main.c +10 -0
  74. package/examples/gg/templates/default.c +156 -0
  75. package/examples/gg/templates/hello_sprite.c +90 -0
  76. package/examples/gg/templates/music_demo.c +156 -0
  77. package/examples/gg/templates/platformer.c +220 -0
  78. package/examples/gg/templates/puzzle.c +204 -0
  79. package/examples/gg/templates/racing.c +161 -0
  80. package/examples/gg/templates/shmup.c +188 -0
  81. package/examples/gg/templates/sports.c +137 -0
  82. package/examples/gg/templates/tile_engine.c +137 -0
  83. package/examples/lynx/main.c +4 -0
  84. package/examples/lynx/templates/default.c +41 -0
  85. package/examples/lynx/templates/hello_sprite.c +39 -0
  86. package/examples/lynx/templates/music_demo.c +37 -0
  87. package/examples/lynx/templates/platformer.c +72 -0
  88. package/examples/lynx/templates/puzzle.c +142 -0
  89. package/examples/lynx/templates/racing.c +94 -0
  90. package/examples/lynx/templates/shmup.c +132 -0
  91. package/examples/lynx/templates/sports.c +59 -0
  92. package/examples/nes/main.c +143 -0
  93. package/examples/nes/space-shooter/README.md +68 -0
  94. package/examples/nes/space-shooter/main.c +441 -0
  95. package/examples/nes/space-shooter/nes_runtime.c +347 -0
  96. package/examples/nes/space-shooter/nes_runtime.h +141 -0
  97. package/examples/nes/templates/default.c +41 -0
  98. package/examples/nes/templates/hello_sprite.c +104 -0
  99. package/examples/nes/templates/music_demo.c +80 -0
  100. package/examples/nes/templates/platformer.c +171 -0
  101. package/examples/nes/templates/puzzle.c +232 -0
  102. package/examples/nes/templates/racing.c +203 -0
  103. package/examples/nes/templates/shmup.c +228 -0
  104. package/examples/nes/templates/sports.c +205 -0
  105. package/examples/nes/templates/tile_engine.c +224 -0
  106. package/examples/porting-across-platforms/README.md +59 -0
  107. package/examples/sms/main.c +129 -0
  108. package/examples/sms/templates/default.c +110 -0
  109. package/examples/sms/templates/hello_sprite.c +90 -0
  110. package/examples/sms/templates/music_demo.c +151 -0
  111. package/examples/sms/templates/platformer.c +215 -0
  112. package/examples/sms/templates/puzzle.c +204 -0
  113. package/examples/sms/templates/racing.c +161 -0
  114. package/examples/sms/templates/shmup.c +167 -0
  115. package/examples/sms/templates/shmup_2p.c +219 -0
  116. package/examples/sms/templates/sports.c +147 -0
  117. package/examples/sms/templates/tile_engine.c +137 -0
  118. package/examples/snes/main.asm +70 -0
  119. package/examples/snes/templates/c-hello-data.asm +28 -0
  120. package/examples/snes/templates/c-hello.c +71 -0
  121. package/examples/snes/templates/default-data.asm +36 -0
  122. package/examples/snes/templates/default.c +74 -0
  123. package/examples/snes/templates/hello_sprite-data.asm +45 -0
  124. package/examples/snes/templates/hello_sprite.c +76 -0
  125. package/examples/snes/templates/music_demo-data.asm +20 -0
  126. package/examples/snes/templates/music_demo.c +83 -0
  127. package/examples/snes/templates/platformer-data.asm +27 -0
  128. package/examples/snes/templates/platformer.c +142 -0
  129. package/examples/snes/templates/puzzle-data.asm +14 -0
  130. package/examples/snes/templates/puzzle.c +199 -0
  131. package/examples/snes/templates/racing-data.asm +33 -0
  132. package/examples/snes/templates/racing.c +146 -0
  133. package/examples/snes/templates/shmup-data.asm +61 -0
  134. package/examples/snes/templates/shmup.c +199 -0
  135. package/examples/snes/templates/sports-data.asm +28 -0
  136. package/examples/snes/templates/sports.c +144 -0
  137. package/package.json +83 -0
  138. package/src/cli/smoke.js +283 -0
  139. package/src/cores/registry.js +95 -0
  140. package/src/host/LibretroHost.js +502 -0
  141. package/src/host/callbacks.js +444 -0
  142. package/src/host/chafa-render.js +170 -0
  143. package/src/host/coreLoader.js +57 -0
  144. package/src/host/cpu-state.js +422 -0
  145. package/src/host/dsp-state.js +188 -0
  146. package/src/host/framebuffer.js +115 -0
  147. package/src/host/gpgx-state.js +309 -0
  148. package/src/host/index.js +4 -0
  149. package/src/host/retroConstants.js +72 -0
  150. package/src/host/snes9x-state.js +35 -0
  151. package/src/host/types.js +280 -0
  152. package/src/mcp/disclosure.js +250 -0
  153. package/src/mcp/log.js +87 -0
  154. package/src/mcp/server.js +433 -0
  155. package/src/mcp/state.js +83 -0
  156. package/src/mcp/tools/address-to-symbol.js +151 -0
  157. package/src/mcp/tools/art-loaders.js +740 -0
  158. package/src/mcp/tools/assets.js +89 -0
  159. package/src/mcp/tools/audio.js +173 -0
  160. package/src/mcp/tools/cart-parts.js +649 -0
  161. package/src/mcp/tools/diff-roms.js +412 -0
  162. package/src/mcp/tools/disasm.js +980 -0
  163. package/src/mcp/tools/find-references.js +361 -0
  164. package/src/mcp/tools/font-map.js +353 -0
  165. package/src/mcp/tools/frame.js +249 -0
  166. package/src/mcp/tools/free-space.js +95 -0
  167. package/src/mcp/tools/index.js +351 -0
  168. package/src/mcp/tools/input-layout.js +215 -0
  169. package/src/mcp/tools/input.js +142 -0
  170. package/src/mcp/tools/lifecycle.js +110 -0
  171. package/src/mcp/tools/lospec.js +156 -0
  172. package/src/mcp/tools/memory.js +169 -0
  173. package/src/mcp/tools/metasprite-tools.js +261 -0
  174. package/src/mcp/tools/platform-docs.js +102 -0
  175. package/src/mcp/tools/platform-tools.js +1063 -0
  176. package/src/mcp/tools/platforms.js +86 -0
  177. package/src/mcp/tools/playtest.js +280 -0
  178. package/src/mcp/tools/preview-tile.js +360 -0
  179. package/src/mcp/tools/project.js +1885 -0
  180. package/src/mcp/tools/record.js +131 -0
  181. package/src/mcp/tools/rendering-context.js +700 -0
  182. package/src/mcp/tools/rom-id.js +256 -0
  183. package/src/mcp/tools/run-until.js +173 -0
  184. package/src/mcp/tools/snippets.js +235 -0
  185. package/src/mcp/tools/splice-chr.js +215 -0
  186. package/src/mcp/tools/sprite-pipeline.js +614 -0
  187. package/src/mcp/tools/state.js +99 -0
  188. package/src/mcp/tools/symbols.js +277 -0
  189. package/src/mcp/tools/tile-inspect.js +206 -0
  190. package/src/mcp/tools/toolchain.js +680 -0
  191. package/src/mcp/tools/watch-memory.js +212 -0
  192. package/src/mcp/tools/which-tiles.js +193 -0
  193. package/src/mcp/util.js +85 -0
  194. package/src/observer/bus.js +127 -0
  195. package/src/observer/livestream.html +589 -0
  196. package/src/observer/server.js +66 -0
  197. package/src/observer/tool-wrap.js +115 -0
  198. package/src/platforms/atari2600/MENTAL_MODEL.md +185 -0
  199. package/src/platforms/atari2600/TROUBLESHOOTING.md +155 -0
  200. package/src/platforms/atari2600/UPSTREAM_SOURCES.md +49 -0
  201. package/src/platforms/atari2600/lib/README.md +67 -0
  202. package/src/platforms/atari2600/lib/cc65-src/crt0.s +49 -0
  203. package/src/platforms/atari2600/lib/cc65-src/ctype.s +5 -0
  204. package/src/platforms/atari2600/lib/kernel_skeleton.asm +85 -0
  205. package/src/platforms/atari2600/lib/player_kernel.asm +87 -0
  206. package/src/platforms/atari2600/lib/playfield_kernel.asm +63 -0
  207. package/src/platforms/atari2600/lib/read_joystick.asm +76 -0
  208. package/src/platforms/atari2600/lib/score_kernel.asm +141 -0
  209. package/src/platforms/atari2600/lib/vcs_constants.h +97 -0
  210. package/src/platforms/atari2600/lib/vectors.asm +16 -0
  211. package/src/platforms/atari2600/tia.js +355 -0
  212. package/src/platforms/atari7800/MENTAL_MODEL.md +306 -0
  213. package/src/platforms/atari7800/TROUBLESHOOTING.md +195 -0
  214. package/src/platforms/atari7800/UPSTREAM_SOURCES.md +43 -0
  215. package/src/platforms/atari7800/lib/README.md +45 -0
  216. package/src/platforms/atari7800/lib/c/atari7800_music.c +215 -0
  217. package/src/platforms/atari7800/lib/c/atari7800_music.h +33 -0
  218. package/src/platforms/atari7800/lib/c/atari7800_sfx.c +74 -0
  219. package/src/platforms/atari7800/lib/c/atari7800_sfx.h +45 -0
  220. package/src/platforms/atari7800/lib/cc65-src/clock.s +69 -0
  221. package/src/platforms/atari7800/lib/cc65-src/clocks_per_sec.s +34 -0
  222. package/src/platforms/atari7800/lib/cc65-src/clrscr.s +27 -0
  223. package/src/platforms/atari7800/lib/cc65-src/conio.s +226 -0
  224. package/src/platforms/atari7800/lib/cc65-src/conio_font.s +278 -0
  225. package/src/platforms/atari7800/lib/cc65-src/cputc.s +139 -0
  226. package/src/platforms/atari7800/lib/cc65-src/crt0.s +71 -0
  227. package/src/platforms/atari7800/lib/cc65-src/ctype.s +5 -0
  228. package/src/platforms/atari7800/lib/cc65-src/exehdr.s +46 -0
  229. package/src/platforms/atari7800/lib/cc65-src/extra/mono.s +28 -0
  230. package/src/platforms/atari7800/lib/cc65-src/extzp.inc +15 -0
  231. package/src/platforms/atari7800/lib/cc65-src/extzp.s +15 -0
  232. package/src/platforms/atari7800/lib/cc65-src/get_tv.s +65 -0
  233. package/src/platforms/atari7800/lib/cc65-src/irq.s +36 -0
  234. package/src/platforms/atari7800/lib/cc65-src/joy/atari7800-stdjoy.s +197 -0
  235. package/src/platforms/atari7800/lib/cc65-src/joy_stat_stddrv.s +14 -0
  236. package/src/platforms/atari7800/lib/cc65-src/libref.s +8 -0
  237. package/src/platforms/atari7800/lib/cc65-src/mono_clrscr.s +27 -0
  238. package/src/platforms/atari7800/lib/cc65-src/mono_conio.s +231 -0
  239. package/src/platforms/atari7800/lib/cc65-src/mono_cputc.s +102 -0
  240. package/src/platforms/atari7800/lib/cc65-src/mono_font.s +2065 -0
  241. package/src/platforms/atari7800/lib/cc65-src/mono_setcursor.s +214 -0
  242. package/src/platforms/atari7800/lib/cc65-src/setcursor.s +214 -0
  243. package/src/platforms/atari7800/lib/cc65-src/textcolor.s +53 -0
  244. package/src/platforms/atari7800/lib/cc65-src/wherex.s +19 -0
  245. package/src/platforms/atari7800/lib/cc65-src/wherey.s +19 -0
  246. package/src/platforms/atari7800/lib/display_list.asm +53 -0
  247. package/src/platforms/atari7800/lib/maria_init.asm +48 -0
  248. package/src/platforms/atari7800/lib/maria_registers.h +61 -0
  249. package/src/platforms/atari7800/lib/palette_load.asm +53 -0
  250. package/src/platforms/atari7800/lib/read_pad.asm +57 -0
  251. package/src/platforms/atari7800/lib/vblank_wait.asm +16 -0
  252. package/src/platforms/atari7800/maria.js +220 -0
  253. package/src/platforms/c64/MENTAL_MODEL.md +175 -0
  254. package/src/platforms/c64/TROUBLESHOOTING.md +130 -0
  255. package/src/platforms/c64/UPSTREAM_SOURCES.md +35 -0
  256. package/src/platforms/c64/image-to-tilemap.js +190 -0
  257. package/src/platforms/c64/lib/README.md +52 -0
  258. package/src/platforms/c64/lib/basic_stub.s +25 -0
  259. package/src/platforms/c64/lib/c/c64_music.c +248 -0
  260. package/src/platforms/c64/lib/c/c64_music.h +36 -0
  261. package/src/platforms/c64/lib/c/c64_sfx.c +94 -0
  262. package/src/platforms/c64/lib/c/c64_sfx.h +37 -0
  263. package/src/platforms/c64/lib/c64_registers.h +108 -0
  264. package/src/platforms/c64/lib/cc65-src/_scrsize.s +12 -0
  265. package/src/platforms/c64/lib/cc65-src/acc_c128_speed.s +5 -0
  266. package/src/platforms/c64/lib/cc65-src/acc_c64dtv_speed.s +64 -0
  267. package/src/platforms/c64/lib/cc65-src/acc_c65_speed.s +69 -0
  268. package/src/platforms/c64/lib/cc65-src/acc_chameleon_speed.s +100 -0
  269. package/src/platforms/c64/lib/cc65-src/acc_detect_c128.s +33 -0
  270. package/src/platforms/c64/lib/cc65-src/acc_detect_c64dtv.s +44 -0
  271. package/src/platforms/c64/lib/cc65-src/acc_detect_c65.s +55 -0
  272. package/src/platforms/c64/lib/cc65-src/acc_detect_chameleon.s +39 -0
  273. package/src/platforms/c64/lib/cc65-src/acc_detect_scpu.s +34 -0
  274. package/src/platforms/c64/lib/cc65-src/acc_detect_turbomaster.s +45 -0
  275. package/src/platforms/c64/lib/cc65-src/acc_scpu_speed.s +59 -0
  276. package/src/platforms/c64/lib/cc65-src/acc_turbomaster_speed.s +56 -0
  277. package/src/platforms/c64/lib/cc65-src/bordercolor.s +17 -0
  278. package/src/platforms/c64/lib/cc65-src/break.s +108 -0
  279. package/src/platforms/c64/lib/cc65-src/cgetc.s +62 -0
  280. package/src/platforms/c64/lib/cc65-src/clrscr.s +11 -0
  281. package/src/platforms/c64/lib/cc65-src/color.s +24 -0
  282. package/src/platforms/c64/lib/cc65-src/conio.s +10 -0
  283. package/src/platforms/c64/lib/cc65-src/cputc.s +105 -0
  284. package/src/platforms/c64/lib/cc65-src/crt0.s +117 -0
  285. package/src/platforms/c64/lib/cc65-src/devnum.s +7 -0
  286. package/src/platforms/c64/lib/cc65-src/emd/c64-65816.s +377 -0
  287. package/src/platforms/c64/lib/cc65-src/emd/c64-c256k.s +508 -0
  288. package/src/platforms/c64/lib/cc65-src/emd/c64-dqbb.s +447 -0
  289. package/src/platforms/c64/lib/cc65-src/emd/c64-georam.s +355 -0
  290. package/src/platforms/c64/lib/cc65-src/emd/c64-isepic.s +276 -0
  291. package/src/platforms/c64/lib/cc65-src/emd/c64-kerberos.s +281 -0
  292. package/src/platforms/c64/lib/cc65-src/emd/c64-ram.s +270 -0
  293. package/src/platforms/c64/lib/cc65-src/emd/c64-ramcart.s +297 -0
  294. package/src/platforms/c64/lib/cc65-src/emd/c64-reu.s +286 -0
  295. package/src/platforms/c64/lib/cc65-src/emd/c64-rrr.s +363 -0
  296. package/src/platforms/c64/lib/cc65-src/emd/c64-vdc.s +405 -0
  297. package/src/platforms/c64/lib/cc65-src/emd/dtv-himem.s +251 -0
  298. package/src/platforms/c64/lib/cc65-src/extra/soft80.s +71 -0
  299. package/src/platforms/c64/lib/cc65-src/extra/soft80mono.s +74 -0
  300. package/src/platforms/c64/lib/cc65-src/extra/tgimousedata.s +21 -0
  301. package/src/platforms/c64/lib/cc65-src/get_ostype.s +43 -0
  302. package/src/platforms/c64/lib/cc65-src/get_tv.s +20 -0
  303. package/src/platforms/c64/lib/cc65-src/gettime.s +83 -0
  304. package/src/platforms/c64/lib/cc65-src/irq.s +49 -0
  305. package/src/platforms/c64/lib/cc65-src/joy/c64-hitjoy.s +218 -0
  306. package/src/platforms/c64/lib/cc65-src/joy/c64-numpad.s +155 -0
  307. package/src/platforms/c64/lib/cc65-src/joy/c64-ptvjoy.s +146 -0
  308. package/src/platforms/c64/lib/cc65-src/joy/c64-stdjoy.s +111 -0
  309. package/src/platforms/c64/lib/cc65-src/joy_stat_stddrv.s +14 -0
  310. package/src/platforms/c64/lib/cc65-src/joy_stddrv.s +14 -0
  311. package/src/platforms/c64/lib/cc65-src/kbhit.s +23 -0
  312. package/src/platforms/c64/lib/cc65-src/kbrepeat.s +14 -0
  313. package/src/platforms/c64/lib/cc65-src/kernal.s +53 -0
  314. package/src/platforms/c64/lib/cc65-src/kplot.s +22 -0
  315. package/src/platforms/c64/lib/cc65-src/libref.s +16 -0
  316. package/src/platforms/c64/lib/cc65-src/mainargs.s +137 -0
  317. package/src/platforms/c64/lib/cc65-src/mcbdefault.s +146 -0
  318. package/src/platforms/c64/lib/cc65-src/mcbspritedata.s +4 -0
  319. package/src/platforms/c64/lib/cc65-src/mou/c64-1351.s +467 -0
  320. package/src/platforms/c64/lib/cc65-src/mou/c64-inkwell.s +446 -0
  321. package/src/platforms/c64/lib/cc65-src/mou/c64-joy.s +451 -0
  322. package/src/platforms/c64/lib/cc65-src/mou/c64-pot.s +409 -0
  323. package/src/platforms/c64/lib/cc65-src/mouse_stat_stddrv.s +14 -0
  324. package/src/platforms/c64/lib/cc65-src/mouse_stddrv.s +14 -0
  325. package/src/platforms/c64/lib/cc65-src/mouseref.s +23 -0
  326. package/src/platforms/c64/lib/cc65-src/pencalib.c +94 -0
  327. package/src/platforms/c64/lib/cc65-src/randomize.s +18 -0
  328. package/src/platforms/c64/lib/cc65-src/revers.s +27 -0
  329. package/src/platforms/c64/lib/cc65-src/ser/c64-swlink.s +484 -0
  330. package/src/platforms/c64/lib/cc65-src/ser_stat_stddrv.s +14 -0
  331. package/src/platforms/c64/lib/cc65-src/ser_stddrv.s +13 -0
  332. package/src/platforms/c64/lib/cc65-src/settime.s +84 -0
  333. package/src/platforms/c64/lib/cc65-src/soft80.inc +46 -0
  334. package/src/platforms/c64/lib/cc65-src/soft80_cgetc.s +85 -0
  335. package/src/platforms/c64/lib/cc65-src/soft80_charset.s +182 -0
  336. package/src/platforms/c64/lib/cc65-src/soft80_color.s +159 -0
  337. package/src/platforms/c64/lib/cc65-src/soft80_conio.s +157 -0
  338. package/src/platforms/c64/lib/cc65-src/soft80_cpeekc.s +148 -0
  339. package/src/platforms/c64/lib/cc65-src/soft80_cpeekcolor.s +19 -0
  340. package/src/platforms/c64/lib/cc65-src/soft80_cpeekrevers.s +15 -0
  341. package/src/platforms/c64/lib/cc65-src/soft80_cpeeks.s +71 -0
  342. package/src/platforms/c64/lib/cc65-src/soft80_cputc.s +521 -0
  343. package/src/platforms/c64/lib/cc65-src/soft80_kclrscr.s +76 -0
  344. package/src/platforms/c64/lib/cc65-src/soft80_kplot.s +63 -0
  345. package/src/platforms/c64/lib/cc65-src/soft80_scrsize.s +14 -0
  346. package/src/platforms/c64/lib/cc65-src/soft80mono_cgetc.s +67 -0
  347. package/src/platforms/c64/lib/cc65-src/soft80mono_color.s +65 -0
  348. package/src/platforms/c64/lib/cc65-src/soft80mono_conio.s +168 -0
  349. package/src/platforms/c64/lib/cc65-src/soft80mono_cpeekcolor.s +17 -0
  350. package/src/platforms/c64/lib/cc65-src/soft80mono_cputc.s +204 -0
  351. package/src/platforms/c64/lib/cc65-src/soft80mono_kclrscr.s +63 -0
  352. package/src/platforms/c64/lib/cc65-src/soft80mono_kplot.s +52 -0
  353. package/src/platforms/c64/lib/cc65-src/status.s +15 -0
  354. package/src/platforms/c64/lib/cc65-src/sysuname.s +37 -0
  355. package/src/platforms/c64/lib/cc65-src/tgi/c64-hi.s +881 -0
  356. package/src/platforms/c64/lib/cc65-src/tgi_stat_stddrv.s +14 -0
  357. package/src/platforms/c64/lib/cc65-src/tgi_stddrv.s +13 -0
  358. package/src/platforms/c64/lib/cc65-src/tmcommon.s +67 -0
  359. package/src/platforms/c64/lib/cc65-src/waitvsync.s +18 -0
  360. package/src/platforms/c64/lib/read_joystick.s +28 -0
  361. package/src/platforms/c64/lib/sid_play.s +48 -0
  362. package/src/platforms/c64/lib/sprite_table.s +73 -0
  363. package/src/platforms/c64/lib/vic_init.s +47 -0
  364. package/src/platforms/c64/sid.js +128 -0
  365. package/src/platforms/c64/vic.js +273 -0
  366. package/src/platforms/common/default-palette.js +139 -0
  367. package/src/platforms/common/image-to-tiles.js +407 -0
  368. package/src/platforms/common/intent.js +111 -0
  369. package/src/platforms/common/metasprite-adapters.js +279 -0
  370. package/src/platforms/common/metasprite-codegen.js +192 -0
  371. package/src/platforms/common/metasprite-core.js +201 -0
  372. package/src/platforms/common/metasprite.js +89 -0
  373. package/src/platforms/common/platform-palette.js +137 -0
  374. package/src/platforms/common/registers.js +329 -0
  375. package/src/platforms/common/render-tiles.js +86 -0
  376. package/src/platforms/common/screenshot-sprite.js +153 -0
  377. package/src/platforms/common/tile-decode.js +149 -0
  378. package/src/platforms/gb/MENTAL_MODEL.md +252 -0
  379. package/src/platforms/gb/TROUBLESHOOTING.md +221 -0
  380. package/src/platforms/gb/UPSTREAM_SOURCES.md +43 -0
  381. package/src/platforms/gb/image-to-tilemap.js +173 -0
  382. package/src/platforms/gb/lib/README.md +115 -0
  383. package/src/platforms/gb/lib/c/LICENSE-HUGEDRIVER +25 -0
  384. package/src/platforms/gb/lib/c/README.md +120 -0
  385. package/src/platforms/gb/lib/c/SDCC_GOTCHAS.md +189 -0
  386. package/src/platforms/gb/lib/c/gb_crt0.s +163 -0
  387. package/src/platforms/gb/lib/c/gb_hardware.h +113 -0
  388. package/src/platforms/gb/lib/c/gb_runtime.c +284 -0
  389. package/src/platforms/gb/lib/c/gb_runtime.h +145 -0
  390. package/src/platforms/gb/lib/c/hUGEDriver.c +191 -0
  391. package/src/platforms/gb/lib/c/hUGEDriver.h +95 -0
  392. package/src/platforms/gb/lib/c/hUGEDriver.upstream.asm +1908 -0
  393. package/src/platforms/gb/lib/c/lcd_init.c +19 -0
  394. package/src/platforms/gb/lib/c/patch-header.js +154 -0
  395. package/src/platforms/gb/lib/c/song_data.c +88 -0
  396. package/src/platforms/gb/lib/c/unroll.h +52 -0
  397. package/src/platforms/gb/lib/c/wait_vblank.c +14 -0
  398. package/src/platforms/gb/lib/dma_oam.asm +51 -0
  399. package/src/platforms/gb/lib/header.asm +56 -0
  400. package/src/platforms/gb/lib/joypad_read.asm +47 -0
  401. package/src/platforms/gb/lib/lcd_init.asm +44 -0
  402. package/src/platforms/gb/lib/load_palette.asm +25 -0
  403. package/src/platforms/gb/lib/load_tiles.asm +29 -0
  404. package/src/platforms/gb/lib/vblank_wait.asm +31 -0
  405. package/src/platforms/gb/ppu.js +574 -0
  406. package/src/platforms/gba/MENTAL_MODEL.md +203 -0
  407. package/src/platforms/gba/TROUBLESHOOTING.md +250 -0
  408. package/src/platforms/gba/UPSTREAM_SOURCES.md +41 -0
  409. package/src/platforms/gba/lib/arm-archives/libc.a +0 -0
  410. package/src/platforms/gba/lib/arm-archives/libgcc.a +0 -0
  411. package/src/platforms/gba/lib/arm-archives/libnosys.a +0 -0
  412. package/src/platforms/gba/lib/c/gba_sfx.c +81 -0
  413. package/src/platforms/gba/lib/c/gba_sfx.h +48 -0
  414. package/src/platforms/gba/lib/libgba/crtbegin.o +0 -0
  415. package/src/platforms/gba/lib/libgba/crtend.o +0 -0
  416. package/src/platforms/gba/lib/libgba/crti.o +0 -0
  417. package/src/platforms/gba/lib/libgba/crtn.o +0 -0
  418. package/src/platforms/gba/lib/libgba/gba_cart.ld +319 -0
  419. package/src/platforms/gba/lib/libgba/gba_crt0.s +258 -0
  420. package/src/platforms/gba/lib/libgba/include/BoyScout.h +128 -0
  421. package/src/platforms/gba/lib/libgba/include/disc.h +36 -0
  422. package/src/platforms/gba/lib/libgba/include/disc_io.h +64 -0
  423. package/src/platforms/gba/lib/libgba/include/dldi.h +112 -0
  424. package/src/platforms/gba/lib/libgba/include/erapi.h +195 -0
  425. package/src/platforms/gba/lib/libgba/include/fade.h +76 -0
  426. package/src/platforms/gba/lib/libgba/include/gba.h +47 -0
  427. package/src/platforms/gba/lib/libgba/include/gba_affine.h +83 -0
  428. package/src/platforms/gba/lib/libgba/include/gba_base.h +122 -0
  429. package/src/platforms/gba/lib/libgba/include/gba_compression.h +66 -0
  430. package/src/platforms/gba/lib/libgba/include/gba_console.h +55 -0
  431. package/src/platforms/gba/lib/libgba/include/gba_dma.h +100 -0
  432. package/src/platforms/gba/lib/libgba/include/gba_input.h +127 -0
  433. package/src/platforms/gba/lib/libgba/include/gba_interrupt.h +146 -0
  434. package/src/platforms/gba/lib/libgba/include/gba_multiboot.h +72 -0
  435. package/src/platforms/gba/lib/libgba/include/gba_sio.h +124 -0
  436. package/src/platforms/gba/lib/libgba/include/gba_sound.h +356 -0
  437. package/src/platforms/gba/lib/libgba/include/gba_sprites.h +195 -0
  438. package/src/platforms/gba/lib/libgba/include/gba_systemcalls.h +194 -0
  439. package/src/platforms/gba/lib/libgba/include/gba_timers.h +63 -0
  440. package/src/platforms/gba/lib/libgba/include/gba_types.h +60 -0
  441. package/src/platforms/gba/lib/libgba/include/gba_video.h +307 -0
  442. package/src/platforms/gba/lib/libgba/include/mappy.h +72 -0
  443. package/src/platforms/gba/lib/libgba/include/mbv2.h +90 -0
  444. package/src/platforms/gba/lib/libgba/include/xcomms.h +93 -0
  445. package/src/platforms/gba/lib/libgba/include/xcomms_cmd.h +53 -0
  446. package/src/platforms/gba/lib/libgba/libgba.seed.a +0 -0
  447. package/src/platforms/gba/lib/libgba/libgba.seed.hash +1 -0
  448. package/src/platforms/gba/lib/libgba/src/AffineSet.c +42 -0
  449. package/src/platforms/gba/lib/libgba/src/ArcTan.s +41 -0
  450. package/src/platforms/gba/lib/libgba/src/BoyScout/BoyScout.c +1242 -0
  451. package/src/platforms/gba/lib/libgba/src/BoyScout/GBASoundRegs.h +200 -0
  452. package/src/platforms/gba/lib/libgba/src/Compression.c +84 -0
  453. package/src/platforms/gba/lib/libgba/src/CpuSet.c +41 -0
  454. package/src/platforms/gba/lib/libgba/src/Div.s +58 -0
  455. package/src/platforms/gba/lib/libgba/src/DivArm.s +50 -0
  456. package/src/platforms/gba/lib/libgba/src/InterruptDispatcher.s +113 -0
  457. package/src/platforms/gba/lib/libgba/src/IntrWait.c +35 -0
  458. package/src/platforms/gba/lib/libgba/src/MultiBoot.s +33 -0
  459. package/src/platforms/gba/lib/libgba/src/Reset.s +49 -0
  460. package/src/platforms/gba/lib/libgba/src/Sound.s +48 -0
  461. package/src/platforms/gba/lib/libgba/src/Sqrt.s +34 -0
  462. package/src/platforms/gba/lib/libgba/src/disc_io/disc.c +58 -0
  463. package/src/platforms/gba/lib/libgba/src/disc_io/dldi.c +189 -0
  464. package/src/platforms/gba/lib/libgba/src/disc_io/dldi_stub.s +78 -0
  465. package/src/platforms/gba/lib/libgba/src/disc_io/io_cf_common.c +260 -0
  466. package/src/platforms/gba/lib/libgba/src/disc_io/io_cf_common.h +72 -0
  467. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3_common.c +60 -0
  468. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3_common.h +48 -0
  469. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3cf.c +83 -0
  470. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3cf.h +45 -0
  471. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3sd.c +508 -0
  472. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3sd.h +45 -0
  473. package/src/platforms/gba/lib/libgba/src/disc_io/io_mpcf.c +87 -0
  474. package/src/platforms/gba/lib/libgba/src/disc_io/io_mpcf.h +42 -0
  475. package/src/platforms/gba/lib/libgba/src/disc_io/io_sc_common.c +47 -0
  476. package/src/platforms/gba/lib/libgba/src/disc_io/io_sc_common.h +43 -0
  477. package/src/platforms/gba/lib/libgba/src/disc_io/io_sccf.c +83 -0
  478. package/src/platforms/gba/lib/libgba/src/disc_io/io_sccf.h +45 -0
  479. package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd.c +385 -0
  480. package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd.h +48 -0
  481. package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd_s.s +139 -0
  482. package/src/platforms/gba/lib/libgba/src/disc_io/io_sd_common.c +203 -0
  483. package/src/platforms/gba/lib/libgba/src/disc_io/io_sd_common.h +108 -0
  484. package/src/platforms/gba/lib/libgba/src/fade.c +185 -0
  485. package/src/platforms/gba/lib/libgba/src/input.c +127 -0
  486. package/src/platforms/gba/lib/libgba/src/interrupt.c +116 -0
  487. package/src/platforms/gba/lib/libgba/src/mappy_print.c +74 -0
  488. package/src/platforms/gba/lib/libgba/src/mb2print.c +69 -0
  489. package/src/platforms/gba/lib/libgba/src/mbv2.c +230 -0
  490. package/src/platforms/gba/lib/libgba/src/mbv2.txt +119 -0
  491. package/src/platforms/gba/lib/libgba/src/xcomms.c +203 -0
  492. package/src/platforms/gba/lib/libgba/src/xcomms_print.c +56 -0
  493. package/src/platforms/gba/lib/libgba/sysinclude/_ansi.h +82 -0
  494. package/src/platforms/gba/lib/libgba/sysinclude/_newlib_version.h +11 -0
  495. package/src/platforms/gba/lib/libgba/sysinclude/_syslist.h +41 -0
  496. package/src/platforms/gba/lib/libgba/sysinclude/alloca.h +21 -0
  497. package/src/platforms/gba/lib/libgba/sysinclude/ar.h +65 -0
  498. package/src/platforms/gba/lib/libgba/sysinclude/argz.h +33 -0
  499. package/src/platforms/gba/lib/libgba/sysinclude/assert.h +50 -0
  500. package/src/platforms/gba/lib/libgba/sysinclude/complex.h +150 -0
  501. package/src/platforms/gba/lib/libgba/sysinclude/cpio.h +30 -0
  502. package/src/platforms/gba/lib/libgba/sysinclude/ctype.h +183 -0
  503. package/src/platforms/gba/lib/libgba/sysinclude/devctl.h +78 -0
  504. package/src/platforms/gba/lib/libgba/sysinclude/dirent.h +85 -0
  505. package/src/platforms/gba/lib/libgba/sysinclude/elf.h +3147 -0
  506. package/src/platforms/gba/lib/libgba/sysinclude/envlock.h +15 -0
  507. package/src/platforms/gba/lib/libgba/sysinclude/envz.h +16 -0
  508. package/src/platforms/gba/lib/libgba/sysinclude/errno.h +11 -0
  509. package/src/platforms/gba/lib/libgba/sysinclude/fastmath.h +13 -0
  510. package/src/platforms/gba/lib/libgba/sysinclude/fcntl.h +1 -0
  511. package/src/platforms/gba/lib/libgba/sysinclude/fenv.h +42 -0
  512. package/src/platforms/gba/lib/libgba/sysinclude/float.h +631 -0
  513. package/src/platforms/gba/lib/libgba/sysinclude/fnmatch.h +55 -0
  514. package/src/platforms/gba/lib/libgba/sysinclude/ftw.h +66 -0
  515. package/src/platforms/gba/lib/libgba/sysinclude/getopt.h +185 -0
  516. package/src/platforms/gba/lib/libgba/sysinclude/glob.h +90 -0
  517. package/src/platforms/gba/lib/libgba/sysinclude/grp.h +86 -0
  518. package/src/platforms/gba/lib/libgba/sysinclude/iconv.h +63 -0
  519. package/src/platforms/gba/lib/libgba/sysinclude/ieeefp.h +295 -0
  520. package/src/platforms/gba/lib/libgba/sysinclude/inttypes.h +345 -0
  521. package/src/platforms/gba/lib/libgba/sysinclude/iso646.h +45 -0
  522. package/src/platforms/gba/lib/libgba/sysinclude/langinfo.h +332 -0
  523. package/src/platforms/gba/lib/libgba/sysinclude/libgen.h +37 -0
  524. package/src/platforms/gba/lib/libgba/sysinclude/limits.h +168 -0
  525. package/src/platforms/gba/lib/libgba/sysinclude/locale.h +96 -0
  526. package/src/platforms/gba/lib/libgba/sysinclude/machine/_arc4random.h +1 -0
  527. package/src/platforms/gba/lib/libgba/sysinclude/machine/_default_types.h +250 -0
  528. package/src/platforms/gba/lib/libgba/sysinclude/machine/_endian.h +39 -0
  529. package/src/platforms/gba/lib/libgba/sysinclude/machine/_time.h +3 -0
  530. package/src/platforms/gba/lib/libgba/sysinclude/machine/_types.h +8 -0
  531. package/src/platforms/gba/lib/libgba/sysinclude/machine/ansi.h +1 -0
  532. package/src/platforms/gba/lib/libgba/sysinclude/machine/endian.h +69 -0
  533. package/src/platforms/gba/lib/libgba/sysinclude/machine/fastmath.h +98 -0
  534. package/src/platforms/gba/lib/libgba/sysinclude/machine/ieee.h +127 -0
  535. package/src/platforms/gba/lib/libgba/sysinclude/machine/ieeefp.h +533 -0
  536. package/src/platforms/gba/lib/libgba/sysinclude/machine/malloc.h +8 -0
  537. package/src/platforms/gba/lib/libgba/sysinclude/machine/param.h +8 -0
  538. package/src/platforms/gba/lib/libgba/sysinclude/machine/setjmp-dj.h +43 -0
  539. package/src/platforms/gba/lib/libgba/sysinclude/machine/setjmp.h +524 -0
  540. package/src/platforms/gba/lib/libgba/sysinclude/machine/stdlib.h +8 -0
  541. package/src/platforms/gba/lib/libgba/sysinclude/machine/termios.h +1 -0
  542. package/src/platforms/gba/lib/libgba/sysinclude/machine/time.h +15 -0
  543. package/src/platforms/gba/lib/libgba/sysinclude/machine/types.h +13 -0
  544. package/src/platforms/gba/lib/libgba/sysinclude/malloc.h +173 -0
  545. package/src/platforms/gba/lib/libgba/sysinclude/math.h +645 -0
  546. package/src/platforms/gba/lib/libgba/sysinclude/memory.h +4 -0
  547. package/src/platforms/gba/lib/libgba/sysinclude/ndbm.h +91 -0
  548. package/src/platforms/gba/lib/libgba/sysinclude/newlib.h +427 -0
  549. package/src/platforms/gba/lib/libgba/sysinclude/paths.h +9 -0
  550. package/src/platforms/gba/lib/libgba/sysinclude/pthread.h +456 -0
  551. package/src/platforms/gba/lib/libgba/sysinclude/pwd.h +83 -0
  552. package/src/platforms/gba/lib/libgba/sysinclude/reent.h +190 -0
  553. package/src/platforms/gba/lib/libgba/sysinclude/regdef.h +7 -0
  554. package/src/platforms/gba/lib/libgba/sysinclude/regex.h +103 -0
  555. package/src/platforms/gba/lib/libgba/sysinclude/sched.h +112 -0
  556. package/src/platforms/gba/lib/libgba/sysinclude/search.h +64 -0
  557. package/src/platforms/gba/lib/libgba/sysinclude/setjmp.h +25 -0
  558. package/src/platforms/gba/lib/libgba/sysinclude/signal.h +35 -0
  559. package/src/platforms/gba/lib/libgba/sysinclude/spawn.h +111 -0
  560. package/src/platforms/gba/lib/libgba/sysinclude/ssp/ssp.h +76 -0
  561. package/src/platforms/gba/lib/libgba/sysinclude/ssp/stdio.h +101 -0
  562. package/src/platforms/gba/lib/libgba/sysinclude/ssp/stdlib.h +30 -0
  563. package/src/platforms/gba/lib/libgba/sysinclude/ssp/string.h +115 -0
  564. package/src/platforms/gba/lib/libgba/sysinclude/ssp/strings.h +55 -0
  565. package/src/platforms/gba/lib/libgba/sysinclude/ssp/unistd.h +93 -0
  566. package/src/platforms/gba/lib/libgba/sysinclude/ssp/wchar.h +97 -0
  567. package/src/platforms/gba/lib/libgba/sysinclude/stdarg.h +135 -0
  568. package/src/platforms/gba/lib/libgba/sysinclude/stdatomic.h +409 -0
  569. package/src/platforms/gba/lib/libgba/sysinclude/stdbool.h +51 -0
  570. package/src/platforms/gba/lib/libgba/sysinclude/stddef.h +463 -0
  571. package/src/platforms/gba/lib/libgba/sysinclude/stdint.h +466 -0
  572. package/src/platforms/gba/lib/libgba/sysinclude/stdio.h +807 -0
  573. package/src/platforms/gba/lib/libgba/sysinclude/stdio_ext.h +79 -0
  574. package/src/platforms/gba/lib/libgba/sysinclude/stdlib.h +345 -0
  575. package/src/platforms/gba/lib/libgba/sysinclude/string.h +183 -0
  576. package/src/platforms/gba/lib/libgba/sysinclude/strings.h +80 -0
  577. package/src/platforms/gba/lib/libgba/sysinclude/sys/_default_fcntl.h +241 -0
  578. package/src/platforms/gba/lib/libgba/sysinclude/sys/_intsup.h +199 -0
  579. package/src/platforms/gba/lib/libgba/sysinclude/sys/_locale.h +12 -0
  580. package/src/platforms/gba/lib/libgba/sysinclude/sys/_pthreadtypes.h +233 -0
  581. package/src/platforms/gba/lib/libgba/sysinclude/sys/_sigset.h +43 -0
  582. package/src/platforms/gba/lib/libgba/sysinclude/sys/_stdint.h +90 -0
  583. package/src/platforms/gba/lib/libgba/sysinclude/sys/_timespec.h +52 -0
  584. package/src/platforms/gba/lib/libgba/sysinclude/sys/_timeval.h +60 -0
  585. package/src/platforms/gba/lib/libgba/sysinclude/sys/_types.h +228 -0
  586. package/src/platforms/gba/lib/libgba/sysinclude/sys/_tz_structs.h +24 -0
  587. package/src/platforms/gba/lib/libgba/sysinclude/sys/cdefs.h +754 -0
  588. package/src/platforms/gba/lib/libgba/sysinclude/sys/config.h +314 -0
  589. package/src/platforms/gba/lib/libgba/sysinclude/sys/custom_file.h +2 -0
  590. package/src/platforms/gba/lib/libgba/sysinclude/sys/dir.h +10 -0
  591. package/src/platforms/gba/lib/libgba/sysinclude/sys/dirent.h +13 -0
  592. package/src/platforms/gba/lib/libgba/sysinclude/sys/endian.h +207 -0
  593. package/src/platforms/gba/lib/libgba/sysinclude/sys/errno.h +198 -0
  594. package/src/platforms/gba/lib/libgba/sysinclude/sys/fcntl.h +12 -0
  595. package/src/platforms/gba/lib/libgba/sysinclude/sys/features.h +551 -0
  596. package/src/platforms/gba/lib/libgba/sysinclude/sys/fenv.h +90 -0
  597. package/src/platforms/gba/lib/libgba/sysinclude/sys/file.h +2 -0
  598. package/src/platforms/gba/lib/libgba/sysinclude/sys/iconvnls.h +77 -0
  599. package/src/platforms/gba/lib/libgba/sysinclude/sys/iosupport.h +143 -0
  600. package/src/platforms/gba/lib/libgba/sysinclude/sys/lock.h +75 -0
  601. package/src/platforms/gba/lib/libgba/sysinclude/sys/param.h +35 -0
  602. package/src/platforms/gba/lib/libgba/sysinclude/sys/queue.h +919 -0
  603. package/src/platforms/gba/lib/libgba/sysinclude/sys/reent.h +913 -0
  604. package/src/platforms/gba/lib/libgba/sysinclude/sys/resource.h +24 -0
  605. package/src/platforms/gba/lib/libgba/sysinclude/sys/sched.h +69 -0
  606. package/src/platforms/gba/lib/libgba/sysinclude/sys/select.h +94 -0
  607. package/src/platforms/gba/lib/libgba/sysinclude/sys/signal.h +388 -0
  608. package/src/platforms/gba/lib/libgba/sysinclude/sys/stat.h +179 -0
  609. package/src/platforms/gba/lib/libgba/sysinclude/sys/statvfs.h +41 -0
  610. package/src/platforms/gba/lib/libgba/sysinclude/sys/stdio.h +27 -0
  611. package/src/platforms/gba/lib/libgba/sysinclude/sys/string.h +2 -0
  612. package/src/platforms/gba/lib/libgba/sysinclude/sys/syslimits.h +61 -0
  613. package/src/platforms/gba/lib/libgba/sysinclude/sys/time.h +448 -0
  614. package/src/platforms/gba/lib/libgba/sysinclude/sys/timeb.h +40 -0
  615. package/src/platforms/gba/lib/libgba/sysinclude/sys/times.h +32 -0
  616. package/src/platforms/gba/lib/libgba/sysinclude/sys/timespec.h +63 -0
  617. package/src/platforms/gba/lib/libgba/sysinclude/sys/tree.h +864 -0
  618. package/src/platforms/gba/lib/libgba/sysinclude/sys/types.h +228 -0
  619. package/src/platforms/gba/lib/libgba/sysinclude/sys/unistd.h +591 -0
  620. package/src/platforms/gba/lib/libgba/sysinclude/sys/utime.h +22 -0
  621. package/src/platforms/gba/lib/libgba/sysinclude/sys/wait.h +44 -0
  622. package/src/platforms/gba/lib/libgba/sysinclude/tar.h +43 -0
  623. package/src/platforms/gba/lib/libgba/sysinclude/termios.h +7 -0
  624. package/src/platforms/gba/lib/libgba/sysinclude/tgmath.h +127 -0
  625. package/src/platforms/gba/lib/libgba/sysinclude/threads.h +93 -0
  626. package/src/platforms/gba/lib/libgba/sysinclude/time.h +313 -0
  627. package/src/platforms/gba/lib/libgba/sysinclude/unctrl.h +42 -0
  628. package/src/platforms/gba/lib/libgba/sysinclude/unistd.h +6 -0
  629. package/src/platforms/gba/lib/libgba/sysinclude/utime.h +12 -0
  630. package/src/platforms/gba/lib/libgba/sysinclude/utmp.h +8 -0
  631. package/src/platforms/gba/lib/libgba/sysinclude/varargs.h +7 -0
  632. package/src/platforms/gba/lib/libgba/sysinclude/wchar.h +339 -0
  633. package/src/platforms/gba/lib/libgba/sysinclude/wctype.h +74 -0
  634. package/src/platforms/gba/lib/libgba/sysinclude/wordexp.h +53 -0
  635. package/src/platforms/gba/lib/libtonc/crtbegin.o +0 -0
  636. package/src/platforms/gba/lib/libtonc/crtend.o +0 -0
  637. package/src/platforms/gba/lib/libtonc/crti.o +0 -0
  638. package/src/platforms/gba/lib/libtonc/crtn.o +0 -0
  639. package/src/platforms/gba/lib/libtonc/gba_cart.ld +319 -0
  640. package/src/platforms/gba/lib/libtonc/gba_crt0.s +258 -0
  641. package/src/platforms/gba/lib/libtonc/include/tonc.h +72 -0
  642. package/src/platforms/gba/lib/libtonc/include/tonc_asminc.h +132 -0
  643. package/src/platforms/gba/lib/libtonc/include/tonc_bios.h +555 -0
  644. package/src/platforms/gba/lib/libtonc/include/tonc_core.h +573 -0
  645. package/src/platforms/gba/lib/libtonc/include/tonc_input.h +184 -0
  646. package/src/platforms/gba/lib/libtonc/include/tonc_irq.h +121 -0
  647. package/src/platforms/gba/lib/libtonc/include/tonc_legacy.h +481 -0
  648. package/src/platforms/gba/lib/libtonc/include/tonc_libgba.h +537 -0
  649. package/src/platforms/gba/lib/libtonc/include/tonc_math.h +692 -0
  650. package/src/platforms/gba/lib/libtonc/include/tonc_memdef.h +962 -0
  651. package/src/platforms/gba/lib/libtonc/include/tonc_memmap.h +583 -0
  652. package/src/platforms/gba/lib/libtonc/include/tonc_nocash.h +51 -0
  653. package/src/platforms/gba/lib/libtonc/include/tonc_oam.h +186 -0
  654. package/src/platforms/gba/lib/libtonc/include/tonc_surface.h +461 -0
  655. package/src/platforms/gba/lib/libtonc/include/tonc_text.h +270 -0
  656. package/src/platforms/gba/lib/libtonc/include/tonc_tte.h +748 -0
  657. package/src/platforms/gba/lib/libtonc/include/tonc_types.h +376 -0
  658. package/src/platforms/gba/lib/libtonc/include/tonc_video.h +615 -0
  659. package/src/platforms/gba/lib/libtonc/libtonc.seed.a +0 -0
  660. package/src/platforms/gba/lib/libtonc/libtonc.seed.hash +1 -0
  661. package/src/platforms/gba/lib/libtonc/src/asm/clr_blend_fast.s +72 -0
  662. package/src/platforms/gba/lib/libtonc/src/asm/clr_fade_fast.s +74 -0
  663. package/src/platforms/gba/lib/libtonc/src/asm/div_lut.s +54 -0
  664. package/src/platforms/gba/lib/libtonc/src/asm/sin_lut.s +90 -0
  665. package/src/platforms/gba/lib/libtonc/src/asm/tonc_bios.s +289 -0
  666. package/src/platforms/gba/lib/libtonc/src/asm/tonc_bios_ex.s +97 -0
  667. package/src/platforms/gba/lib/libtonc/src/asm/tonc_isr_master.s +92 -0
  668. package/src/platforms/gba/lib/libtonc/src/asm/tonc_isr_nest.s +98 -0
  669. package/src/platforms/gba/lib/libtonc/src/asm/tonc_memcpy.s +126 -0
  670. package/src/platforms/gba/lib/libtonc/src/asm/tonc_memset.s +123 -0
  671. package/src/platforms/gba/lib/libtonc/src/asm/tonc_nocash.s +73 -0
  672. package/src/platforms/gba/lib/libtonc/src/font/sys8.png +0 -0
  673. package/src/platforms/gba/lib/libtonc/src/font/sys8.s +46 -0
  674. package/src/platforms/gba/lib/libtonc/src/font/verdana10.png +0 -0
  675. package/src/platforms/gba/lib/libtonc/src/font/verdana10.s +293 -0
  676. package/src/platforms/gba/lib/libtonc/src/font/verdana9.png +0 -0
  677. package/src/platforms/gba/lib/libtonc/src/font/verdana9.s +167 -0
  678. package/src/platforms/gba/lib/libtonc/src/font/verdana9_b4.png +0 -0
  679. package/src/platforms/gba/lib/libtonc/src/font/verdana9_b4.s +545 -0
  680. package/src/platforms/gba/lib/libtonc/src/font/verdana9b.png +0 -0
  681. package/src/platforms/gba/lib/libtonc/src/font/verdana9b.s +167 -0
  682. package/src/platforms/gba/lib/libtonc/src/font/verdana9i.png +0 -0
  683. package/src/platforms/gba/lib/libtonc/src/font/verdana9i.s +167 -0
  684. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_bitmap.c +289 -0
  685. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text.c +81 -0
  686. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_bm.c +244 -0
  687. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_map.c +122 -0
  688. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_oam.c +113 -0
  689. package/src/platforms/gba/lib/libtonc/src/pre1.3/toncfont.s +43 -0
  690. package/src/platforms/gba/lib/libtonc/src/tonc_bg.c +61 -0
  691. package/src/platforms/gba/lib/libtonc/src/tonc_bg_affine.c +112 -0
  692. package/src/platforms/gba/lib/libtonc/src/tonc_bmp16.c +240 -0
  693. package/src/platforms/gba/lib/libtonc/src/tonc_bmp8.c +314 -0
  694. package/src/platforms/gba/lib/libtonc/src/tonc_color.c +368 -0
  695. package/src/platforms/gba/lib/libtonc/src/tonc_core.c +237 -0
  696. package/src/platforms/gba/lib/libtonc/src/tonc_input.c +118 -0
  697. package/src/platforms/gba/lib/libtonc/src/tonc_irq.c +271 -0
  698. package/src/platforms/gba/lib/libtonc/src/tonc_math.c +54 -0
  699. package/src/platforms/gba/lib/libtonc/src/tonc_oam.c +76 -0
  700. package/src/platforms/gba/lib/libtonc/src/tonc_obj_affine.c +146 -0
  701. package/src/platforms/gba/lib/libtonc/src/tonc_sbmp16.c +369 -0
  702. package/src/platforms/gba/lib/libtonc/src/tonc_sbmp8.c +405 -0
  703. package/src/platforms/gba/lib/libtonc/src/tonc_schr4c.c +588 -0
  704. package/src/platforms/gba/lib/libtonc/src/tonc_schr4r.c +462 -0
  705. package/src/platforms/gba/lib/libtonc/src/tonc_surface.c +105 -0
  706. package/src/platforms/gba/lib/libtonc/src/tonc_video.c +33 -0
  707. package/src/platforms/gba/lib/libtonc/src/tte/ase_drawg.c +83 -0
  708. package/src/platforms/gba/lib/libtonc/src/tte/bmp16_drawg.c +72 -0
  709. package/src/platforms/gba/lib/libtonc/src/tte/bmp16_drawg_b1cs.c +92 -0
  710. package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg.c +71 -0
  711. package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg_b1cs.c +104 -0
  712. package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg_b1cts_fast.s +115 -0
  713. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b1cts.c +76 -0
  714. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b1cts_fast.s +128 -0
  715. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b4cts.c +67 -0
  716. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b4cts_fast.s +127 -0
  717. package/src/platforms/gba/lib/libtonc/src/tte/chr4r_drawg_b1cts.c +80 -0
  718. package/src/platforms/gba/lib/libtonc/src/tte/chr4r_drawg_b1cts_fast.s +145 -0
  719. package/src/platforms/gba/lib/libtonc/src/tte/obj_drawg.c +61 -0
  720. package/src/platforms/gba/lib/libtonc/src/tte/se_drawg.c +110 -0
  721. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_ase.c +87 -0
  722. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_bmp.c +118 -0
  723. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_chr4c.c +86 -0
  724. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_chr4r.c +87 -0
  725. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_obj.c +84 -0
  726. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_se.c +96 -0
  727. package/src/platforms/gba/lib/libtonc/src/tte/tte_iohook.c +264 -0
  728. package/src/platforms/gba/lib/libtonc/src/tte/tte_main.c +756 -0
  729. package/src/platforms/gba/lib/libtonc/src/tte/tte_types.s +119 -0
  730. package/src/platforms/gba/lib/maxmod/LICENSE-MAXMOD +23 -0
  731. package/src/platforms/gba/lib/maxmod/asm_include/mp_defs.inc +117 -0
  732. package/src/platforms/gba/lib/maxmod/asm_include/mp_format_mas.inc +108 -0
  733. package/src/platforms/gba/lib/maxmod/asm_include/mp_macros.inc +195 -0
  734. package/src/platforms/gba/lib/maxmod/asm_include/mp_mas.inc +40 -0
  735. package/src/platforms/gba/lib/maxmod/asm_include/mp_mas_structs.inc +189 -0
  736. package/src/platforms/gba/lib/maxmod/asm_include/mp_mixer_ds.inc +46 -0
  737. package/src/platforms/gba/lib/maxmod/asm_include/mp_mixer_gba.inc +42 -0
  738. package/src/platforms/gba/lib/maxmod/asm_include/swi_gba.inc +23 -0
  739. package/src/platforms/gba/lib/maxmod/include/maxmod.h +412 -0
  740. package/src/platforms/gba/lib/maxmod/include/mm_types.h +333 -0
  741. package/src/platforms/gba/lib/maxmod/maxmod.seed.a +0 -0
  742. package/src/platforms/gba/lib/maxmod/maxmod.seed.hash +1 -0
  743. package/src/platforms/gba/lib/maxmod/music/chiptune.xm +0 -0
  744. package/src/platforms/gba/lib/maxmod/music/chiptune_soundbank.bin +0 -0
  745. package/src/platforms/gba/lib/maxmod/music/chiptune_soundbank.h +4 -0
  746. package/src/platforms/gba/lib/maxmod/music/make_chiptune_xm.js +203 -0
  747. package/src/platforms/gba/lib/maxmod/source/mm_effect.s +767 -0
  748. package/src/platforms/gba/lib/maxmod/source/mm_main.s +115 -0
  749. package/src/platforms/gba/lib/maxmod/source/mm_mas.s +4990 -0
  750. package/src/platforms/gba/lib/maxmod/source/mm_mas_arm.s +612 -0
  751. package/src/platforms/gba/lib/maxmod/source_gba/mm_init_default.s +98 -0
  752. package/src/platforms/gba/lib/maxmod/source_gba/mm_main_gba.s +292 -0
  753. package/src/platforms/gba/lib/maxmod/source_gba/mm_mixer_gba.s +1367 -0
  754. package/src/platforms/gba/lib/sysbase/gba_iosupport.c +138 -0
  755. package/src/platforms/gbc/MENTAL_MODEL.md +165 -0
  756. package/src/platforms/gbc/TROUBLESHOOTING.md +142 -0
  757. package/src/platforms/gbc/UPSTREAM_SOURCES.md +60 -0
  758. package/src/platforms/gbc/lib/c/LICENSE-HUGEDRIVER +25 -0
  759. package/src/platforms/gbc/lib/c/README.md +120 -0
  760. package/src/platforms/gbc/lib/c/SDCC_GOTCHAS.md +189 -0
  761. package/src/platforms/gbc/lib/c/gb_crt0.s +163 -0
  762. package/src/platforms/gbc/lib/c/gb_hardware.h +113 -0
  763. package/src/platforms/gbc/lib/c/gb_runtime.c +284 -0
  764. package/src/platforms/gbc/lib/c/gb_runtime.h +145 -0
  765. package/src/platforms/gbc/lib/c/hUGEDriver.c +191 -0
  766. package/src/platforms/gbc/lib/c/hUGEDriver.h +95 -0
  767. package/src/platforms/gbc/lib/c/hUGEDriver.upstream.asm +1908 -0
  768. package/src/platforms/gbc/lib/c/lcd_init.c +19 -0
  769. package/src/platforms/gbc/lib/c/patch-header.js +154 -0
  770. package/src/platforms/gbc/lib/c/song_data.c +88 -0
  771. package/src/platforms/gbc/lib/c/unroll.h +52 -0
  772. package/src/platforms/gbc/lib/c/wait_vblank.c +14 -0
  773. package/src/platforms/genesis/MENTAL_MODEL.md +223 -0
  774. package/src/platforms/genesis/TROUBLESHOOTING.md +193 -0
  775. package/src/platforms/genesis/UPSTREAM_SOURCES.md +52 -0
  776. package/src/platforms/genesis/image-to-tilemap.js +333 -0
  777. package/src/platforms/genesis/lib/README.md +157 -0
  778. package/src/platforms/genesis/lib/c/crtbegin.o +0 -0
  779. package/src/platforms/genesis/lib/c/crtend.o +0 -0
  780. package/src/platforms/genesis/lib/c/genesis.ld +44 -0
  781. package/src/platforms/genesis/lib/c/genesis_sfx.c +51 -0
  782. package/src/platforms/genesis/lib/c/genesis_sfx.h +49 -0
  783. package/src/platforms/genesis/lib/c/libc.a +0 -0
  784. package/src/platforms/genesis/lib/c/libgcc.a +0 -0
  785. package/src/platforms/genesis/lib/c/libm.a +0 -0
  786. package/src/platforms/genesis/lib/c/sega.s +71 -0
  787. package/src/platforms/genesis/lib/header.s +96 -0
  788. package/src/platforms/genesis/lib/nmi_safe.s +79 -0
  789. package/src/platforms/genesis/lib/pad_read.s +104 -0
  790. package/src/platforms/genesis/lib/sgdk/COPYING.RUNTIME +73 -0
  791. package/src/platforms/genesis/lib/sgdk/LICENSE +12 -0
  792. package/src/platforms/genesis/lib/sgdk/include/asm.h +52 -0
  793. package/src/platforms/genesis/lib/sgdk/include/asm_mac.i +9 -0
  794. package/src/platforms/genesis/lib/sgdk/include/bmp.h +690 -0
  795. package/src/platforms/genesis/lib/sgdk/include/config.h +208 -0
  796. package/src/platforms/genesis/lib/sgdk/include/dma.h +542 -0
  797. package/src/platforms/genesis/lib/sgdk/include/ext/console.h +387 -0
  798. package/src/platforms/genesis/lib/sgdk/include/ext/everdrive.h +116 -0
  799. package/src/platforms/genesis/lib/sgdk/include/ext/fat16.h +84 -0
  800. package/src/platforms/genesis/lib/sgdk/include/ext/flash-save/flash.h +164 -0
  801. package/src/platforms/genesis/lib/sgdk/include/ext/flash-save/saveman.h +177 -0
  802. package/src/platforms/genesis/lib/sgdk/include/ext/link_cable.h +316 -0
  803. package/src/platforms/genesis/lib/sgdk/include/ext/minimusic/minimus.h +29 -0
  804. package/src/platforms/genesis/lib/sgdk/include/ext/mw/16c550.h +221 -0
  805. package/src/platforms/genesis/lib/sgdk/include/ext/mw/comm.h +93 -0
  806. package/src/platforms/genesis/lib/sgdk/include/ext/mw/gamejolt.h +541 -0
  807. package/src/platforms/genesis/lib/sgdk/include/ext/mw/jsmn.h +471 -0
  808. package/src/platforms/genesis/lib/sgdk/include/ext/mw/json.h +122 -0
  809. package/src/platforms/genesis/lib/sgdk/include/ext/mw/lsd.h +172 -0
  810. package/src/platforms/genesis/lib/sgdk/include/ext/mw/megawifi.h +984 -0
  811. package/src/platforms/genesis/lib/sgdk/include/ext/mw/mw-msg.h +392 -0
  812. package/src/platforms/genesis/lib/sgdk/include/ext/mw/ssf_ed_pro.h +38 -0
  813. package/src/platforms/genesis/lib/sgdk/include/ext/mw/ssf_ed_x7.h +73 -0
  814. package/src/platforms/genesis/lib/sgdk/include/ext/serial/buffer.h +8 -0
  815. package/src/platforms/genesis/lib/sgdk/include/ext/serial/serial.h +133 -0
  816. package/src/platforms/genesis/lib/sgdk/include/ext/stb/stb_sprintf.h +1864 -0
  817. package/src/platforms/genesis/lib/sgdk/include/genesis.h +92 -0
  818. package/src/platforms/genesis/lib/sgdk/include/joy.h +482 -0
  819. package/src/platforms/genesis/lib/sgdk/include/kdebug.h +21 -0
  820. package/src/platforms/genesis/lib/sgdk/include/map.h +409 -0
  821. package/src/platforms/genesis/lib/sgdk/include/mapper.h +186 -0
  822. package/src/platforms/genesis/lib/sgdk/include/maths.h +1071 -0
  823. package/src/platforms/genesis/lib/sgdk/include/maths3D.h +480 -0
  824. package/src/platforms/genesis/lib/sgdk/include/memory.h +346 -0
  825. package/src/platforms/genesis/lib/sgdk/include/memory_base.h +37 -0
  826. package/src/platforms/genesis/lib/sgdk/include/object.h +171 -0
  827. package/src/platforms/genesis/lib/sgdk/include/pal.h +500 -0
  828. package/src/platforms/genesis/lib/sgdk/include/pool.h +171 -0
  829. package/src/platforms/genesis/lib/sgdk/include/psg.h +153 -0
  830. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_dpcm2.h +79 -0
  831. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_pcm.h +98 -0
  832. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_pcm4.h +125 -0
  833. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/tab_vol.h +6 -0
  834. package/src/platforms/genesis/lib/sgdk/include/snd/smp_null.h +6 -0
  835. package/src/platforms/genesis/lib/sgdk/include/snd/smp_null_dpcm.h +6 -0
  836. package/src/platforms/genesis/lib/sgdk/include/snd/sound.h +70 -0
  837. package/src/platforms/genesis/lib/sgdk/include/snd/xgm.h +399 -0
  838. package/src/platforms/genesis/lib/sgdk/include/snd/xgm2.h +389 -0
  839. package/src/platforms/genesis/lib/sgdk/include/snd/z80_def.i80 +41 -0
  840. package/src/platforms/genesis/lib/sgdk/include/snd/z80_fct.i80 +83 -0
  841. package/src/platforms/genesis/lib/sgdk/include/snd/z80_mac.i80 +1476 -0
  842. package/src/platforms/genesis/lib/sgdk/include/sprite_eng.h +1095 -0
  843. package/src/platforms/genesis/lib/sgdk/include/sprite_eng_legacy.h +1030 -0
  844. package/src/platforms/genesis/lib/sgdk/include/sram.h +110 -0
  845. package/src/platforms/genesis/lib/sgdk/include/string.h +349 -0
  846. package/src/platforms/genesis/lib/sgdk/include/sys.h +511 -0
  847. package/src/platforms/genesis/lib/sgdk/include/tab_cnv.h +19 -0
  848. package/src/platforms/genesis/lib/sgdk/include/task.h +77 -0
  849. package/src/platforms/genesis/lib/sgdk/include/task_cst.h +33 -0
  850. package/src/platforms/genesis/lib/sgdk/include/timer.h +132 -0
  851. package/src/platforms/genesis/lib/sgdk/include/tools.h +450 -0
  852. package/src/platforms/genesis/lib/sgdk/include/types.h +320 -0
  853. package/src/platforms/genesis/lib/sgdk/include/vdp.h +1150 -0
  854. package/src/platforms/genesis/lib/sgdk/include/vdp_bg.h +723 -0
  855. package/src/platforms/genesis/lib/sgdk/include/vdp_pal.h +101 -0
  856. package/src/platforms/genesis/lib/sgdk/include/vdp_spr.h +448 -0
  857. package/src/platforms/genesis/lib/sgdk/include/vdp_tile.h +1136 -0
  858. package/src/platforms/genesis/lib/sgdk/include/vram.h +270 -0
  859. package/src/platforms/genesis/lib/sgdk/include/ym2612.h +87 -0
  860. package/src/platforms/genesis/lib/sgdk/include/z80_ctrl.h +420 -0
  861. package/src/platforms/genesis/lib/sgdk/libmd.seed.a +0 -0
  862. package/src/platforms/genesis/lib/sgdk/libmd.seed.hash +1 -0
  863. package/src/platforms/genesis/lib/sgdk/md.ld +120 -0
  864. package/src/platforms/genesis/lib/sgdk/music/demo.vgm +0 -0
  865. package/src/platforms/genesis/lib/sgdk/music/demo.xgc +0 -0
  866. package/src/platforms/genesis/lib/sgdk/music/demo.xgm +0 -0
  867. package/src/platforms/genesis/lib/sgdk/res/image/font_default.png +0 -0
  868. package/src/platforms/genesis/lib/sgdk/res/image/sgdk_logo.png +0 -0
  869. package/src/platforms/genesis/lib/sgdk/res/libres.h +10 -0
  870. package/src/platforms/genesis/lib/sgdk/res/libres.res +5 -0
  871. package/src/platforms/genesis/lib/sgdk/res/libres.s +166 -0
  872. package/src/platforms/genesis/lib/sgdk/res/sound/stop_xgm.bin +0 -0
  873. package/src/platforms/genesis/lib/sgdk/rom_header.c +33 -0
  874. package/src/platforms/genesis/lib/sgdk/sega.preprocessed.s +364 -0
  875. package/src/platforms/genesis/lib/sgdk/sega.s +365 -0
  876. package/src/platforms/genesis/lib/sgdk/src/bmp.c +1539 -0
  877. package/src/platforms/genesis/lib/sgdk/src/bmp_a.s +3477 -0
  878. package/src/platforms/genesis/lib/sgdk/src/boot/rom_header.c +33 -0
  879. package/src/platforms/genesis/lib/sgdk/src/boot/sega.s +365 -0
  880. package/src/platforms/genesis/lib/sgdk/src/dma.c +782 -0
  881. package/src/platforms/genesis/lib/sgdk/src/dma_a.s +23 -0
  882. package/src/platforms/genesis/lib/sgdk/src/error_a.s +376 -0
  883. package/src/platforms/genesis/lib/sgdk/src/ext/console.c +490 -0
  884. package/src/platforms/genesis/lib/sgdk/src/ext/everdrive.c +285 -0
  885. package/src/platforms/genesis/lib/sgdk/src/ext/fat16.c +610 -0
  886. package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/README.md +112 -0
  887. package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/flash.c +300 -0
  888. package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/saveman.c +641 -0
  889. package/src/platforms/genesis/lib/sgdk/src/ext/link_cable.c +1758 -0
  890. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/CHANGELOG.md +31 -0
  891. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/LICENSE.txt +17 -0
  892. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/README.md +18 -0
  893. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/data.z80 +148 -0
  894. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/define.z80 +173 -0
  895. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/api-c.md +80 -0
  896. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/format.md +132 -0
  897. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/teradrive.md +33 -0
  898. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/fm.z80 +363 -0
  899. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/main.z80 +433 -0
  900. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/minimus.c +129 -0
  901. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/minimus_drv.s80 +17 -0
  902. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/psg.z80 +231 -0
  903. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/track.z80 +398 -0
  904. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/util.z80 +98 -0
  905. package/src/platforms/genesis/lib/sgdk/src/ext/mw/16c550.c +84 -0
  906. package/src/platforms/genesis/lib/sgdk/src/ext/mw/README.md +849 -0
  907. package/src/platforms/genesis/lib/sgdk/src/ext/mw/comm.c +141 -0
  908. package/src/platforms/genesis/lib/sgdk/src/ext/mw/gamejolt.c +758 -0
  909. package/src/platforms/genesis/lib/sgdk/src/ext/mw/json.c +153 -0
  910. package/src/platforms/genesis/lib/sgdk/src/ext/mw/lsd.c +364 -0
  911. package/src/platforms/genesis/lib/sgdk/src/ext/mw/megawifi.c +1501 -0
  912. package/src/platforms/genesis/lib/sgdk/src/ext/mw/ssf_ed_pro.c +98 -0
  913. package/src/platforms/genesis/lib/sgdk/src/ext/mw/ssf_ed_x7.c +67 -0
  914. package/src/platforms/genesis/lib/sgdk/src/ext/serial/buffer.c +69 -0
  915. package/src/platforms/genesis/lib/sgdk/src/ext/serial/serial.c +158 -0
  916. package/src/platforms/genesis/lib/sgdk/src/joy.c +1361 -0
  917. package/src/platforms/genesis/lib/sgdk/src/kdebug.s +109 -0
  918. package/src/platforms/genesis/lib/sgdk/src/map.c +1915 -0
  919. package/src/platforms/genesis/lib/sgdk/src/mapper.c +280 -0
  920. package/src/platforms/genesis/lib/sgdk/src/maths.c +878 -0
  921. package/src/platforms/genesis/lib/sgdk/src/maths3D.c +480 -0
  922. package/src/platforms/genesis/lib/sgdk/src/maths3D_a.s +205 -0
  923. package/src/platforms/genesis/lib/sgdk/src/memory.c +760 -0
  924. package/src/platforms/genesis/lib/sgdk/src/memory_a.s +306 -0
  925. package/src/platforms/genesis/lib/sgdk/src/object.c +111 -0
  926. package/src/platforms/genesis/lib/sgdk/src/pal.c +484 -0
  927. package/src/platforms/genesis/lib/sgdk/src/pool.c +234 -0
  928. package/src/platforms/genesis/lib/sgdk/src/psg.c +82 -0
  929. package/src/platforms/genesis/lib/sgdk/src/snd/drv_null.s80 +27 -0
  930. package/src/platforms/genesis/lib/sgdk/src/snd/drv_xgm.s80 +3037 -0
  931. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_dpcm2.s80 +984 -0
  932. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_pcm.s80 +592 -0
  933. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_pcm4.s80 +699 -0
  934. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_dpcm2.c +172 -0
  935. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_pcm.c +152 -0
  936. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_pcm4.c +213 -0
  937. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/tab_vol.c +277 -0
  938. package/src/platforms/genesis/lib/sgdk/src/snd/smp_null.s +22 -0
  939. package/src/platforms/genesis/lib/sgdk/src/snd/smp_null_dpcm.s +15 -0
  940. package/src/platforms/genesis/lib/sgdk/src/snd/sound.c +33 -0
  941. package/src/platforms/genesis/lib/sgdk/src/snd/xgm.c +683 -0
  942. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2.s80 +993 -0
  943. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_fct.i80 +611 -0
  944. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_mac.i80 +133 -0
  945. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_pcm_fct.i80 +114 -0
  946. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_pcm_mac.i80 +1444 -0
  947. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_psg_fct.i80 +491 -0
  948. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_psg_mac.i80 +43 -0
  949. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_ym_fct.i80 +1664 -0
  950. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_ym_mac.i80 +295 -0
  951. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2.c +1083 -0
  952. package/src/platforms/genesis/lib/sgdk/src/sprite_eng.c +2256 -0
  953. package/src/platforms/genesis/lib/sgdk/src/sprite_eng_legacy.c +2309 -0
  954. package/src/platforms/genesis/lib/sgdk/src/sram.c +30 -0
  955. package/src/platforms/genesis/lib/sgdk/src/sram_a.s +41 -0
  956. package/src/platforms/genesis/lib/sgdk/src/string.c +720 -0
  957. package/src/platforms/genesis/lib/sgdk/src/sys.c +1053 -0
  958. package/src/platforms/genesis/lib/sgdk/src/sys_a.s +74 -0
  959. package/src/platforms/genesis/lib/sgdk/src/tab_cnv.c +129 -0
  960. package/src/platforms/genesis/lib/sgdk/src/tab_log10.c +8201 -0
  961. package/src/platforms/genesis/lib/sgdk/src/tab_log2.c +8201 -0
  962. package/src/platforms/genesis/lib/sgdk/src/tab_sin.c +2058 -0
  963. package/src/platforms/genesis/lib/sgdk/src/tab_sqrt.c +8201 -0
  964. package/src/platforms/genesis/lib/sgdk/src/task.s +148 -0
  965. package/src/platforms/genesis/lib/sgdk/src/timer.c +201 -0
  966. package/src/platforms/genesis/lib/sgdk/src/tools.c +1299 -0
  967. package/src/platforms/genesis/lib/sgdk/src/tools_a.s +979 -0
  968. package/src/platforms/genesis/lib/sgdk/src/types.c +18 -0
  969. package/src/platforms/genesis/lib/sgdk/src/vdp.c +1060 -0
  970. package/src/platforms/genesis/lib/sgdk/src/vdp_bg.c +511 -0
  971. package/src/platforms/genesis/lib/sgdk/src/vdp_spr.c +322 -0
  972. package/src/platforms/genesis/lib/sgdk/src/vdp_tile.c +1011 -0
  973. package/src/platforms/genesis/lib/sgdk/src/vdp_tile_a.s +68 -0
  974. package/src/platforms/genesis/lib/sgdk/src/vram.c +273 -0
  975. package/src/platforms/genesis/lib/sgdk/src/ym2612.c +175 -0
  976. package/src/platforms/genesis/lib/sgdk/src/z80_ctrl.c +334 -0
  977. package/src/platforms/genesis/lib/sprite_table.s +129 -0
  978. package/src/platforms/genesis/lib/vblank_wait.s +73 -0
  979. package/src/platforms/genesis/lib/vdp_init.s +85 -0
  980. package/src/platforms/genesis/lib/wram.s +88 -0
  981. package/src/platforms/genesis/lib/z80_bootstrap.s +102 -0
  982. package/src/platforms/genesis/vdp.js +495 -0
  983. package/src/platforms/gg/MENTAL_MODEL.md +155 -0
  984. package/src/platforms/gg/TROUBLESHOOTING.md +91 -0
  985. package/src/platforms/gg/UPSTREAM_SOURCES.md +36 -0
  986. package/src/platforms/gg/lib/c/gg_crt0.s +112 -0
  987. package/src/platforms/gg/lib/c/gg_hw.h +62 -0
  988. package/src/platforms/gg/lib/c/gg_music.c +155 -0
  989. package/src/platforms/gg/lib/c/gg_music.h +89 -0
  990. package/src/platforms/gg/lib/c/gg_sfx.c +82 -0
  991. package/src/platforms/gg/lib/c/gg_sfx.h +40 -0
  992. package/src/platforms/gg/lib/c/joypad_read.c +22 -0
  993. package/src/platforms/gg/lib/c/load_palette.c +20 -0
  994. package/src/platforms/gg/lib/c/load_tiles.c +32 -0
  995. package/src/platforms/gg/lib/c/sprite_table.c +60 -0
  996. package/src/platforms/gg/lib/c/vblank_wait.c +10 -0
  997. package/src/platforms/gg/lib/c/vdp_init.c +58 -0
  998. package/src/platforms/index.js +7 -0
  999. package/src/platforms/lynx/MENTAL_MODEL.md +231 -0
  1000. package/src/platforms/lynx/TROUBLESHOOTING.md +105 -0
  1001. package/src/platforms/lynx/UPSTREAM_SOURCES.md +66 -0
  1002. package/src/platforms/lynx/lib/c/lynx_music.c +63 -0
  1003. package/src/platforms/lynx/lib/c/lynx_music.h +16 -0
  1004. package/src/platforms/lynx/lib/c/lynx_sfx.c +147 -0
  1005. package/src/platforms/lynx/lib/c/lynx_sfx.h +59 -0
  1006. package/src/platforms/lynx/lib/cc65-src/bllhdr.s +18 -0
  1007. package/src/platforms/lynx/lib/cc65-src/bootldr.s +195 -0
  1008. package/src/platforms/lynx/lib/cc65-src/cgetc.s +69 -0
  1009. package/src/platforms/lynx/lib/cc65-src/clock.s +87 -0
  1010. package/src/platforms/lynx/lib/cc65-src/crt0.s +135 -0
  1011. package/src/platforms/lynx/lib/cc65-src/defdir.s +29 -0
  1012. package/src/platforms/lynx/lib/cc65-src/eeprom.s +255 -0
  1013. package/src/platforms/lynx/lib/cc65-src/eeprom46.s +204 -0
  1014. package/src/platforms/lynx/lib/cc65-src/eeprom66.s +227 -0
  1015. package/src/platforms/lynx/lib/cc65-src/eeprom86.s +236 -0
  1016. package/src/platforms/lynx/lib/cc65-src/exec.s +34 -0
  1017. package/src/platforms/lynx/lib/cc65-src/exehdr.s +27 -0
  1018. package/src/platforms/lynx/lib/cc65-src/extzp.inc +23 -0
  1019. package/src/platforms/lynx/lib/cc65-src/extzp.s +30 -0
  1020. package/src/platforms/lynx/lib/cc65-src/irq.s +45 -0
  1021. package/src/platforms/lynx/lib/cc65-src/joy/lynx-stdjoy.s +93 -0
  1022. package/src/platforms/lynx/lib/cc65-src/joy_stat_stddrv.s +14 -0
  1023. package/src/platforms/lynx/lib/cc65-src/kbhit.s +56 -0
  1024. package/src/platforms/lynx/lib/cc65-src/libref.s +9 -0
  1025. package/src/platforms/lynx/lib/cc65-src/load.s +41 -0
  1026. package/src/platforms/lynx/lib/cc65-src/lseek.s +58 -0
  1027. package/src/platforms/lynx/lib/cc65-src/lynx-cart.s +98 -0
  1028. package/src/platforms/lynx/lib/cc65-src/lynx-snd.s +1270 -0
  1029. package/src/platforms/lynx/lib/cc65-src/mainargs.s +24 -0
  1030. package/src/platforms/lynx/lib/cc65-src/open.s +136 -0
  1031. package/src/platforms/lynx/lib/cc65-src/oserror.s +14 -0
  1032. package/src/platforms/lynx/lib/cc65-src/read.s +44 -0
  1033. package/src/platforms/lynx/lib/cc65-src/ser/lynx-comlynx.s +404 -0
  1034. package/src/platforms/lynx/lib/cc65-src/ser_stat_stddrv.s +14 -0
  1035. package/src/platforms/lynx/lib/cc65-src/sysuname.s +39 -0
  1036. package/src/platforms/lynx/lib/cc65-src/tgi/lynx-160-102-16.s +1075 -0
  1037. package/src/platforms/lynx/lib/cc65-src/tgi_colors.s +9 -0
  1038. package/src/platforms/lynx/lib/cc65-src/tgi_irq.s +11 -0
  1039. package/src/platforms/lynx/lib/cc65-src/tgi_stat_stddrv.s +14 -0
  1040. package/src/platforms/lynx/lib/cc65-src/tgi_stddrv.s +13 -0
  1041. package/src/platforms/lynx/lib/cc65-src/uploader.s +81 -0
  1042. package/src/platforms/nes/MENTAL_MODEL.md +301 -0
  1043. package/src/platforms/nes/TROUBLESHOOTING.md +321 -0
  1044. package/src/platforms/nes/UPSTREAM_SOURCES.md +31 -0
  1045. package/src/platforms/nes/image-to-chr.js +195 -0
  1046. package/src/platforms/nes/image-to-tilemap.js +415 -0
  1047. package/src/platforms/nes/lib/README.md +40 -0
  1048. package/src/platforms/nes/lib/asm/LICENSE-FAMITONE +40 -0
  1049. package/src/platforms/nes/lib/asm/chr_ram_header.s +32 -0
  1050. package/src/platforms/nes/lib/asm/famitone2.s +1258 -0
  1051. package/src/platforms/nes/lib/asm/famitone_bridge.s +50 -0
  1052. package/src/platforms/nes/lib/asm/music_data.s +238 -0
  1053. package/src/platforms/nes/lib/c/chr_ram_runtime_hello_sprite.c +81 -0
  1054. package/src/platforms/nes/lib/c/chr_ram_runtime_hud_row.c +101 -0
  1055. package/src/platforms/nes/lib/c/nes_runtime.c +347 -0
  1056. package/src/platforms/nes/lib/c/nes_runtime.h +153 -0
  1057. package/src/platforms/nes/lib/c/nmi_handler.c +51 -0
  1058. package/src/platforms/nes/lib/c/nmi_trampoline.s +25 -0
  1059. package/src/platforms/nes/lib/cc65-src/Makefile.inc +9 -0
  1060. package/src/platforms/nes/lib/cc65-src/_scrsize.s +24 -0
  1061. package/src/platforms/nes/lib/cc65-src/cclear.s +29 -0
  1062. package/src/platforms/nes/lib/cc65-src/chline.s +31 -0
  1063. package/src/platforms/nes/lib/cc65-src/clock.s +31 -0
  1064. package/src/platforms/nes/lib/cc65-src/clrscr.s +72 -0
  1065. package/src/platforms/nes/lib/cc65-src/color.s +68 -0
  1066. package/src/platforms/nes/lib/cc65-src/cpeekc.s +37 -0
  1067. package/src/platforms/nes/lib/cc65-src/cpeekcolor.s +8 -0
  1068. package/src/platforms/nes/lib/cc65-src/cpeekrevers.s +37 -0
  1069. package/src/platforms/nes/lib/cc65-src/cputc.s +95 -0
  1070. package/src/platforms/nes/lib/cc65-src/crt0.s +180 -0
  1071. package/src/platforms/nes/lib/cc65-src/cvline.s +31 -0
  1072. package/src/platforms/nes/lib/cc65-src/get_tv.s +37 -0
  1073. package/src/platforms/nes/lib/cc65-src/gotox.s +21 -0
  1074. package/src/platforms/nes/lib/cc65-src/gotoxy.s +22 -0
  1075. package/src/platforms/nes/lib/cc65-src/gotoy.s +22 -0
  1076. package/src/platforms/nes/lib/cc65-src/irq.s +19 -0
  1077. package/src/platforms/nes/lib/cc65-src/joy/nes-stdjoy.s +102 -0
  1078. package/src/platforms/nes/lib/cc65-src/joy_stat_stddrv.s +14 -0
  1079. package/src/platforms/nes/lib/cc65-src/libref.s +9 -0
  1080. package/src/platforms/nes/lib/cc65-src/mainargs.s +24 -0
  1081. package/src/platforms/nes/lib/cc65-src/neschar.s +4616 -0
  1082. package/src/platforms/nes/lib/cc65-src/ppu.s +158 -0
  1083. package/src/platforms/nes/lib/cc65-src/ppubuf.s +117 -0
  1084. package/src/platforms/nes/lib/cc65-src/randomize.s +18 -0
  1085. package/src/platforms/nes/lib/cc65-src/revers.s +27 -0
  1086. package/src/platforms/nes/lib/cc65-src/setcursor.s +37 -0
  1087. package/src/platforms/nes/lib/cc65-src/sysuname.s +39 -0
  1088. package/src/platforms/nes/lib/cc65-src/tgi/nes-64-56-2.s +480 -0
  1089. package/src/platforms/nes/lib/cc65-src/tgi_stat_stddrv.s +14 -0
  1090. package/src/platforms/nes/lib/cc65-src/tgi_stddrv.s +13 -0
  1091. package/src/platforms/nes/lib/cc65-src/waitvsync.s +18 -0
  1092. package/src/platforms/nes/lib/cc65-src/wherex.s +19 -0
  1093. package/src/platforms/nes/lib/cc65-src/wherey.s +19 -0
  1094. package/src/platforms/nes/lib/clear_nametable.s +38 -0
  1095. package/src/platforms/nes/lib/clear_oam.s +18 -0
  1096. package/src/platforms/nes/lib/load_palette.s +31 -0
  1097. package/src/platforms/nes/lib/nmi_safe.s +65 -0
  1098. package/src/platforms/nes/lib/oam_dma.s +16 -0
  1099. package/src/platforms/nes/lib/read_pad.s +46 -0
  1100. package/src/platforms/nes/lib/reset.s +46 -0
  1101. package/src/platforms/nes/lib/sprite_table_populate.s +75 -0
  1102. package/src/platforms/nes/lib/wait_vblank.s +12 -0
  1103. package/src/platforms/nes/palette.js +39 -0
  1104. package/src/platforms/nes/ppu.js +372 -0
  1105. package/src/platforms/sms/MENTAL_MODEL.md +267 -0
  1106. package/src/platforms/sms/TROUBLESHOOTING.md +124 -0
  1107. package/src/platforms/sms/UPSTREAM_SOURCES.md +29 -0
  1108. package/src/platforms/sms/image-to-tilemap.js +260 -0
  1109. package/src/platforms/sms/lib/README.md +117 -0
  1110. package/src/platforms/sms/lib/c/joypad_read.c +33 -0
  1111. package/src/platforms/sms/lib/c/load_palette.c +24 -0
  1112. package/src/platforms/sms/lib/c/load_tiles.c +32 -0
  1113. package/src/platforms/sms/lib/c/sms_crt0.s +101 -0
  1114. package/src/platforms/sms/lib/c/sms_hw.h +53 -0
  1115. package/src/platforms/sms/lib/c/sms_music.c +178 -0
  1116. package/src/platforms/sms/lib/c/sms_music.h +50 -0
  1117. package/src/platforms/sms/lib/c/sms_sfx.c +82 -0
  1118. package/src/platforms/sms/lib/c/sms_sfx.h +40 -0
  1119. package/src/platforms/sms/lib/c/sprite_table.c +60 -0
  1120. package/src/platforms/sms/lib/c/vblank_wait.c +10 -0
  1121. package/src/platforms/sms/lib/c/vdp_init.c +58 -0
  1122. package/src/platforms/sms/lib/header.s +33 -0
  1123. package/src/platforms/sms/lib/joypad_read.s +40 -0
  1124. package/src/platforms/sms/lib/load_palette.s +30 -0
  1125. package/src/platforms/sms/lib/load_tiles.s +50 -0
  1126. package/src/platforms/sms/lib/sprite_table.s +44 -0
  1127. package/src/platforms/sms/lib/vblank_wait.s +36 -0
  1128. package/src/platforms/sms/lib/vdp_init.s +47 -0
  1129. package/src/platforms/sms/vdp.js +530 -0
  1130. package/src/platforms/snes/MENTAL_MODEL.md +275 -0
  1131. package/src/platforms/snes/TROUBLESHOOTING.md +208 -0
  1132. package/src/platforms/snes/UPSTREAM_SOURCES.md +50 -0
  1133. package/src/platforms/snes/brr.js +208 -0
  1134. package/src/platforms/snes/image-to-tilemap.js +227 -0
  1135. package/src/platforms/snes/lib/audio/apu_blob.asm +228 -0
  1136. package/src/platforms/snes/lib/audio/apu_blob.bin +0 -0
  1137. package/src/platforms/snes/lib/audio/explosion.brr +0 -0
  1138. package/src/platforms/snes/lib/audio/sample_bank.bin +0 -0
  1139. package/src/platforms/snes/lib/audio/shoot.brr +0 -0
  1140. package/src/platforms/snes/lib/audio/spc_driver.asm +241 -0
  1141. package/src/platforms/snes/lib/audio_pipeline.asm +62 -0
  1142. package/src/platforms/snes/lib/c/crt0.asm +125 -0
  1143. package/src/platforms/snes/lib/c/hdr.asm +50 -0
  1144. package/src/platforms/snes/lib/c/snes_sfx.c +116 -0
  1145. package/src/platforms/snes/lib/c/snes_sfx.h +96 -0
  1146. package/src/platforms/snes/lib/c/snes_sfx_data.asm +25 -0
  1147. package/src/platforms/snes/lib/cgram_upload.asm +43 -0
  1148. package/src/platforms/snes/lib/lorom_header.asm +47 -0
  1149. package/src/platforms/snes/lib/lorom_multibank.asm +66 -0
  1150. package/src/platforms/snes/lib/nmi_safe.asm +77 -0
  1151. package/src/platforms/snes/lib/oam_upload.asm +45 -0
  1152. package/src/platforms/snes/lib/pad_read.asm +64 -0
  1153. package/src/platforms/snes/lib/pvsneslib/LICENSE +21 -0
  1154. package/src/platforms/snes/lib/pvsneslib/include/ctype.h +6 -0
  1155. package/src/platforms/snes/lib/pvsneslib/include/float.h +4 -0
  1156. package/src/platforms/snes/lib/pvsneslib/include/hdr.asm +47 -0
  1157. package/src/platforms/snes/lib/pvsneslib/include/limits.h +13 -0
  1158. package/src/platforms/snes/lib/pvsneslib/include/math.h +10 -0
  1159. package/src/platforms/snes/lib/pvsneslib/include/setjmp.h +4 -0
  1160. package/src/platforms/snes/lib/pvsneslib/include/snes/background.h +396 -0
  1161. package/src/platforms/snes/lib/pvsneslib/include/snes/console.h +188 -0
  1162. package/src/platforms/snes/lib/pvsneslib/include/snes/dma.h +381 -0
  1163. package/src/platforms/snes/lib/pvsneslib/include/snes/input.h +289 -0
  1164. package/src/platforms/snes/lib/pvsneslib/include/snes/interrupt.h +264 -0
  1165. package/src/platforms/snes/lib/pvsneslib/include/snes/libversion.h +10 -0
  1166. package/src/platforms/snes/lib/pvsneslib/include/snes/lzss.h +43 -0
  1167. package/src/platforms/snes/lib/pvsneslib/include/snes/map.h +113 -0
  1168. package/src/platforms/snes/lib/pvsneslib/include/snes/object.h +234 -0
  1169. package/src/platforms/snes/lib/pvsneslib/include/snes/pixel.h +53 -0
  1170. package/src/platforms/snes/lib/pvsneslib/include/snes/scores.h +66 -0
  1171. package/src/platforms/snes/lib/pvsneslib/include/snes/snestypes.h +65 -0
  1172. package/src/platforms/snes/lib/pvsneslib/include/snes/sound.h +245 -0
  1173. package/src/platforms/snes/lib/pvsneslib/include/snes/sprite.h +456 -0
  1174. package/src/platforms/snes/lib/pvsneslib/include/snes/video.h +465 -0
  1175. package/src/platforms/snes/lib/pvsneslib/include/snes.h +190 -0
  1176. package/src/platforms/snes/lib/pvsneslib/include/stdarg.h +28 -0
  1177. package/src/platforms/snes/lib/pvsneslib/include/stdbool.h +53 -0
  1178. package/src/platforms/snes/lib/pvsneslib/include/stddef.h +27 -0
  1179. package/src/platforms/snes/lib/pvsneslib/include/stdint.h +7 -0
  1180. package/src/platforms/snes/lib/pvsneslib/include/stdio.h +9 -0
  1181. package/src/platforms/snes/lib/pvsneslib/include/stdlib.h +13 -0
  1182. package/src/platforms/snes/lib/pvsneslib/include/string.h +19 -0
  1183. package/src/platforms/snes/lib/pvsneslib/include/strings.h +5 -0
  1184. package/src/platforms/snes/lib/pvsneslib/source/Makefile +87 -0
  1185. package/src/platforms/snes/lib/pvsneslib/source/backgrounds.asm +834 -0
  1186. package/src/platforms/snes/lib/pvsneslib/source/consoles.asm +1028 -0
  1187. package/src/platforms/snes/lib/pvsneslib/source/crt0_snes.asm +329 -0
  1188. package/src/platforms/snes/lib/pvsneslib/source/dmas.asm +1275 -0
  1189. package/src/platforms/snes/lib/pvsneslib/source/hdr.asm +56 -0
  1190. package/src/platforms/snes/lib/pvsneslib/source/input.asm +445 -0
  1191. package/src/platforms/snes/lib/pvsneslib/source/libc.asm +485 -0
  1192. package/src/platforms/snes/lib/pvsneslib/source/libc_c.c +1214 -0
  1193. package/src/platforms/snes/lib/pvsneslib/source/libm.asm +510 -0
  1194. package/src/platforms/snes/lib/pvsneslib/source/libtcc.asm +374 -0
  1195. package/src/platforms/snes/lib/pvsneslib/source/lzsss.asm +256 -0
  1196. package/src/platforms/snes/lib/pvsneslib/source/maps.asm +1078 -0
  1197. package/src/platforms/snes/lib/pvsneslib/source/objects.asm +2881 -0
  1198. package/src/platforms/snes/lib/pvsneslib/source/scores.asm +226 -0
  1199. package/src/platforms/snes/lib/pvsneslib/source/sm_spc.asm +187 -0
  1200. package/src/platforms/snes/lib/pvsneslib/source/snesmodwla.asm +1186 -0
  1201. package/src/platforms/snes/lib/pvsneslib/source/sounds.asm +273 -0
  1202. package/src/platforms/snes/lib/pvsneslib/source/sprites.asm +3946 -0
  1203. package/src/platforms/snes/lib/pvsneslib/source/vblank.asm +917 -0
  1204. package/src/platforms/snes/lib/pvsneslib/source/videos.asm +1137 -0
  1205. package/src/platforms/snes/lib/reset_init.asm +31 -0
  1206. package/src/platforms/snes/lib/sprite_table_populate.asm +122 -0
  1207. package/src/platforms/snes/lib/vram_dma_upload.asm +42 -0
  1208. package/src/platforms/snes/ppu.js +606 -0
  1209. package/src/playtest/playtest.js +612 -0
  1210. package/src/rom-id/identifier.js +421 -0
  1211. package/src/rom-id/patch.js +217 -0
  1212. package/src/toolchains/_worker/pool.js +253 -0
  1213. package/src/toolchains/_worker/run.js +78 -0
  1214. package/src/toolchains/_worker/wasm-worker.js +233 -0
  1215. package/src/toolchains/arm-none-eabi-gcc/gcc.js +208 -0
  1216. package/src/toolchains/asar/asar.js +542 -0
  1217. package/src/toolchains/assemble-snippet.js +256 -0
  1218. package/src/toolchains/cc65/cc65.js +395 -0
  1219. package/src/toolchains/cc65/da65.js +119 -0
  1220. package/src/toolchains/cc65/dbgparse.js +274 -0
  1221. package/src/toolchains/cc65/preset-resolver.js +59 -0
  1222. package/src/toolchains/cc65/presets/nes/chr-ram-runtime.cfg +79 -0
  1223. package/src/toolchains/cc65/presets/nes/chr-ram-runtime.crt0.s +178 -0
  1224. package/src/toolchains/cc65/presets/nes/chr-ram.cfg +76 -0
  1225. package/src/toolchains/cc65/presets/nes/chr-ram.crt0.s +106 -0
  1226. package/src/toolchains/common/ar.js +121 -0
  1227. package/src/toolchains/common/sdk-cache.js +116 -0
  1228. package/src/toolchains/common/symbols.js +139 -0
  1229. package/src/toolchains/dasm/dasm.js +96 -0
  1230. package/src/toolchains/gba-c/gba-c.js +832 -0
  1231. package/src/toolchains/genesis-c/README.md +61 -0
  1232. package/src/toolchains/genesis-c/genesis-c.js +598 -0
  1233. package/src/toolchains/index.js +727 -0
  1234. package/src/toolchains/m68k-elf-gcc/gcc.js +220 -0
  1235. package/src/toolchains/m68kdasm.js +438 -0
  1236. package/src/toolchains/parse-errors.js +258 -0
  1237. package/src/toolchains/registry.js +67 -0
  1238. package/src/toolchains/rgbds/rgbds.js +144 -0
  1239. package/src/toolchains/sdcc/preflight-lint.js +295 -0
  1240. package/src/toolchains/sdcc/sdcc.js +519 -0
  1241. package/src/toolchains/sjasm/sjasm.js +85 -0
  1242. package/src/toolchains/sm83dasm.js +194 -0
  1243. package/src/toolchains/snes-c/snes-c.js +409 -0
  1244. package/src/toolchains/tcc816/tcc816.js +79 -0
  1245. package/src/toolchains/vasm68k/vasm68k.js +138 -0
  1246. package/src/toolchains/wladx/wladx.js +120 -0
  1247. package/src/toolchains/z80dasm.js +303 -0
package/AGENTS.md ADDED
@@ -0,0 +1,726 @@
1
+ # romdev — Agent guide
2
+
3
+ You are reading this because romdev is connected. This is the orientation. Read it once; you won't need to re-read it during a session.
4
+
5
+ ## What this server does
6
+
7
+ Drives the full homebrew ROM dev loop for retro game platforms (NES, Game Boy, SNES, Genesis, Atari 2600/7800, Lynx, C64, plus SMS/GG/MSX/Coleco). Build → run → screenshot → inspect → patch → iterate. Also: disassemble existing ROMs, convert assets, study patterns from real games, drive emulator state for scripted testing. Bundled WASM toolchains and emulator cores — no system dependencies, no installs.
8
+
9
+ You drive the work. The human is a director — they may want a game, a ROM disassembly, a tool-assisted reverse-engineering session, or anything else this server can do.
10
+
11
+ ## If a human is watching, open playtest early
12
+
13
+ If a human is sitting next to you during this session — and that's most sessions in practice — open the playtest window as soon as your first build succeeds. `playtest()` opens a native SDL window that runs your ROM live and accepts USB gamepads (hot-plugged controllers are picked up automatically). It returns **immediately** — the render loop runs in the background, so you keep calling other tools while the human plays. Every other MCP tool keeps working against that same running ROM, and **`runSource`/`loadMedia` rebuilds update the window in place** — the window follows your latest build, no relaunch and no crash on rebuild. A human sitting next to you should be **playing the game** while you iterate, not watching screenshots scroll past.
14
+
15
+ ```
16
+ loadCategory({category:"show"}) // registers playtest / playtestStop / playtestStatus / playtestFramebuffer
17
+ playtest() // opens the SDL window (returns immediately)
18
+ ```
19
+
20
+ After that, keep iterating with `runSource` / `buildSource` / readMemory / screenshot exactly as before — they all act on the live emulator the user is playing. Because the window and `screenshot()` read the **same** live host, what you screenshot is what the human sees. (If you ever need to be explicit — e.g. to double-check the human's exact frame — `playtestFramebuffer()` captures the window's framebuffer directly, with `source`/`loadedMediaPath`/`frameCount` metadata.)
21
+
22
+ **No gamepad?** `playtest()`'s response includes a `keyboardControls` map and a `tellUser` note when no controller is detected — relay the keys to the human (arrows = D-pad, Z = main action, Enter = START, ESC closes) so they know how to play.
23
+
24
+ Skip playtest only when there's clearly no human in the loop: CI runs, automated test suites, batch reverse-engineering, or when the user has explicitly said "headless." `playtest()` needs a desktop display; with none it returns `{opened:false, reason:"no-display"}` and tells you how to relaunch the server with the display env — every other tool (build, run, screenshot, inspect) is fully headless and unaffected. When in doubt, ask once, then default to opening it.
25
+
26
+ ## Tool surface: everything is loaded — just call the tool
27
+
28
+ **All ~101 tools are registered and callable from session init. You do NOT need `loadCategory` first.** If you see a tool name anywhere in this doc or via `listCategories`, you can call it right now.
29
+
30
+ (We used to lazy-load tools behind `loadCategory` to keep the surface small. It caused more harm than good — agents burned round-trips re-loading categories and got confused about what was callable. So the full surface loads up front. If a server is explicitly run in lean mode — `ROMDEV_LEAN_TOOLS=1` — then only an entry tier loads and you arm the rest with `loadCategory`; that's the exception, not the default.)
31
+
32
+ `listCategories` still exists as a **map of what's available, grouped by purpose** — useful for discovery, not a gate:
33
+
34
+ - `platforms` — which platforms + languages are supported
35
+ - `run` — load ROMs, step frames, screenshot (works for existing ROMs you didn't compile)
36
+ - `input` — drive controllers, look up hardware bit layouts
37
+ - `state` — savestates and forensic state inspection
38
+ - `memory` — read/write VRAM/OAM/CGRAM/ARAM and other regions
39
+ - `debug` — inspectSprites, getCPUState, **disassemble**, symbol lookup, palette inspection, whichTilesAreRendered, addressToSymbol
40
+ - `assets` — convert PNGs to tiles, WAVs to BRR, identify ROMs, plus the hacking toolkit (`patchFile`, `assembleSnippet`, `diffRoms`, `findFreeSpace`, `spliceCHR`, `extractCart`, `wrapRomFromParts`)
41
+ - `project` — starter snippets per platform
42
+ - `show` — `playtest` (open the live SDL window for a human), `playtestStop`, `playtestStatus`, `playtestFramebuffer` (capture exactly what the human's window shows)
43
+ - `advanced` — runUntil, watchMemory / runUntilWrite, input recording
44
+
45
+ **"Disassemble this NES ROM"** is now just: `disassembleRom({path, startAddress, length})`. No discovery step.
46
+
47
+ **If your session ever returns a 404 "session not found"** (the server restarted), your MCP client should auto-reconnect (re-`initialize`) — and the fresh session again has every tool loaded. You don't re-arm anything. If your client does NOT auto-reconnect on 404, restart its MCP connection once; that's a client limitation, not a server step.
48
+
49
+ ## Large output: write to a path, or ask for it inline
50
+
51
+ Tools that can return a LARGE payload (ROM bytes, full disassembly, big memory dumps, build logs, tile blobs, **and screenshots/inspect images**) follow ONE rule so they don't silently flood your context:
52
+
53
+ - **`inline: false` is the default → you MUST pass an output path** (`outputPath` / `outputDir` / `path`). The payload is written there and you get back just `{ path, bytes }`. Calling such a tool with neither a path nor `inline:true` returns a clear error telling you which to pass.
54
+ - **`inline: true` → the payload comes back in the response** (base64 / hex / text / the image). Use this when you actually want it in context.
55
+
56
+ There is **no hidden default location** — nothing ever lands in a temp dir you can't find, so you never lose a ROM to `/tmp`. You (the agent) decide where output goes; pass your project directory.
57
+
58
+ Ergonomic exceptions:
59
+ - **Small reads stay inline.** `readMemory` of ≤4 KB returns hex inline with no path needed (peeking a few RAM/OAM/palette bytes is the common case). Only large reads require a path/inline.
60
+ - **`runSource` returns its screenshot inline by default** — its whole purpose is "build + run + show me." Pass `screenshotPath` only if your client can't display inline images.
61
+
62
+ **On images specifically:** the `inline:true` image is only useful if YOUR client actually delivers inline images to you — some clients silently drop or down-convert image content. If you're not certain you can see them, **work from the structured data instead**: `inspectSprites` / `inspectPalette` / `getRenderingContext` always return their decoded JSON (sprite lists, palette entries, render flags) regardless of inline/path, and `screenshot({format:'ascii'})` gives a text render. The inline PNG is an opt-in luxury, not the primary signal.
63
+
64
+ ## Trust hierarchy — where to find ground truth (R58 + R58b)
65
+
66
+ Two parallel paths depending on what you need:
67
+
68
+ ### Path A — Scaffold a working project (the dumb-model-friendly path)
69
+
70
+ Most agent sessions start here. You want a working ROM, not a
71
+ research project. Use the high-level scaffolding tools and don't
72
+ worry about ground truth:
73
+
74
+ 1. **`createProject({platform, template, name, path})`** — drops a
75
+ complete, self-contained project tree on disk (main.c + the
76
+ runtime files it needs + your `vendor/` library source for
77
+ reference + README + .gitignore). Build with `runSource` against
78
+ the project's files; the bundled examples ARE the reference
79
+ implementation.
80
+ 2. **`createGame({platform, genre})`** — same but picks a known-good
81
+ genre scaffold (shmup / platformer / puzzle / sports / racing).
82
+ 3. **`getStarterSnippet({platform, name})`** /
83
+ **`getAllStarterSnippets({platform})`** /
84
+ **`copyStarterSnippets({platform, destinationDir})`** — fetch
85
+ vetted helper files (reset routine, read_pad, OAM DMA, palette
86
+ upload, etc.) when building from a smaller starting point.
87
+ `copyStarterSnippets` writes the files to disk in one call
88
+ without round-tripping bytes through your context — preferred
89
+ when you're scaffolding into a project dir.
90
+
91
+ For most workflows, path A is all you need. Read MENTAL_MODEL.md +
92
+ TROUBLESHOOTING.md when stuck. File a feedback round if the bundled
93
+ examples are wrong.
94
+
95
+ ### Path B — Debug when the bundled code disagrees with behavior
96
+
97
+ When the example builds clean but doesn't render / sound / behave
98
+ right, when an API call doesn't do what you expect, when you need
99
+ ground truth on what a library function actually does — dig in this
100
+ order:
101
+
102
+ 1. **Bundled examples** (`examples/<platform>/templates/*.{c,asm}`) —
103
+ verified to compile + (usually) run. Start here for the working pattern.
104
+ 2. **Your own project's runtime source** (alongside `main.c`) — our
105
+ thin wrappers (gb_runtime.c, lynx_sfx.c, sms_vdp_init.c, etc.).
106
+ All ~50-200 lines, fully readable. Read these when an API call
107
+ isn't doing what you expect.
108
+ 3. **Your own project's `vendor/` library source** (R58b — auto-
109
+ copied into every project at scaffold time). The FULL source of
110
+ every library your ROM links against — `vendor/cc65/libsrc/<p>/`
111
+ for cc65 platforms, `vendor/libtonc/src/` + `vendor/libgba/src/`
112
+ for GBA, `vendor/pvsneslib/source/` for SNES, `vendor/sgdk/src/`
113
+ for Genesis. **`grep -rn <symbol> vendor/`** inside your project
114
+ finds the actual implementation of any library function. No MCP
115
+ call needed.
116
+ 4. **`getPlatformDoc({platform, name:"upstream_sources"})`** — per-
117
+ platform pointers at every bundled source path + upstream GitHub
118
+ links for the compilers + emulators we DON'T bundle (cc65,
119
+ sdcc, m68k-gcc, snes9x, gambatte, handy, etc.). Use as a
120
+ cheat-sheet for "where do I look for X?"
121
+ 5. **Upstream GitHub** for compilers + emulators when the bug is
122
+ below our thin wrappers. Don't bundle (gigabytes for gcc/binutils
123
+ source) but the link is one click.
124
+ 6. **Hit a real bug in romdev itself?** Open an issue at
125
+ https://github.com/monteslu/romdev/issues with repro details. File
126
+ only with a diagnosis (not bare "it doesn't work") — read the bundled
127
+ source first.
128
+
129
+ **Important constraint on path B:** the `vendor/` library source is
130
+ **read-only in practice**. You can read + grep it freely, but if
131
+ you EDIT a file there, the linker still uses our precompiled
132
+ `libtonc.a` / `libmd.a` / etc., so your ROM won't pick up the
133
+ change. R59 (planned) will fix this with a per-TU object cache +
134
+ source-first library build. Until then, treat `vendor/` as a window
135
+ into "what the linked code actually does."
136
+
137
+ The "vendor/" library source in your project is new in R58b (it was
138
+ previously in the install only; you'd have to call
139
+ `copyStarterSnippets` to pull it in). Now it lands automatically
140
+ when you `createProject`. Round 30/31 Lynx wedges took 5 friction
141
+ rounds partly because cc65's TGI driver source wasn't visible;
142
+ post-R58b you can `grep -rn bar_c vendor/cc65/libsrc/lynx/` from
143
+ inside your project directory and read the actual blitter code.
144
+
145
+ **Practical rule for path B:** if you find yourself filing a
146
+ feedback round without first `grep`ping `vendor/` for the symbol
147
+ you're debugging, you're skipping the cheap diagnosis path. The
148
+ bundled examples are starting points, NOT ground truth — when they
149
+ disagree with behavior, trust the library source over the example.
150
+
151
+ ### Which path to use
152
+
153
+ - **Just need a working game** → Path A. Use createGame, iterate.
154
+ - **Hit a bug or unexpected behavior** → switch to Path B.
155
+ - **Don't know which** → start in Path A; if iterations fail to
156
+ converge after 2-3 attempts, you're hitting something path A
157
+ can't fix and need path B.
158
+
159
+ ### Where files land in your project tree
160
+
161
+ A scaffolded project (whether via `createProject` or `createGame`) is
162
+ **FLAT** for everything you author. `main.c` / `main.asm`, your
163
+ helper modules (e.g. `gb_runtime.c`, `nes_runtime.c`,
164
+ `atari7800_sfx.c`, `vcs_constants.h`), the platform crt0 + linker
165
+ config — all sit at the project root, next to each other. Asm
166
+ `include "vcs_constants.h"` / C `#include "gb_runtime.h"` resolves
167
+ without `-I` flags because dasm / cc65 / sdcc all default to the
168
+ current directory.
169
+
170
+ The **only** subdir you'll see at scaffold time is `vendor/` —
171
+ that's the read-only library source tree (cc65 libsrc, libtonc /
172
+ libgba src, PVSnesLib source, SGDK src) auto-bundled by R58b so
173
+ you can `grep -rn vendor/` when debugging. Don't put your own
174
+ source under `vendor/`.
175
+
176
+ So when `copyStarterSnippets` drops e.g. `read_joystick.asm` into
177
+ your project dir, it lands at `./read_joystick.asm` (alongside
178
+ `main.asm`), NOT under `./include/` or `./lib/`. Every platform
179
+ follows the same flat layout.
180
+
181
+ ## Supported platforms
182
+
183
+ **13 tier-1 platforms** (build + run + screenshot + inspect + ≥5 genre scaffolds + sound + music + per-platform MENTAL_MODEL.md + TROUBLESHOOTING.md):
184
+
185
+ NES, Game Boy, Game Boy Color, SNES, Genesis, Game Boy Advance, SMS, Game Gear, C64, Atari 2600, Atari 7800, Lynx — all with `createGame({genre: shmup|platformer|puzzle|sports|racing})` available except Atari 2600 (asm-only — no genre scaffolds). The `platformer` scaffold side-scrolls (hardware camera + per-platform column streaming) on every one of these except NES, which is single-screen. Every tier-1 platform also ships a `music_demo` template using the platform's de-facto music engine: FamiTone2 (NES), hUGEDriver (GB/GBC), SPC700 driver (SNES), XGM2 via SGDK (Genesis), maxmod + .xm soundbank (GBA), PSG trackers (SMS/GG), SID sequencer (C64), `lynx_snd_play` (Lynx), 2-voice TIA (Atari 2600/7800).
186
+
187
+ **Bring-up only** (build pipeline works, single `default` template, no genre scaffolds or sound/music wrappers yet): MSX, ColecoVision. Both use SDCC z80 same as SMS/GG — the genre scaffolds are queued.
188
+
189
+ **Delisted** (toolchain works but core-side issue blocks the run loop): Atari 5200 (atari800 BIOS-load path), ZX Spectrum (fuse tape-load path).
190
+
191
+ Call `listPlatforms` (in the `platforms` category) for the live capability matrix, including per-platform language defaults and quirks. **Defaults are picked to maximize agent effectiveness** — for every platform that has a bundled C compiler, C is the default (LLMs write C cleanly; the compiler handles register allocation + memory mapping). Platforms whose only bundled toolchain is an assembler default to asm. Override with `language: "asm"` or `language: "c"` when you specifically need the non-default.
192
+
193
+ For maintainers: the platform / core / patch / region-ID matrix and the recipe for adding a new platform live in the project repo at https://github.com/monteslu/romdev.
194
+
195
+ ## Deep debug tooling status per platform
196
+
197
+ Different platforms have different levels of MCP-exposed debugging — different hardware needs different tools, and we've patched the cores where it's been worth it. Generic shapes (inspectSprites, inspectPalette, getCPUState) work cross-platform; coverage as of this writing:
198
+
199
+ - **SNES** (snes9x patched): inspectSprites, inspectPalette, getCPUState({cpu:'main'|'spc700'}), getDspState (full per-voice + master mixer), readMemory regions for OAM/CGRAM/ARAM/FillRAM. Audio + video both deeply introspectable.
200
+ - **NES** (fceumm patched): inspectSprites, inspectPalette, getCPUState (6502), getRenderingContext (PPUCTRL/PPUMASK decoded → active CHR bank + file offset), readMemory regions for OAM/Palette/Nametables/CHR/CPU_REGS/PPU_REGS/APU_REGS.
201
+ - **Genesis** (gpgx patched): inspectSprites, inspectPalette, getCPUState({cpu:'main'}) for 68K, getYm2612State (limited — internal struct), getPsgState, readMemory regions for CRAM/VSRAM/VDP_REGS/Z80_RAM/M68K/YM2612/PSG/VRAM.
202
+ - **SMS / Game Gear** (gpgx patched): inspectSprites (SAT decode + sprite-sheet PNG), inspectPalette (6-bit BGR for SMS, 12-bit BGR for GG), inspectPatternTiles (4bpp interleaved, 16KB VRAM as 512-tile sheet), getCPUState (Z80 — A/F/BC/DE/HL/IX/IY/shadows + flags + interrupt state), getRenderingContext (VDP regs → name table / BG-tile / sprite-tile / SAT addresses + scroll + display state), readMemory regions for sms_vram, sms_cram, sms_vdp_regs, sms_z80_regs (gg_vram, gg_cram for Game Gear's 64-byte palette). disassembleRom + findReferences run through a built-in JS Z80 decoder with full prefix coverage (CB/ED/DD/FD/DDCB/FDCB) and the same auto-label / register-annotation / file-offset / untilReturn pipeline as NES/SNES.
203
+ - **Game Boy / Game Boy Color** (gambatte patched): inspectSprites (40-sprite OAM decode + sprite-sheet PNG with sprite-priority + h/v flip), inspectPalette (DMG: BGP/OBP0/OBP1 byte decode → 4 shades each; GBC: 64-byte BCPS/OCPS palette RAM → 8 palettes × 4 colors BGR555), inspectPatternTiles (384 tiles from $8000-$97FF), getCPUState (SM83 — A/F/BC/DE/HL + flags + IME/halt), getRenderingContext (LCDC bit-by-bit, scroll, LY/LYC, window, GBC extras: VRAM bank / KEY1 / BCPS/OCPS index), readMemory regions for gb_vram, gb_oam, gb_io, gb_hram, gb_bgpdata, gb_objpdata, gb_cpu_regs. disassembleRom + findReferences route through a built-in JS SM83 decoder with full CB-prefix coverage + SM83-specific opcodes (`ld (hl+),a`, `ldh`, `reti`, `ld hl,sp+e8`).
204
+ - **Toolchains:** default is **C** via SDCC's sm83 port (same SDCC that powers SMS/GG/MSX/Coleco). For hand-tuned asm, pass `language:"asm"` to route through RGBDS. The C path uses `__sfr __at 0xFFNN` to bind GB I/O regs; helper headers under `src/platforms/gb/lib/c/gb_hardware.h` define LCDC/STAT/SCY/SCX/LY/BGP/OBP0/OBP1/etc. for both DMG and CGB. The SDCC 4.4.0 codegen quirk (`for (;;) { switch + write to __sfr }` crashes the register allocator) applies — use `do { ... } while (1)` and table-lookup writes instead.
205
+ - **Atari 2600** (stella2014 patched): inspectPalette (NTSC 128-color palette PNG; current background luma+hue extracted from TIA snapshot), inspectSprites (no OAM — returns the 5 graphics objects state P0/P1/M0/M1/Ball + a current-scanline PNG showing TIA composition), getCPUState (6502 — A/X/Y/P/SP/PC from the M6502 internal regs), getRenderingContext (decodes the 32-byte TIA snapshot into playfield/sprite/colors), readMemory regions for `system_ram` (128 bytes of RIOT RAM), `a26_tia_regs` (32-byte TIA snapshot), `a26_cpu_regs` (7-byte 6502 snapshot). disassembleRom + findReferences anchor to the top of the bank ($F000-$FFFF) with vector-table labels (NMI/RESET/IRQ at $FFFA).
206
+ - **Atari 7800** (prosystem patched): inspectPalette (256-color master PNG; MARIA palette block at $20-$3F decoded into 8 palettes × 3 colors + backdrop), inspectSprites (no OAM — returns the MARIA control regs + the DPP display-list-list pointer for the agent to walk), getCPUState (6502 — A/X/Y/P/SP/PC from prosystem's sally globals), getRenderingContext (MARIA CTRL bits + DPP + CHARBASE + dlistPtr), readMemory regions for `system_ram` (the entire 64KB 6502 address space — MARIA regs, RAM, ROM all visible) + `a78_cpu_regs`. disassembleRom + findReferences default to the top 16KB ($C000-$FFFF) where the reset vector lands.
207
+ - **Commodore 64** (vice patched): inspectPalette (the 16-color hardware-fixed palette PNG + current border/background/extra-bg indices decoded from VIC-II regs), inspectSprites (8 MOBs decoded into the generic shape with X/Y/color/multicolor/expand-X/expand-Y/priority + the screen-RAM sprite-data pointers at $07F8 so the agent can locate sprite pixel blocks), getCPUState (6510 — A/X/Y/P/SP/PC from a `#define`-aliased live register file + the I/O port at $0001 decoded into LORAM/HIRAM/CHAREN), getRenderingContext (VIC-II regs decoded into mode/scroll/colors/sprites, VIC bank from CIA2 $DD00, absolute screen + char base addresses), readMemory regions for `system_ram` (64 KB RAM), `c64_color_ram` (1 KB), `c64_vic_regs` (64 B), `c64_sid_regs` (29 B via sid_peek), `c64_cia1_regs`/`c64_cia2_regs` (16 B each from `c_cia[]`), `c64_cpu_regs` (7 B). disassembleRom + findReferences accept `.prg` files (2-byte load-address header) and the C64 register annotation table for VIC-II / SID / CIA registers. Starter snippets cover vic_init / sprite_table / sid_play / read_joystick / basic_stub.
208
+ - **MSX, ColecoVision**: standard system_ram + save_ram + video_ram. Deeper introspection not yet added — extend by patching their cores following the snes9x/gpgx/fceumm/vice pattern (see scripts/patches/).
209
+
210
+ Starter snippets per platform live under `src/platforms/<platform>/lib/`. Discover via `listStarterSnippets({platform})`, fetch via `getStarterSnippet({platform, name})`. SNES + NES + Genesis + SMS + Game Boy + Atari 2600 + Atari 7800 have substantial snippet libraries; others are minimal.
211
+
212
+ ## ROMs are finalized for real hardware automatically
213
+
214
+ `buildSource` / `runSource` return ROMs that boot on **real hardware,
215
+ flashcarts, and strict emulators (RetroDECK / RetroArch)** — not just our
216
+ lenient WASM cores. The build pipeline runs each platform's required
217
+ post-link finalize step for you. **You do NOT need to checksum, pad, or
218
+ header-patch the output yourself.** What gets fixed:
219
+
220
+ - **Genesis** — padded to a 128KB boundary (min 512KB) + `$18E` checksum.
221
+ - **GB / GBC** — `rgbfix`: Nintendo logo ($0104), header checksum ($014D),
222
+ global checksum, CGB flag ($0143 = $00 for `.gb`, $C0 for `.gbc`).
223
+ - **SMS** — `TMR SEGA` header at $7FF0 + checksum ($7FFA) + region/size byte
224
+ (export region $4) so the SMS BIOS doesn't reject it. (GG BIOS doesn't
225
+ check, but it's written anyway.)
226
+ - **SNES** — padded to a power of 2 (min 32KB) + internal checksum ($FFDE) +
227
+ complement ($FFDC), LoROM/HiROM auto-detected.
228
+ - **NES** — the iNES header is emitted by the linker config; nothing to add.
229
+
230
+ Why this matters: our WASM emulator skips the boot-ROM validation that real
231
+ hardware runs, so a ROM can look perfect in `screenshot`/`playtest` yet fail
232
+ to boot on a console or RetroDECK. The finalize step closes that gap. The
233
+ build response `romLayout` / `log` states what was applied.
234
+
235
+ ## First, try runSource
236
+
237
+ **`runSource` is the primary tool.** It does build + load + run + screenshot
238
+ in a single call, returning the image inline. Reach for it before any 4-call
239
+ sequence of buildSource → loadMedia → stepFrames → screenshot.
240
+
241
+ ```js
242
+ runSource({
243
+ platform: "gbc",
244
+ source: /* your C or asm */,
245
+ frames: 60,
246
+ holdInputs: [{ a: true }], // optional — hold buttons during the run
247
+ })
248
+ ```
249
+
250
+ Round trip is ~50-500 ms depending on platform. Use it for fast iteration,
251
+ prototyping, "does my change still render correctly", "does the d-pad
252
+ move the sprite". When you change a line of code, the next call is usually
253
+ just another `runSource` with the same args.
254
+
255
+ **Where it shines:**
256
+ - Trying out a new game-loop change
257
+ - Verifying a sprite renders at the right position
258
+ - Testing input handling — `holdInputs: [{right: true}]` for 60 frames and
259
+ see if the player moved right
260
+ - Quick "did I break it" sanity checks after a refactor
261
+
262
+ You don't need `loadMedia` / `stepFrames` / `screenshot` separately for any
263
+ of these. The 4-call workflow only matters when you want to drive multiple
264
+ emulator-state changes within one ROM lifetime (e.g. screenshot at frame 30,
265
+ save state, screenshot at frame 60, etc.).
266
+
267
+ ## Going deeper
268
+
269
+ When `runSource` is too coarse, the long-form workflow:
270
+
271
+ 1. `buildSource({ platform, source })` → get a ROM as base64 bytes
272
+ 2. `loadMediaBytes({ platform, base64 })` → load without disk I/O
273
+ 3. `stepFrames({ frames: N })` or `runUntil({ condition })` → advance time
274
+ 4. `screenshot()` for vibes, `getTile`/`tileFingerprints` for byte-precise work, `readMemory` for game state
275
+ 5. `setInput` / `pressButton` / `inputSequence` to drive the game
276
+ 6. `saveState("checkpoint")` / `loadState("checkpoint")` for try/undo
277
+
278
+ ## Build errors
279
+
280
+ Every build tool returns `issues: [{file, line, col, severity, message, stage}, ...]`. Use that array, not the raw `log`. If `issues` is empty but `ok: false`, fall back to `log`.
281
+
282
+ **Crash isolation (R12).** Every WASM toolchain call runs in a child worker process. If a tool aborts (`_abort()`, SIGSEGV, OOM), only the worker dies — the MCP server keeps running, all other agent sessions are unaffected, tool registration + save states + playtest windows survive. The build response surfaces as `{ ok: false, stage: "crash", log: "[crash] worker exited unexpectedly — signal=… code=…", crash: { exitCode, signal } }`. Treat `stage: "crash"` as "the toolchain blew up — log the args + source somewhere durable so it can be triaged; you can keep iterating in this session without reconnecting".
283
+
284
+ ## ROM hacking workflow
285
+
286
+ The full byte-patch loop is six MCP calls, no custom scripts:
287
+
288
+ ```js
289
+ identifyRom({ path }) // 1. what is it?
290
+ disassembleRom({ path, startAddress, untilReturn:true })
291
+ // 2. find the target
292
+ // (auto-tagged reset/nmi/irq labels,
293
+ // HW register names, file-offset
294
+ // comments — for NES, BOTH .nes and
295
+ // prg.bin offsets emitted —
296
+ // mapper-aware addresses)
297
+ assembleSnippet({ cpu, origin, code: "lda #$00\nrts" })
298
+ // 3. encode replacement bytes
299
+ writeMemory({ region:"system_ram", offset:0xRAM, hex })
300
+ // 4. VERIFY first — write the value
301
+ // on the live emulator, watch for
302
+ // the expected behavior. Cheaper than
303
+ // a wrong patch.
304
+ patchFile({ path, offset, hex, expect: "<current bytes>" })
305
+ // 5. patch with safety check —
306
+ // refuses if existing bytes differ
307
+ diffRoms({ platform, a: original, b: patched }) // 6. verify the patch landed
308
+ loadMedia({ platform, path: patched }) → screenshot() // 7. run it
309
+ ```
310
+
311
+ **Finding the right byte first.** Static disasm reading is the slow part —
312
+ multiple `cmp #$XX` instructions look identical. Don't guess. Use
313
+ `watchMemory` / `runUntilWrite` to step the emulator until the byte you
314
+ care about changes, then read the returned PC + use the file-offset
315
+ comments on the matching disasm line to know exactly what to patch.
316
+
317
+ ```js
318
+ runUntilWrite({ region:"system_ram", offset:0x03B6, maxFrames:300,
319
+ pressDuring:[{ frame:30, button:"A" }] })
320
+ → { pc: "$E3AF", changes:[{ before:31, after:32 }] }
321
+ disassembleRom({ path, startAddress: 0xE3AF, length: 32 })
322
+ → exact writing instruction, with both .nes and prg.bin offsets
323
+ ```
324
+
325
+ All in the `assets` category except `disassembleRom` (in `debug`).
326
+
327
+ **Tools for hacking, by category:**
328
+
329
+ - `patchFile({path, offset, hex, expect, allowExpand})` — generic byte
330
+ splicer with safety check. THE primitive — every other hack tool
331
+ composes through it. `expect` refuses the write if existing bytes don't
332
+ match, catching the silent corruption when a patch authored against
333
+ region A is applied to region B.
334
+ - `assembleSnippet({cpu, origin, code})` — assemble a tiny chunk of asm
335
+ to raw bytes. No header, no linker config, no segments. Supports
336
+ `6502 / 65c02 / 65816 / 68k / z80 / sm83 / gb / gbc / huc6280`.
337
+ Z80 NOTE: sdas dialect requires `#` on immediates (`ld a,#5`, not
338
+ `ld a,5`).
339
+ - `diffRoms({platform, a, b})` — mapper-aware ROM diff. Reports CPU
340
+ addresses (NROM-128 mirrors correctly, SNES LoROM banks as `XX:XXXX`),
341
+ per-region tallies (PRG vs CHR vs header), and `tile: N` annotations
342
+ on CHR changes for direct sprite-hack identification.
343
+ - `findFreeSpace({path, minLength, fillBytes})` — locate runs of $FF
344
+ or $00 for asm overlays. Sorted longest-first.
345
+ - `findReferences({path, platform, address})` — find every instruction
346
+ that references a target address. Classifies refs as
347
+ `call/jump/branch/read/write/use/ref`. Walks the vector table too.
348
+ Limitation: only direct addressing modes; indirect/computed jumps
349
+ not detected.
350
+ - `spliceCHR({path, platform, pngBase64, tileIndex, expect, bank, paletteHint})` —
351
+ composition: PNG → tile bytes → splice into CHR at tile slot N.
352
+ Auto-locates iNES CHR base. `expect` checks the existing tile bytes.
353
+ `bank: N` (NES) replaces magic file offsets; `paletteHint:["#RRGGBB",...]`
354
+ gives explicit RGB→palette-index mapping (skips the default quantization
355
+ that requires PNGs with exactly 4 distinct grayscale levels).
356
+ - `watchMemory({region, offset, length, frames, pressDuring})` /
357
+ `runUntilWrite({region, offset, maxFrames, pressDuring})` — frame-level
358
+ memory-write trace. Reports every change with PC, so you can map a
359
+ RAM byte back to the writing code path. Cross-platform. The "find
360
+ the byte" half of hacking, mechanized.
361
+ - `whichTilesAreRendered()` — at the current emulator state, walk the
362
+ BG nametable + OAM and return the set of tile IDs actually being
363
+ drawn. Sample at known game states (title / gameplay / menu) and diff
364
+ the sets to map tile IDs to game assets without scanning sheets by eye.
365
+ - `extractCart({path, outputDir})` — split ROM into standard parts
366
+ (NES: header.bin/prg.bin/chr.bin; SNES: copier_header + rom + internal
367
+ header; Genesis: vectors/header/body; GB: boot/header/body) plus a
368
+ manifest.json with mapper, mirroring, etc.
369
+ - `wrapRomFromParts({platform, ...})` — counterpart to extractCart.
370
+ Emits `wrapperSource` (.s) + `linkerConfig` (cc65 ld65 cfg) ready
371
+ for buildSource. Per-platform templates.
372
+ - `disassembleRom` — see "Disassembler" section below for the full
373
+ annotation set.
374
+
375
+ For graphics swaps specifically:
376
+ - `extractSpriteSheet({platform, path, bank, paletteFromEmulator, paletteIndex})`
377
+ from a source game → PNG of its tiles. `bank: N` (NES 4 KB CHR bank
378
+ index) replaces magic file-offset math. `paletteFromEmulator: true`
379
+ + `paletteIndex` colors the export with the live game palette
380
+ (instead of grayscale) — much easier to recognize art and edit in a
381
+ pixel tool.
382
+ - `crossPlatformSpriteImport({sourceRom, sourcePlatform, sourceBank,
383
+ sourceTileX/Y/W/H, targetPlatform, outputPng, intent, paletteIndex})`
384
+ — one-call lift of a tile region from a source game's ROM into the
385
+ target platform's tile format. Combines extract + crop + quantize +
386
+ optional manifest. Under `intent:"homebrew"` reads the live source
387
+ palette automatically (same `paletteFromEmulator` semantics as
388
+ `extractSpriteSheet`); under `intent:"rom-hack"` preserves source
389
+ bytes verbatim. Output PNG + manifest feed straight into
390
+ `loadSpriteSheet`.
391
+ - `convertImageToTiles({ platform, pngBase64 })` → target-platform tile bytes
392
+ - `spliceCHR` to write them into the CHR region of your target ROM
393
+ (handles the convertImageToTiles + patchFile composition in one call)
394
+
395
+ ## Disassembler
396
+
397
+ `disassembleRom` ships with every annotation enabled by default:
398
+
399
+ ```js
400
+ disassembleRom({path, platform:"nes", startAddress:0xC184,
401
+ length:64, untilReturn:true})
402
+ // →
403
+ // reset: sei ; C184 78 x @0x194 (prg @0x184)
404
+ // cld ; C185 D8 . @0x195 (prg @0x185)
405
+ // lda #$00 ; C186 A9 00 .. @0x196 (prg @0x186)
406
+ // sta $2000 ; C188 8D 00 20 .. @0x198 (prg @0x188) PPUCTRL
407
+ // ldx #$FF ; C18B A2 FF .. @0x19B (prg @0x18B)
408
+ // ...
409
+ ```
410
+
411
+ What you get:
412
+ - **Vector labels** (`reset:`, `nmi:`, `irq:`) auto-tagged from the iNES /
413
+ SNES / Genesis vector tables. For SMS/GG, fixed Z80 vectors are tagged:
414
+ `reset:` at $0000, `rst08`/`rst10`/`rst18`/`rst20`/`rst28`/`rst30:` at
415
+ their RST addresses, `irq:` at $0038 (SMS vblank handler), `nmi:` at
416
+ $0066 (pause button). For GB/GBC, the SM83 vectors get the same
417
+ treatment plus the dedicated IRQ vectors: `vblank:` at $0040,
418
+ `lcd_stat:` at $0048, `timer:` at $0050, `serial:` at $0058,
419
+ `joypad:` at $0060, and `entry:` at $0100. `autoLabelVectors:false`
420
+ to turn off.
421
+ - **Hardware register names** (`; PPUCTRL`, `; PPUMASK`, `; SND_CHN`,
422
+ `; VRAM`, `; LCDC`, `; VDP_CTRL`, `; IO_PORT_A` etc) on any operand
423
+ that hits a known platform register. NES + SNES + Genesis + GB + SMS/GG
424
+ tables built in. `annotateRegisters:false`.
425
+ - **File-offset comments** (`; @0xNNNN`) on every disassembled line —
426
+ mapper-aware, so $C184 on NROM-128 correctly reports `@0x194`. Direct
427
+ input to `patchFile.offset`. For NES iNES files, the header-stripped
428
+ PRG offset is ALSO reported (`@0x194 (prg @0x184)`) so you can patch
429
+ either the `.nes` file or `prg.bin` from extractCart without doing
430
+ the -16 math. `annotateFileOffsets:false` to turn off.
431
+ - **Mapper-aware addressing**: NROM-128 mirror at $C000, MMC1/MMC3/UxROM
432
+ top bank fixed at $C000, SMS sega-mapper slot-0/1/2 1:1 file mapping,
433
+ GB/GBC slot 0 fixed + slot 1 banked (pass `bank` to target a non-
434
+ default ROM bank). No more manual `startAddress: 49152` because the
435
+ disassembler understood the mapping.
436
+ - **`endAddress` alternative to `length`** — disassemble "from X to Y"
437
+ without computing byte count yourself.
438
+ - **`untilReturn: true`** — truncates at the first `rts/rti/rtl/bare jmp`
439
+ (6502) or `ret/reti/retn/bare jp` (Z80) or `ret/reti/bare jp/jp hl`
440
+ (SM83). Combine with an auto-tagged `reset:` label to grab exactly
441
+ one routine.
442
+ - **`dataRanges: [{start, length}]`** — mark address ranges as `.byte`
443
+ tables instead of bizarre disassembled "code." Useful for embedded
444
+ sprite tables, music data, lookup tables.
445
+ - **`outputPath`** — writes raw asm to disk instead of returning a
446
+ 188KB JSON wad. Returns `{outputPath, asmBytes, asmLines}` for log/inspection.
447
+
448
+ 6502-family disassembly runs through cc65's da65 (WASM); Z80 + SM83
449
+ disassembly runs through built-in pure-JS decoders with full prefix
450
+ coverage (Z80: CB/ED/DD/FD/DDCB/FDCB; SM83: CB only — no ED/DD/FD on GB).
451
+ DD/FD/DDCB/FDCB). Annotations are post-processing in both paths.
452
+
453
+ ## CHR/tile tools — file vs emulator source
454
+
455
+ `getTile`, `inspectPatternTiles`, `extractSpriteSheet`, `tileFingerprints`,
456
+ and `tilesAscii` all accept an optional `path` arg:
457
+ - **With `path` set**: reads CHR straight from a file (iNES auto-locates
458
+ CHR; raw `.chr`/`.bin` files read as-is). Use to survey assets BEFORE
459
+ loading. Response reports `source: "file"`.
460
+ - **Without `path`**: reads from the running emulator's pattern table /
461
+ VRAM. Response reports `source: "emulator"`.
462
+
463
+ ## Demake / enhance / cross-platform workflow
464
+
465
+ The full "take game X on platform A, make it on platform B" pipeline:
466
+
467
+ 1. Study source: `loadMedia({ platform: A, path })`, `recordSession`, `disassembleRom`
468
+ 2. Rip art: `extractSpriteSheet({ platform: A, path })` returns a PNG sheet
469
+ 3. Recook art: `convertImageToTiles({ platform: B, pngBase64 })` re-encodes in B's tile format and bit depth
470
+ 4. Write target game: `runSource({ platform: B, source })` for fast iteration
471
+ 5. Embed converted art: `patchRom` to inject the new CHR/tile bytes
472
+
473
+ The tile codec handles 4 bit-layouts × 4 bit-depths. NES↔GB is byte-exact at 2bpp. Going up in bit depth (NES→SNES) gains palette headroom. Going down (Genesis→GB) requires color quantization that the codec does automatically.
474
+
475
+ ### Lifting a CHARACTER (not a rectangular tile region) — use meta-sprite capture
476
+
477
+ `extractSpriteSheet` / `cropSpriteSheet` / `crossPlatformSpriteImport` work on **rectangular tile-grid regions**. That is the WRONG model for a real character, which is built from **multiple independent hardware sprites** (OAM/SAT entries), each with its own position, size, tile index, palette, flips, priority, and a non-contiguous tile range. Cropping a screenshot or a tile sheet looks right and then renders as garbage in-game because the hardware multi-cell tile order differs per platform (Genesis is column-major; SNES large OBJ + NES/GB 8×16 are their own orders). The meta-sprite tools handle all of it. Works on **genesis, snes, nes, gb, gbc, sms, gg** (C64 MOBs are 24×21 bitmaps, not tiles — not supported):
478
+
479
+ 1. `loadMedia` → step / press to a frame where the character is fully on screen (NOT a menu — if no sprites are up, captures come back empty).
480
+ 2. `groupVisibleSprites({platform})` → clusters on-screen OAM/SAT entries into objects, largest-first (usually the player). Pick a group's `slots`.
481
+ 3. `captureMetaSprite({platform, slots:[...] /* or rect:{x,y,w,h} */, name:"enemy", emit:"both", outputDir:"..."})` → writes `tiles.bin`, `palette.bin`/`.json`, `layout.json`, `preview.png` (re-rendered from the EXPORTED data, not a screenshot crop), and a platform-idiomatic `<name>.h`. Hardware tile order is preserved per platform.
482
+ 4. Inspect `preview.png`. Re-verify any time with `renderMetaSpritePreview({tilesPath, layoutPath})` — no rebuild needed.
483
+ 5. Include `<name>.h` (Genesis → SGDK `_draw()` helper; NES/GB → shadow-OAM cell table; SNES → oamSet pieces; SMS → SAT cells) — or get it later via `emitMetaSpriteRenderer`. Build with `runSource`.
484
+
485
+ This keeps the lifted asset faithful to the source ROM's hardware composition instead of the lossy crop-the-screenshot fallback.
486
+
487
+ ## Visual vs programmatic inspection
488
+
489
+ You have two modes. Pick per task:
490
+
491
+ **Image mode** — `screenshot`, `inspectPatternTiles`, `inspectBackgroundMap({ render: true })`, `inspectPalette`. Returns PNGs. Best for aesthetic judgment ("does this look right?", "did the explosion play?").
492
+
493
+ **Text mode** — `getTile`, `tilesAscii`, `tileFingerprints`, `readMemory`. Returns structured data or ASCII art. Best for precise comparison ("is this tile blank?", "did $00F4 change between frame 60 and 90?", "find all tiles whose hash matches X").
494
+
495
+ Both work fine. Image mode is more flexible but burns more tokens per call. Use text mode for scans and diffs, image mode for "does this look like Mario?" questions.
496
+
497
+ ## NES-specific (most common platform)
498
+
499
+ Patched fceumm exposes extra memory regions beyond the libretro standard:
500
+
501
+ | Region | Contents |
502
+ | ----------------- | ---------------------------------------------- |
503
+ | `system_ram` | 2KB CPU RAM ($0000-$07FF) |
504
+ | `nes_chr` | 8KB CHR (gathered from VPage[0..7]; R59 fixed an off-by-page-offset bug that returned zeros for offsets >= 4096 — if you see CHR uploads "fail" only above 4 KB, you're on a pre-R59 build) |
505
+ | `nes_nametables` | 2KB CIRAM (background tile maps) |
506
+ | `nes_palette` | 32 bytes ($3F00-$3F1F) |
507
+ | `nes_oam` | 256 bytes sprite list (64 sprites × 4 bytes) |
508
+
509
+ OAM format: bytes per sprite are `[y, tileIndex, attributes, x]`.
510
+
511
+ `inspectBackgroundMap({ render: true })` composites the active CHR + nametable + palette into a real 256×240 PNG — what the BG layer would look like even if rendering is currently disabled.
512
+
513
+ ## Save-state semantics
514
+
515
+ `saveState(name)` / `loadState(name)` slots are **in-memory** and discarded when you call `shutdown` or load new media. To persist, `writeAsset({ path, base64: <get base64 from somewhere> })` after a `saveState`.
516
+
517
+ `reset()` resets the frame counter and the core's state but keeps the loaded ROM.
518
+
519
+ ## Project scaffolding
520
+
521
+ Three shapes, pick the one that matches what you're doing:
522
+
523
+ - **`createProject({ platform, name, path, template? })`** — writes a starter directory: `main.{c,asm,s}` (from `examples/<platform>/templates/`) + every runtime file the template depends on (headers, crt0, linker .cfg) + README + `.gitignore`. Self-contained: take it elsewhere and rebuild with stock cc65/sdcc, no romdev install needed. Defaults to `template:"default"` (smallest visible-and-runnable program); most tier-1 platforms also have `hello_sprite` + `tile_engine` + the 5 genre templates.
524
+
525
+ - **`createProject({ ..., withSnippets: true })`** — same as above, **plus** drops every vetted starter snippet for the platform alongside main.c. Use when you want "main.c + every helper file ready to edit" in one shot, without picking a genre. Snippets that overlap with the template's runtime are skipped (no double-writes). Response includes `snippetsCopied: string[]`.
526
+
527
+ - **`createGame({ platform, genre })`** — genre-shaped scaffold (`shmup` / `platformer` / `puzzle` / `sports` / `racing`). Higher-level than createProject — picks the right template + runtime + crt0 + linker config for the genre. Available on **NES, GB, GBC, SNES, Genesis, SMS, GG, C64, GBA, Lynx, Atari 7800** — i.e. every platform that has genre templates. Availability is derived from the registered templates (not a hardcoded list), so the error message for an unsupported platform always names the current set; Atari 2600 (asm-only) + MSX + ColecoVision (bring-up only) have no genre scaffolds and are rejected. Ships a complete working ROM with state machine + sprite allocation + sound wired — fill in gameplay logic on top. **Want a side-scroller? Use `genre:"platformer"`** — and on every platform EXCEPT NES the scaffold already side-scrolls: a hardware camera follows the player (SCX/$D016/R8/BG?HOFS/REG_BG?HOFS/bgSetScroll depending on platform), with software tile-column streaming where the world is wider than one nametable/plane. NES is still single-screen (platforms drawn as sprites); to make it scroll, draw platforms into the background nametables + `ppu_scroll(camX,0)` (it flips the PPUCTRL nametable-select bit past 256 px) + stream columns past 512 px. Each platformer's `describe` text gives the per-platform specifics; the scroll-register details live in the platform's MENTAL_MODEL.md "Horizontal scrolling" section.
528
+
529
+ Then iterate with `runSource` against the source you read from `path/main.*`.
530
+
531
+ ## Symbol-aware debugging
532
+
533
+ **cc65 targets (NES, C64, Atari 5200/7800, Lynx) — full pipeline:**
534
+
535
+ ```js
536
+ buildSourceWithDebug({ platform, source }) // returns binary + .dbg
537
+ resolveSymbol({ dbg, name: "score" }) // → 0x0072
538
+ lookupAddress({ dbg, address: 0x8042 }) // → "main + 14"
539
+ listSymbols({ dbg }) // full memory map
540
+ ```
541
+
542
+ cc65 prepends `_` to C identifiers: C `score` → asm `_score`. `resolveSymbol` tries both spellings.
543
+
544
+ **SDCC targets (GB, GBC, SMS, GG, MSX, Coleco, ZXSpectrum) — partial pipeline (R54):**
545
+
546
+ ```js
547
+ buildSourceWithDebug({ platform: "gb", source })
548
+ // returns { ok, toolchain:"sdcc", binaryBase64, mapText, mapHint, ... }
549
+ ```
550
+
551
+ You get `mapText` (the sdld link map). `resolveSymbol`/`lookupAddress`/`getMemoryMap` don't parse it yet (queued). For now grep `mapText` directly — every static + global is on a line of the form `AAAAAAAA _symbol_name _source_unit` where AAAAAAAA is the absolute hex address. The response's `mapHint` field includes a ready-to-use regex. C identifiers get a leading underscore in the map; asm symbols don't. Example:
552
+
553
+ ```js
554
+ const { mapText } = JSON.parse(r.content[0].text);
555
+ const m = mapText.match(/^\s*([0-9A-F]+)\s+_score\b/m);
556
+ const addr = m ? parseInt(m[1], 16) : null; // e.g. 0xC100
557
+ ```
558
+
559
+ ## Playtest mode (optional)
560
+
561
+ `playtest({ scale: 3 })` opens a real SDL window for a human to play the loaded ROM with a keyboard or USB controller. It **returns immediately** — the render loop runs in the background and you keep using every other tool against the same live host (so `runSource`/`loadMedia` rebuilds update the window in place; it does not relaunch or crash on rebuild). Close it with `playtestStop` (or the human pressing ESC / Select+Start). Needs a desktop display *and* the optional `@kmamal/sdl` dep; with neither it returns `{opened:false, reason:...}` and the rest of the server keeps working headless. Use this when the human wants to feel the game, not when you want to test it (for your own checks, use `screenshot` — it reads the same live host the window shows). `playtestStatus` reports liveness + the window's media/frame; `playtestFramebuffer` captures exactly what the human sees.
562
+
563
+ ## Common gotchas
564
+
565
+ - **CHR-RAM vs CHR-ROM**: Most NES homebrew uses CHR-RAM. CHR tools (`getTile`, `inspectPatternTiles`, `tileFingerprints`, `tilesAscii`, `extractSpriteSheet`) all accept an optional `path` arg — pass it to read CHR from the iNES file (CHR-ROM carts), omit to read live CHR-RAM from the running emulator. Response always reports `source: "file" | "emulator"`. NES homebrew built with `linkerConfig:"chr-ram"` has no CHR in the file — must read from the emulator after upload.
566
+ - **Mapper-aware addressing**: NES NROM 16KB carts mirror PRG at $8000 and $C000 (`disassembleRom` reports the canonical $C000+ addresses since that's where the reset vector points). Banked mappers (MMC1/MMC3/UxROM) have the top 16KB fixed at $C000 with bank 0 at $8000 by default — pass a startAddress in the right range to disassemble a different bank.
567
+ - **C64 isn't a console**: media is `.prg` / `.d64` / `.t64`, not "ROM". `loadMedia` takes a `mediaKind` arg; auto-defaults are usually right.
568
+ - **Atari 5200 build works but doesn't run**: cc65 produces .a52 files, but our atari800 core needs Asyncify which isn't yet wired into the host. Use Atari 7800 or Lynx if you want a 6502 platform that actually runs.
569
+ - **Genesis BG init**: a freshly-booted Genesis ROM shows a black screen for many frames because VDP init is slow. Step 60+ frames before screenshotting.
570
+ - **`framesRun` is monotonic**: `loadState` restores the core but doesn't roll back our frame counter. Use it for state, not for "what frame am I on" precision.
571
+
572
+ ## Before writing input or memory-layout code
573
+
574
+ Two tools that save real time and frustration:
575
+
576
+ - `getInputLayout({ platform })` — returns the platform's controller protocol, bit order, libretro id mapping, AND which buttons physically exist. Read this before writing an asm `read_pad` routine OR before designing controls (so you don't bind to a button the platform doesn't have).
577
+ - `getMemoryMap({ dbg, platform })` — after `buildSourceWithDebug`, returns where every variable in your source actually landed in memory, grouped by region (zeropage / system RAM / code / data). cc65 reserves the first 2 zeropage bytes for its runtime; your first `.res 1` lands at `$02`, not `$00`. Don't guess.
578
+
579
+ ## Cross-platform inputs
580
+
581
+ `setInput` accepts an Xbox-shaped controller: D-pad, 4 face buttons (use `north/east/south/west` for portable code — they translate per platform), shoulders (`l/r`), triggers (`l2/r2`), sticks (`l3/r3`), plus `start`/`select`. Older platforms are subsets — `getInputLayout` tells you which buttons are real. Pressing a non-existent button is a silent no-op.
582
+
583
+ ## Starter snippets
584
+
585
+ `listStarterSnippets({ platform })` and `getStarterSnippet({ platform, name })` give you vetted boilerplate — reset routine, `read_pad`, OAM DMA, palette upload, nametable clear. Each snippet's comments encode foot-guns prior agent sessions already hit. Always check what's available for your platform before writing platform-specific boilerplate from scratch. NES, SNES, SMS, GG, GB/GBC, Genesis, GBA, C64, Atari 7800 all have substantial snippet libraries.
586
+
587
+ **Three ways to actually use them:**
588
+
589
+ - `getStarterSnippet({platform, name})` — one snippet's contents, returned as a string.
590
+ - `getAllStarterSnippets({platform, language?})` — every snippet joined into one string. Useful for **reading**; the giant blob lands in your context.
591
+ - **`copyStarterSnippets({platform, destinationDir, language?, include?})`** — writes every snippet (or a filtered subset) straight to disk. **Bytes never pass through your context.** Use this when you're scaffolding into a project dir. Flattens `lib/<lang>/foo.c` → `<destinationDir>/foo.c`. Optional `include: ["vdp_init", "joypad_read"]` whitelist for cherry-picking. Default `overwrite: true` (vetted boilerplate is meant to be regenerated).
592
+
593
+ Or skip the separate call entirely: `createProject({withSnippets: true})` does the same thing as a one-shot.
594
+
595
+ ## Don't burn your own context with binary data
596
+
597
+ The biggest mistake agents make on this server is reading binary files into their own context just to forward them to a tool. Don't. Every tool that consumes large binary inputs accepts paths:
598
+
599
+ - `loadMedia({ platform, path })` instead of `loadMediaBytes({ base64 })`
600
+ - `buildSource({ sourcePath, binaryIncludePaths, includePaths, outputPath })` — paths in AND a path back out (`binaryPath`). Inline base64 only on opt-in `inline: true`.
601
+ - `imageToTilemap({ platform, pngPath, outputDir })` — full-screen PNG → deduped tiles + tilemap + palette, input from disk, output to disk. **This is the tool for splash/title screens** (see the splash-screen section below). Supported: nes, snes, genesis, sms, gg, gb, gbc, c64.
602
+ - `screenshot({ path })` — writes PNG to disk, skips inline payload
603
+ - `extractSpriteSheet({ outputPath })` — same
604
+ - `pcmToBrr({ pcmPath, outputPath })` — same
605
+
606
+ When a tool has `path` and `base64` variants, prefer `path`. The server runs on the same machine; both sides share the filesystem. There's no reason to round-trip 50KB of base64 through your prompt.
607
+
608
+ ## Art-first workflow (user does the pixel art, agent wires the ROM)
609
+
610
+ For users who'd rather paint sprites in LibreSprite than write tile bytes by hand, four asset-loader tools parse FOSS editor outputs directly into platform-native tile data — no `convertImageToTiles` + ImageMagick chain, no installs beyond the editor itself.
611
+
612
+ - **`loadAsepriteSheet({ path, platform, outputDir })`** — parse `.ase` (LibreSprite, GPLv2 fork of Aseprite). Returns deduped `tile_bytes` + named `tiles[sliceName] = { tile_indices, width_tiles, height_tiles }` + `tags[name] = { from, to, delays_ms[] }` for animations. Indexed-mode .ase preserves the artist's palette; RGBA mode falls back to platform-master nearest-neighbour. The artist names their slices ("player_idle", "chalice") → game code references the same names. **The killer DX feature** for art-led projects.
613
+
614
+ - **`loadTilemap({ path, platform, outputDir })`** — parse Tiled `.tmj` (BSD, the de facto FOSS level editor; export as JSON, not XML `.tmx`). Returns per-layer `data` blob + `empty_mask` bitfield (so "no tile" stays distinguishable from "tile 0") + `object_layers[name]` with named placements (player_start, doors, chests) and arbitrary key/value properties. **Multi-layer + object support** means the artist owns level design end-to-end, including spawn data.
615
+
616
+ - **`loadGifAnimation({ path, platform, outputDir, frame_indices? })`** — extract frames + delays from any GIF. Every editor exports GIF; this is the universal animation pipeline. omggif under the hood — no native deps. Caveat: doesn't apply GIF disposal, so export with `Disposal: Replace` for full-frame anims.
617
+
618
+ - **`loadSpriteSheet({ pngPath, manifestPath, platform, outputDir })`** — TexturePacker-style PNG+JSON. LibreSprite's `Export Sprite Sheet → JSON-Hash` writes this directly. Supports `meta.frameTags` for animation grouping.
619
+
620
+ **Palette interop:**
621
+
622
+ - `getPlatformPalettePng({ platform, format: "png" | "lospec" | "hex", outputPath? })` — `"png"` is the swatch sheet for `-remap` dithering (existing behavior). `"lospec"` returns `{name, author, colors:[hex_no_hash]}` for direct LibreSprite/lospec.com import. `"hex"` returns one `#RRGGBB` per line — universal interchange.
623
+
624
+ - `convertImageToTiles` now validates the input PNG against the platform's master palette (PLTE for indexed PNGs, distinct-RGB scan for truecolor) with ±8/channel tolerance and surfaces colors-outside-gamut as `warnings[]`. Doesn't throw — silent color shift was the most common newbie failure; now it's loud.
625
+
626
+ **Workflow walkthrough** + canonical glue code: [`examples/art-first-workflow/README.md`](examples/art-first-workflow/README.md). Six-step path from picking a Lospec palette through `loadAsepriteSheet` + `loadTilemap` to a working ROM.
627
+
628
+ For repeated builds in an iteration loop, this compounds: a 256KB SNES ROM in 20 build cycles = 7 MB of base64 text accumulated in your context. Paths cost ~60 bytes per call.
629
+
630
+ ## Splash / title / full-screen background images — USE `imageToTilemap`, do NOT hand-roll
631
+
632
+ If you want a full-screen picture (a splash screen, title card, cutscene still, status panel), there is exactly ONE correct path. **Do not write your own PNG→tile loop** — packing 4bpp/2bpp bitplanes, deduping tiles, assigning palette lines, and building the name-table entry words by hand is fiddly and the failure mode is ugly: the image comes out with the right *shapes* but wrong colors (everything one color) and vertical striping/choppiness. That means your tile bytes were raw RGB-ish values instead of palette indices, or the bit packing/row stride was off.
633
+
634
+ The correct workflow (all platforms with a tilemap — nes, snes, **genesis**, sms, gg, gb, gbc, c64):
635
+
636
+ 1. **Size the source** to the platform's screen: Genesis **320×224**, NES/SNES/SMS 256×224/256×192, GB 160×144, C64 320×200.
637
+ 2. **Quantize to the platform palette** so colors land on hardware-displayable values:
638
+ ```
639
+ getPlatformPalettePng({ platform:"genesis", format:"png", outputPath:"/tmp/pal.png" })
640
+ magick splash.png -dither FloydSteinberg -remap /tmp/pal.png splash_q.png
641
+ ```
642
+ 3. **Convert in one call:**
643
+ ```
644
+ imageToTilemap({ platform:"genesis", pngPath:"splash_q.png", outputDir:"out/" })
645
+ ```
646
+ You get `out/chr.bin` (deduped tiles), `out/nametable.bin` (tilemap entries), `out/palette.bin`, and `out/preview.png`. **Look at `preview.png`** — it's the tool re-rendering its own output, so if the preview is correct your in-game result will be too. If the preview is wrong, the input PNG is the problem, not the encode.
647
+ 4. **Wire it in:** DMA `chr.bin` to VRAM, load `palette.bin` into CRAM/CGRAM, write `nametable.bin` to your BG plane base. The response `note` tells you the exact sizes + where each blob goes per platform.
648
+
649
+ Genesis specifics: 4bpp tiles (32 B each), **40×28 cells**, up to **4 palette lines of 16 colors** — `imageToTilemap` bin-packs your image's colors across the lines and picks the right line per 8×8 cell automatically. Name-table entries are 16-bit big-endian. Set your Plane A width to 64 cells. The response's `genesis.warnings[]` flags any 8×8 cell that needs >16 colors (the VDP's hard limit) — if you see those, the source art has too many colors crammed into one cell; re-author or accept the approximation.
650
+
651
+ If a platform genuinely lacks a tilemap (Atari 2600 races the beam; 7800 uses display lists) `imageToTilemap` throws with an explanation — those need hand-authored per-scanline data, there is no automated path.
652
+
653
+ ## Known toolchain landmines
654
+
655
+ A few platform-tool quirks worth knowing up front:
656
+
657
+ - **asar (SNES) silent fails** on certain idioms: `$ - label` size expressions crash with a heap-pointer exit code (use `end_label - start_label` instead). Some opcode + operand arithmetic like `STA SYMBOL + N` where SYMBOL is `=`-defined also crashes silently — our preflight catches the common cases. When `ok: false, issues: []`, the wrapper now synthesizes a fallback issue with a hint.
658
+ - **asar bank-border-crossed** can happen if your `org` + `dw` runs past $00FFFF. Native vectors are at $FFE4-$FFEE; emulation vectors at $FFF4-$FFFF. Use `getStarterSnippet({ platform: "snes", name: "lorom_header.asm" })` for the layout.
659
+ - **cc65 (NES, C64, etc.) zero page** starts at $02. cc65 reserves $00-$01 for its runtime. Your first `.res 1` lands at $02, not $00. Use `getMemoryMap` after `buildSourceWithDebug` to confirm.
660
+ - **NES pattern table cap = 256 tiles per nametable**. The tilemap index is 8-bit, so per-frame BG can use at most 256 unique tiles per pattern table. Auto-converting a busy illustration usually overflows. `imageToTilemap` warns; the only workaround is mid-frame CHR bank switching (MMC3-class mapper).
661
+ - **NES + GB/GBC turnkey** (R9/R10 self-contained + sound, 2026-05-25): use `createProject({platform, template, name, path})` to scaffold a project. The pipeline copies every file the template depends on — `{nes,gb}_runtime.{h,c}`, `gb_hardware.h`, custom `crt0.s`, linker `.cfg`, `patch-header.js` (GB) — into the project directory alongside `main.c`. **No auto-injection at build time.** The build pipeline compiles exactly what you tell it via `sources` / `sourcesPaths` / `includes` / `includePaths` / `crt0` / `crt0Path` / `linkerConfig` / `codeLoc`. Take the project elsewhere with stock cc65/sdcc and it builds the same way. The runtime APIs include sprites, BG, input, AND **sound** — `sound_init` / `sound_play_tone(channel, period, vol, length)` / `sound_play_noise` / `sound_off`. NES drives pulse1+pulse2+triangle+noise via $4000-$400F + $4015; GB drives the 4-channel APU via NR10-NR52. SFX-grade, fire-and-forget — for full music tracks, drop in famitone2 (NES) or your own driver. Templates: `default` (palette cycle), `hello_sprite` (sprite + d-pad + **beep on A press**), `tile_engine` (multi-room tile map). Docs: [`src/platforms/nes/MENTAL_MODEL.md`](src/platforms/nes/MENTAL_MODEL.md) + [`TROUBLESHOOTING.md`](src/platforms/nes/TROUBLESHOOTING.md); [`src/platforms/gb/MENTAL_MODEL.md`](src/platforms/gb/MENTAL_MODEL.md) + [`TROUBLESHOOTING.md`](src/platforms/gb/TROUBLESHOOTING.md). **Game-loop order matters on NES:** stage `oam_clear`+`oam_spr` BEFORE `ppu_wait_nmi`, not after — the NMI handler DMA's whatever shadow_oam contains at vblank-start. **GB ROM header:** both asm and C builds now auto-run `rgbfix` inside `buildSource`, so the Nintendo logo + checksums + CGB flag are correct out of the box — no manual `patchGbHeader` step needed.
662
+ - **Game Boy / GBC silent-failure footguns** (R54 cleanup, full detail in `getPlatformDoc({platform:"gb"|"gbc", name:"mental_model"})`):
663
+ - **The bundled `gb_crt0.s` is now actually linked.** Pre-r54 a fundamental bug in `buildZ80C` was shipping the raw .s text to sdld as if pre-assembled — sdld silently rejected it and fell back to SDCC's stock sm83 crt0 (no GB cart boot, no IRQ vectors). Map showed no `init` symbol, $0000 was $FF, $0100 was $FF. Every GB ROM ran on stock crt0 invisibly. Fixed by auto-detecting .s source vs .rel object and running it through sdasgb first. Post-fix: `init` at $0150, entry $0100 = `00 c3 50 01` (nop; jp $0150), reset vector $0000 = $C9. **This was the root cause for #14 audio AND part of why every previous "runtime should work OOTB" round still felt friction-heavy.**
664
+ - **GB/GBC C builds now auto-fix the header at build time** (rgbfix runs inside `buildSource`): Nintendo logo at $0104, header checksum at $014D, global checksum, and the CGB flag at $0143 ($00 for `.gb`, $C0 for `.gbc`). You no longer need to call `patchGbHeader` manually — the ROM `buildSource` hands back boots on real hardware as-is. `patchGbHeader({path})` still exists if you want to override title / cart type / RAM size / etc. on an existing file.
665
+ - **`shadow_oam` is pinned at $C100** in the bundled `gb_runtime.c` via `__at(0xC100)`. OAM DMA reads ONLY the high byte and copies 160 bytes from `$XX00` — a plain `uint8_t my_oam[160]` may land at $C017 and DMA garbage. If you roll your own OAM buffer, pick an address with `0x00` low byte (e.g. $C200) and pass it directly to `oam_dma_copy`.
666
+ - **Call `enable_vblank_irq()` once at boot.** Without it, `wait_vblank()` busy-polls `LY` which updates only at WASM stepFrames quantum boundaries → game loop runs at ~1/30 intended speed on the emulator. After enable, `wait_vblank()` compiles to `HALT` + vblank IRQ wake (~10 cycles per frame).
667
+ - **Use `memcpy_vram(dst, src, n)` for VRAM bulk writes**, NOT raw `(uint8_t*)0x8000` casts — SDCC sm83 may elide the latter as dead code. The bundled `gb_hardware.h` declares every $FFxx register as `volatile`-typed so direct writes like `BGP = 0xE4;` are fine; the hazard is only on cast-through-pointer block copies.
668
+ - **`inspectBackgroundMap({platform:"gb"})` now renders a 256×256 PNG of the BG plane.** Pass `which: 1` for $9C00 map base, `window: true` to render the Window map instead. Returns `mapBase` + `mode` + `scy/scx` so you can see where the visible 160×144 region falls.
669
+ - **`readMemory({region:"video_ram"})` doesn't work on GB** — gambatte exposes VRAM as `gb_vram` (not the generic libretro id). r54 errors now suggest this directly. Also: `gb_oam`, `gb_io`, `gb_hram`, `gb_bgpdata`, `gb_objpdata`, `gb_cpu_regs`. `inspectPatternTiles` / `inspectBackgroundMap` / `inspectSprites` abstract over this.
670
+ - **SMS / Game Gear VDP footguns** (R53 cleanup, full detail in `getPlatformDoc({platform:"gg"|"sms", name:"mental_model"})`):
671
+ - **8 sprites per scanline** is a hard VDP limit. Extra sprites on the same Y row silently drop — symptom: "first 8 letters of CATCH THE COIN render, rest vanish." Split text across multiple Y rows OR draw it via the BG name table (no per-line limit).
672
+ - **GG OAM coords are hardware-space, NOT visible-space.** The libretro screenshot returns the 160×144 visible region but OAM bytes are still 256×192 hw-coord. Visible region = OAM x∈[48,207], y∈[24,167]. `inspectSprites` reports hardware coords too.
673
+ - **SAT $D0 is the renderer terminator.** R53 fixed `sms_sprite_init` / `gg_sprite_init` so they no longer fill Y with $D0 (they use $E0 now — off-screen but not the terminator). You only hit the trap if you write $D0 yourself; if sprites past a given slot are missing in `inspectSprites`, that's still the diagnosis.
674
+ - **R6 = 0xFB → sprite tiles at $0000**, not $2000 (older comments lied — fixed). Bit 2 SET = $2000, CLEAR = $0000. Trust `inspectSprites`' `spriteTileDataBase` field over comments.
675
+ - **SNES CHR/tilemap can overlap in VRAM** if you put them carelessly. CHR starts at word $0000; if your CHR is 16KB the tilemap can't be at word $2000. Put tilemap at word $4000 or later when your CHR is big.
676
+ - **SNES audio is a separate ROM build** — the Sony SPC700 coprocessor handles all sound; the main 65816 can only upload a driver + samples then send commands. Workflow: write your SPC driver in `arch spc700` .asm, `buildSource({platform:"spc700", source})` to flat raw bytes, then `.incbin` the result into your main 65816 .asm + write the $BBAA handshake at $2140-$2143 to upload it. `pcmToBrr({pcmPath, outputPath})` encodes 16-bit PCM into the SNES BRR format the SPC needs. See `src/platforms/snes/lib/audio_pipeline.asm` for the protocol overview, and the SPC driver bundled into any SNES game project scaffolded with a sound genre.
677
+ - **All SDCC-built platforms (GB, GBC, SMS, GG, MSX, ColecoVision)** share a few SDCC-sm83 / -z80 quirks. The detailed reference is [`src/platforms/gb/lib/c/SDCC_GOTCHAS.md`](src/platforms/gb/lib/c/SDCC_GOTCHAS.md).
678
+ **2026-05-25: The "for-loop + function-call crash family" (`dbuf_append_str NULL` assertion) is FIXED.** It was emscripten's default 64 KB stack overflowing the static `sm83_regs[]` table at runtime — not a SDCC codegen bug. Fixed by adding `-s STACK_SIZE=8388608` to `scripts/_lib.sh`. Patterns #1..#10 / #37 / #38 / #39 from previous agent notes all compile cleanly now. You don't need `unroll.h`, you don't need to split files into ≤200-line TUs, you don't need array-of-structs refactors. Write the natural code.
679
+ **C89-only.** SDCC sm83 is C89. No inline `for (int i = 0; ...)`, no mid-block declarations, no compound literals. SDCC's syntax-error line is usually wrong (points at the FIRST decl after non-decl code); use the linter's line numbers instead.
680
+ **Pre-flight linter:** `buildSource` runs a syntax scan before invoking SDCC. C89 violations show up in `issues[]` with `stage: "lint"` and a `ref:` pointing at the right GOTCHAS section. Pass `lint:"strict"` to fail the build on any lint hit; default is advisory. **The linter reports EVERY mid-block decl in a block**, ordinal-tagged (`#2`, `#3` etc.) so a subtle earlier decl doesn't silence the obvious later one (R53 fix). If a flagged line doesn't look like a decl to you, double-check: typedef'd names ending in `_t`, plus `struct`/`union`/`enum` declarations, all count.
681
+ **Multi-TU still helps iteration speed** (`sourcesPaths: {"main.c":..., "render.c":...}`): smaller TUs rebuild faster, easier to navigate. When a multi-TU build fails, the response includes `failedTU` + `compiledOK` so you know exactly which file to bisect.
682
+ SMS/GG: `createProject({platform:"sms"|"gg"})` ships `sms_crt0.s` / `gg_crt0.s` into the project automatically — these crt0s give a proper cartridge reset vector + IM 1 + stack setup before calling `main()`. SDCC's stock z80 crt0 traps `rst $08` and any VDP-touching code hangs at PC=$0007, so the bundled crt0 is mandatory for real-hardware boot. GB/GBC: see the NES + GB/GBC self-contained-project bullet above.
683
+
684
+ ## Session continuity — REUSE YOUR SESSION
685
+
686
+ **MCP sessions on romdev do NOT expire.** They are persistent for
687
+ the lifetime of the server process — which is hours/days, not minutes.
688
+ If you call `initialize` ONCE at conversation start, that same session
689
+ key works for every subsequent tool call all session long.
690
+
691
+ **DO NOT** call `initialize` again "just to be safe," "because the
692
+ session might have timed out," or "because it's been a few minutes."
693
+ None of those things happen here. Creating a fresh session every few
694
+ tool calls loses every category you loaded (you'd have to re-call
695
+ `loadCategory` for each one) and breaks the per-session emulator state
696
+ (loaded ROM, save states, scroll position, etc. live PER session).
697
+
698
+ You ONLY need to re-initialize in TWO cases:
699
+
700
+ 1. **Server restart.** You'll see HTTP 404 with "unknown session id"
701
+ on your next tool call. Send `initialize` once, then re-load any
702
+ categories you were using. You can confirm a restart by checking
703
+ the server's process lifetime — but really, just react to the 404
704
+ when it happens; don't preemptively reconnect.
705
+
706
+ 2. **`Mcp-Session-Id` header missing from your tool call.** If
707
+ somehow your client lost the session ID, you'll get an explicit
708
+ error pointing you at re-initialize. The header is sticky in
709
+ normal MCP client usage; you won't lose it without something going
710
+ wrong on the client side.
711
+
712
+ **Known historical friction (acknowledged 2026-05-25, since fixed):**
713
+ real-world agents previously reported losing connections ~30% of long
714
+ sessions. Server-side persistence is stable now. If you DO observe a
715
+ session drop without a server restart, open an issue at
716
+ https://github.com/monteslu/romdev/issues with the timing — it's a
717
+ regression we want to catch.
718
+
719
+ **Anti-pattern to AVOID:** opening a new session before every "block"
720
+ of work. This is almost always wrong, costs you all your `loadCategory`
721
+ state, and bloats the server's session table. One session per
722
+ conversation, end of story.
723
+
724
+ ## When in doubt
725
+
726
+ `listPlatforms` for capabilities. `getStatus` for what's currently loaded. `listToolchains` for build tools. `listStates` for save slots. Tools are introspectable; you don't have to remember the matrix.