romdevtools 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1110 -0
- package/CHANGELOG.md +525 -0
- package/LICENSE +45 -0
- package/NOTICE +102 -0
- package/README.md +84 -0
- package/examples/README.md +36 -0
- package/examples/art-first-workflow/README.md +209 -0
- package/examples/atari2600/main.asm +143 -0
- package/examples/atari2600/templates/default.asm +183 -0
- package/examples/atari2600/templates/mini_invaders.asm +381 -0
- package/examples/atari2600/templates/music_demo.asm +322 -0
- package/examples/atari2600/templates/paddle.asm +345 -0
- package/examples/atari2600/templates/single_screen.asm +242 -0
- package/examples/atari7800/main.c +88 -0
- package/examples/atari7800/templates/default.c +183 -0
- package/examples/atari7800/templates/hello_sprite.c +141 -0
- package/examples/atari7800/templates/music_demo.c +123 -0
- package/examples/atari7800/templates/platformer.c +159 -0
- package/examples/atari7800/templates/puzzle.c +164 -0
- package/examples/atari7800/templates/racing.c +139 -0
- package/examples/atari7800/templates/shmup.c +148 -0
- package/examples/atari7800/templates/sports.c +207 -0
- package/examples/c64/main.c +63 -0
- package/examples/c64/templates/hello_sprite.c +117 -0
- package/examples/c64/templates/music_demo.c +131 -0
- package/examples/c64/templates/platformer.c +194 -0
- package/examples/c64/templates/puzzle.c +178 -0
- package/examples/c64/templates/racing.c +140 -0
- package/examples/c64/templates/shmup.c +201 -0
- package/examples/c64/templates/sports.c +109 -0
- package/examples/c64/templates/tile_engine.c +174 -0
- package/examples/gb/main.asm +106 -0
- package/examples/gb/main.c +49 -0
- package/examples/gb/templates/default.c +58 -0
- package/examples/gb/templates/hello_sprite.c +130 -0
- package/examples/gb/templates/music_demo.c +52 -0
- package/examples/gb/templates/platformer.c +178 -0
- package/examples/gb/templates/puzzle.c +217 -0
- package/examples/gb/templates/racing.c +158 -0
- package/examples/gb/templates/shmup.c +172 -0
- package/examples/gb/templates/sports.c +136 -0
- package/examples/gb/templates/tile_engine.c +280 -0
- package/examples/gba/templates/gba_hello.c +64 -0
- package/examples/gba/templates/maxmod_demo.c +105 -0
- package/examples/gba/templates/platformer.c +215 -0
- package/examples/gba/templates/puzzle.c +237 -0
- package/examples/gba/templates/racing.c +175 -0
- package/examples/gba/templates/shmup.c +197 -0
- package/examples/gba/templates/sports.c +177 -0
- package/examples/gba/templates/tonc_hello.c +72 -0
- package/examples/gba/templates/tonc_hello_sprite.c +109 -0
- package/examples/gbc/main.asm +123 -0
- package/examples/gbc/templates/default.c +61 -0
- package/examples/gbc/templates/hello_sprite.c +140 -0
- package/examples/gbc/templates/music_demo.c +63 -0
- package/examples/gbc/templates/platformer.c +181 -0
- package/examples/gbc/templates/puzzle.c +217 -0
- package/examples/gbc/templates/racing.c +164 -0
- package/examples/gbc/templates/shmup.c +188 -0
- package/examples/gbc/templates/sports.c +142 -0
- package/examples/gbc/templates/tile_engine.c +280 -0
- package/examples/genesis/main.s +161 -0
- package/examples/genesis/templates/hello_sprite.c +75 -0
- package/examples/genesis/templates/platformer.c +166 -0
- package/examples/genesis/templates/puzzle.c +240 -0
- package/examples/genesis/templates/racing.c +170 -0
- package/examples/genesis/templates/sgdk_hello.c +41 -0
- package/examples/genesis/templates/shmup.c +188 -0
- package/examples/genesis/templates/shmup_2p.c +244 -0
- package/examples/genesis/templates/sports.c +172 -0
- package/examples/genesis/templates/tile_engine.c +135 -0
- package/examples/genesis/templates/xgm2_demo.c +53 -0
- package/examples/genesis/templates/xgm2_demo_data.s +27 -0
- package/examples/gg/main.c +10 -0
- package/examples/gg/templates/default.c +156 -0
- package/examples/gg/templates/hello_sprite.c +90 -0
- package/examples/gg/templates/music_demo.c +156 -0
- package/examples/gg/templates/platformer.c +220 -0
- package/examples/gg/templates/puzzle.c +204 -0
- package/examples/gg/templates/racing.c +161 -0
- package/examples/gg/templates/shmup.c +188 -0
- package/examples/gg/templates/sports.c +137 -0
- package/examples/gg/templates/tile_engine.c +137 -0
- package/examples/lynx/main.c +4 -0
- package/examples/lynx/templates/default.c +41 -0
- package/examples/lynx/templates/hello_sprite.c +39 -0
- package/examples/lynx/templates/music_demo.c +37 -0
- package/examples/lynx/templates/platformer.c +72 -0
- package/examples/lynx/templates/puzzle.c +142 -0
- package/examples/lynx/templates/racing.c +94 -0
- package/examples/lynx/templates/shmup.c +132 -0
- package/examples/lynx/templates/sports.c +59 -0
- package/examples/msx/catch_game/README.md +75 -0
- package/examples/msx/catch_game/_verify.mjs +93 -0
- package/examples/msx/catch_game/main.c +249 -0
- package/examples/msx/catch_game/shot_after_left.png +0 -0
- package/examples/msx/catch_game/shot_after_right.png +0 -0
- package/examples/msx/catch_game/shot_before.png +0 -0
- package/examples/msx/catch_game/shot_scored.png +0 -0
- package/examples/msx/music_sfx/README.md +38 -0
- package/examples/msx/music_sfx/main.c +164 -0
- package/examples/msx/sprite_move/README.md +44 -0
- package/examples/msx/sprite_move/main.c +100 -0
- package/examples/nes/main.c +143 -0
- package/examples/nes/space-shooter/README.md +69 -0
- package/examples/nes/space-shooter/main.c +441 -0
- package/examples/nes/space-shooter/nes_runtime.c +347 -0
- package/examples/nes/space-shooter/nes_runtime.h +141 -0
- package/examples/nes/templates/default.c +41 -0
- package/examples/nes/templates/hello_sprite.c +104 -0
- package/examples/nes/templates/music_demo.c +80 -0
- package/examples/nes/templates/platformer.c +171 -0
- package/examples/nes/templates/puzzle.c +232 -0
- package/examples/nes/templates/racing.c +203 -0
- package/examples/nes/templates/shmup.c +228 -0
- package/examples/nes/templates/sports.c +205 -0
- package/examples/nes/templates/tile_engine.c +224 -0
- package/examples/pce/catch_game/README.md +8 -0
- package/examples/pce/catch_game/_verify.mjs +75 -0
- package/examples/pce/catch_game/main.c +327 -0
- package/examples/pce/catch_game/shot_after.png +0 -0
- package/examples/pce/catch_game/shot_before.png +0 -0
- package/examples/pce/main.c +37 -0
- package/examples/pce/music_sfx/README.md +8 -0
- package/examples/pce/music_sfx/main.c +154 -0
- package/examples/pce/sprite_move/README.md +19 -0
- package/examples/pce/sprite_move/main.c +155 -0
- package/examples/porting-across-platforms/README.md +59 -0
- package/examples/sms/main.c +129 -0
- package/examples/sms/templates/default.c +110 -0
- package/examples/sms/templates/hello_sprite.c +90 -0
- package/examples/sms/templates/music_demo.c +151 -0
- package/examples/sms/templates/platformer.c +215 -0
- package/examples/sms/templates/puzzle.c +204 -0
- package/examples/sms/templates/racing.c +161 -0
- package/examples/sms/templates/shmup.c +167 -0
- package/examples/sms/templates/shmup_2p.c +219 -0
- package/examples/sms/templates/sports.c +147 -0
- package/examples/sms/templates/tile_engine.c +137 -0
- package/examples/snes/main.asm +70 -0
- package/examples/snes/templates/c-hello-data.asm +28 -0
- package/examples/snes/templates/c-hello.c +71 -0
- package/examples/snes/templates/default-data.asm +36 -0
- package/examples/snes/templates/default.c +74 -0
- package/examples/snes/templates/hello_sprite-data.asm +45 -0
- package/examples/snes/templates/hello_sprite.c +76 -0
- package/examples/snes/templates/music_demo-data.asm +20 -0
- package/examples/snes/templates/music_demo.c +83 -0
- package/examples/snes/templates/platformer-data.asm +27 -0
- package/examples/snes/templates/platformer.c +142 -0
- package/examples/snes/templates/puzzle-data.asm +14 -0
- package/examples/snes/templates/puzzle.c +199 -0
- package/examples/snes/templates/racing-data.asm +33 -0
- package/examples/snes/templates/racing.c +146 -0
- package/examples/snes/templates/shmup-data.asm +61 -0
- package/examples/snes/templates/shmup.c +199 -0
- package/examples/snes/templates/sports-data.asm +28 -0
- package/examples/snes/templates/sports.c +144 -0
- package/package.json +97 -0
- package/src/cheats/gamegenie.js +506 -0
- package/src/cheats/lookup.js +262 -0
- package/src/cheats/parse-cht.js +92 -0
- package/src/cli/smoke.js +283 -0
- package/src/cores/registry.js +99 -0
- package/src/cores/wasm/bluemsx_libretro.js +2 -0
- package/src/cores/wasm/bluemsx_libretro.wasm +0 -0
- package/src/cores/wasm/fceumm_libretro.js +2 -0
- package/src/cores/wasm/fceumm_libretro.wasm +0 -0
- package/src/cores/wasm/gambatte_libretro.js +2 -0
- package/src/cores/wasm/gambatte_libretro.wasm +0 -0
- package/src/cores/wasm/geargrafx_libretro.js +2 -0
- package/src/cores/wasm/geargrafx_libretro.wasm +0 -0
- package/src/cores/wasm/genesis_plus_gx_libretro.js +2 -0
- package/src/cores/wasm/genesis_plus_gx_libretro.wasm +0 -0
- package/src/cores/wasm/handy_libretro.js +2 -0
- package/src/cores/wasm/handy_libretro.wasm +0 -0
- package/src/cores/wasm/mgba_libretro.js +2 -0
- package/src/cores/wasm/mgba_libretro.wasm +0 -0
- package/src/cores/wasm/prosystem_libretro.js +2 -0
- package/src/cores/wasm/prosystem_libretro.wasm +0 -0
- package/src/cores/wasm/snes9x_libretro.js +2 -0
- package/src/cores/wasm/snes9x_libretro.wasm +0 -0
- package/src/cores/wasm/stella2014_libretro.js +2 -0
- package/src/cores/wasm/stella2014_libretro.wasm +0 -0
- package/src/cores/wasm/vice_x64_libretro.js +2 -0
- package/src/cores/wasm/vice_x64_libretro.wasm +0 -0
- package/src/host/LibretroHost.js +1469 -0
- package/src/host/c64-sid-state.js +161 -0
- package/src/host/callbacks.js +444 -0
- package/src/host/chafa-render.js +170 -0
- package/src/host/coreLoader.js +57 -0
- package/src/host/cpu-state.js +543 -0
- package/src/host/dsp-state.js +188 -0
- package/src/host/framebuffer.js +115 -0
- package/src/host/gb-apu-state.js +321 -0
- package/src/host/gba-video-state.js +215 -0
- package/src/host/gpgx-state.js +320 -0
- package/src/host/index.js +4 -0
- package/src/host/lynx-mikey-state.js +226 -0
- package/src/host/msx-ay-state.js +78 -0
- package/src/host/nes-apu-state.js +194 -0
- package/src/host/pce-psg-state.js +82 -0
- package/src/host/retroConstants.js +72 -0
- package/src/host/snes9x-state.js +35 -0
- package/src/host/types.js +332 -0
- package/src/http/routes.js +182 -0
- package/src/http/skill-doc.js +176 -0
- package/src/http/swagger.js +84 -0
- package/src/http/tool-registry.js +142 -0
- package/src/install/postinstall.mjs +81 -0
- package/src/mcp/disclosure.js +250 -0
- package/src/mcp/log.js +87 -0
- package/src/mcp/server.js +498 -0
- package/src/mcp/state.js +88 -0
- package/src/mcp/tool-manifest.js +92 -0
- package/src/mcp/tools/address-to-symbol.js +145 -0
- package/src/mcp/tools/art-loaders.js +743 -0
- package/src/mcp/tools/assets.js +87 -0
- package/src/mcp/tools/audio.js +562 -0
- package/src/mcp/tools/cart-parts.js +651 -0
- package/src/mcp/tools/cheats.js +343 -0
- package/src/mcp/tools/classify-region.js +107 -0
- package/src/mcp/tools/diff-cluster.js +32 -0
- package/src/mcp/tools/diff-roms.js +394 -0
- package/src/mcp/tools/disasm.js +1410 -0
- package/src/mcp/tools/find-references.js +375 -0
- package/src/mcp/tools/font-map.js +563 -0
- package/src/mcp/tools/frame.js +293 -0
- package/src/mcp/tools/free-space.js +71 -0
- package/src/mcp/tools/index.js +339 -0
- package/src/mcp/tools/input-layout.js +231 -0
- package/src/mcp/tools/input.js +227 -0
- package/src/mcp/tools/lifecycle.js +132 -0
- package/src/mcp/tools/lospec.js +187 -0
- package/src/mcp/tools/memory.js +472 -0
- package/src/mcp/tools/metasprite-tools.js +256 -0
- package/src/mcp/tools/platform-docs.js +113 -0
- package/src/mcp/tools/platform-tools.js +1300 -0
- package/src/mcp/tools/platforms.js +139 -0
- package/src/mcp/tools/playtest.js +360 -0
- package/src/mcp/tools/preview-tile.js +478 -0
- package/src/mcp/tools/project.js +1939 -0
- package/src/mcp/tools/record.js +180 -0
- package/src/mcp/tools/reinject.js +732 -0
- package/src/mcp/tools/rendering-context.js +838 -0
- package/src/mcp/tools/rom-id.js +308 -0
- package/src/mcp/tools/run-until.js +176 -0
- package/src/mcp/tools/snippets.js +209 -0
- package/src/mcp/tools/splice-chr.js +190 -0
- package/src/mcp/tools/sprite-pipeline.js +626 -0
- package/src/mcp/tools/state.js +198 -0
- package/src/mcp/tools/symbols.js +400 -0
- package/src/mcp/tools/tile-inspect.js +293 -0
- package/src/mcp/tools/toolchain.js +720 -0
- package/src/mcp/tools/trace-vram-source.js +81 -0
- package/src/mcp/tools/watch-memory.js +1036 -0
- package/src/mcp/tools/which-tiles.js +180 -0
- package/src/mcp/util.js +355 -0
- package/src/observer/bus.js +127 -0
- package/src/observer/livestream.html +594 -0
- package/src/observer/server.js +78 -0
- package/src/observer/tool-wrap.js +142 -0
- package/src/platforms/_guides/MUSIC_SOURCING.md +104 -0
- package/src/platforms/_guides/ROMHACKING_PLAYBOOK.md +245 -0
- package/src/platforms/atari2600/MENTAL_MODEL.md +194 -0
- package/src/platforms/atari2600/TROUBLESHOOTING.md +155 -0
- package/src/platforms/atari2600/UPSTREAM_SOURCES.md +49 -0
- package/src/platforms/atari2600/lib/README.md +67 -0
- package/src/platforms/atari2600/lib/cc65-src/crt0.s +49 -0
- package/src/platforms/atari2600/lib/cc65-src/ctype.s +5 -0
- package/src/platforms/atari2600/lib/kernel_skeleton.asm +85 -0
- package/src/platforms/atari2600/lib/player_kernel.asm +87 -0
- package/src/platforms/atari2600/lib/playfield_kernel.asm +63 -0
- package/src/platforms/atari2600/lib/read_joystick.asm +76 -0
- package/src/platforms/atari2600/lib/score_kernel.asm +141 -0
- package/src/platforms/atari2600/lib/vcs_constants.h +97 -0
- package/src/platforms/atari2600/lib/vectors.asm +16 -0
- package/src/platforms/atari2600/tia.js +355 -0
- package/src/platforms/atari7800/MENTAL_MODEL.md +324 -0
- package/src/platforms/atari7800/TROUBLESHOOTING.md +195 -0
- package/src/platforms/atari7800/UPSTREAM_SOURCES.md +43 -0
- package/src/platforms/atari7800/lib/README.md +45 -0
- package/src/platforms/atari7800/lib/c/atari7800_music.c +215 -0
- package/src/platforms/atari7800/lib/c/atari7800_music.h +33 -0
- package/src/platforms/atari7800/lib/c/atari7800_sfx.c +74 -0
- package/src/platforms/atari7800/lib/c/atari7800_sfx.h +45 -0
- package/src/platforms/atari7800/lib/cc65-src/clock.s +69 -0
- package/src/platforms/atari7800/lib/cc65-src/clocks_per_sec.s +34 -0
- package/src/platforms/atari7800/lib/cc65-src/clrscr.s +27 -0
- package/src/platforms/atari7800/lib/cc65-src/conio.s +226 -0
- package/src/platforms/atari7800/lib/cc65-src/conio_font.s +278 -0
- package/src/platforms/atari7800/lib/cc65-src/cputc.s +139 -0
- package/src/platforms/atari7800/lib/cc65-src/crt0.s +71 -0
- package/src/platforms/atari7800/lib/cc65-src/ctype.s +5 -0
- package/src/platforms/atari7800/lib/cc65-src/exehdr.s +46 -0
- package/src/platforms/atari7800/lib/cc65-src/extra/mono.s +28 -0
- package/src/platforms/atari7800/lib/cc65-src/extzp.inc +15 -0
- package/src/platforms/atari7800/lib/cc65-src/extzp.s +15 -0
- package/src/platforms/atari7800/lib/cc65-src/get_tv.s +65 -0
- package/src/platforms/atari7800/lib/cc65-src/irq.s +36 -0
- package/src/platforms/atari7800/lib/cc65-src/joy/atari7800-stdjoy.s +197 -0
- package/src/platforms/atari7800/lib/cc65-src/joy_stat_stddrv.s +14 -0
- package/src/platforms/atari7800/lib/cc65-src/libref.s +8 -0
- package/src/platforms/atari7800/lib/cc65-src/mono_clrscr.s +27 -0
- package/src/platforms/atari7800/lib/cc65-src/mono_conio.s +231 -0
- package/src/platforms/atari7800/lib/cc65-src/mono_cputc.s +102 -0
- package/src/platforms/atari7800/lib/cc65-src/mono_font.s +2065 -0
- package/src/platforms/atari7800/lib/cc65-src/mono_setcursor.s +214 -0
- package/src/platforms/atari7800/lib/cc65-src/setcursor.s +214 -0
- package/src/platforms/atari7800/lib/cc65-src/textcolor.s +53 -0
- package/src/platforms/atari7800/lib/cc65-src/wherex.s +19 -0
- package/src/platforms/atari7800/lib/cc65-src/wherey.s +19 -0
- package/src/platforms/atari7800/lib/display_list.asm +53 -0
- package/src/platforms/atari7800/lib/maria_init.asm +48 -0
- package/src/platforms/atari7800/lib/maria_registers.h +61 -0
- package/src/platforms/atari7800/lib/palette_load.asm +53 -0
- package/src/platforms/atari7800/lib/read_pad.asm +57 -0
- package/src/platforms/atari7800/lib/vblank_wait.asm +16 -0
- package/src/platforms/atari7800/maria.js +220 -0
- package/src/platforms/atari7800/song.js +232 -0
- package/src/platforms/c64/MENTAL_MODEL.md +188 -0
- package/src/platforms/c64/TROUBLESHOOTING.md +130 -0
- package/src/platforms/c64/UPSTREAM_SOURCES.md +35 -0
- package/src/platforms/c64/image-to-tilemap.js +190 -0
- package/src/platforms/c64/lib/README.md +52 -0
- package/src/platforms/c64/lib/basic_stub.s +25 -0
- package/src/platforms/c64/lib/c/c64_music.c +248 -0
- package/src/platforms/c64/lib/c/c64_music.h +36 -0
- package/src/platforms/c64/lib/c/c64_sfx.c +94 -0
- package/src/platforms/c64/lib/c/c64_sfx.h +37 -0
- package/src/platforms/c64/lib/c64_registers.h +108 -0
- package/src/platforms/c64/lib/cc65-src/_scrsize.s +12 -0
- package/src/platforms/c64/lib/cc65-src/acc_c128_speed.s +5 -0
- package/src/platforms/c64/lib/cc65-src/acc_c64dtv_speed.s +64 -0
- package/src/platforms/c64/lib/cc65-src/acc_c65_speed.s +69 -0
- package/src/platforms/c64/lib/cc65-src/acc_chameleon_speed.s +100 -0
- package/src/platforms/c64/lib/cc65-src/acc_detect_c128.s +33 -0
- package/src/platforms/c64/lib/cc65-src/acc_detect_c64dtv.s +44 -0
- package/src/platforms/c64/lib/cc65-src/acc_detect_c65.s +55 -0
- package/src/platforms/c64/lib/cc65-src/acc_detect_chameleon.s +39 -0
- package/src/platforms/c64/lib/cc65-src/acc_detect_scpu.s +34 -0
- package/src/platforms/c64/lib/cc65-src/acc_detect_turbomaster.s +45 -0
- package/src/platforms/c64/lib/cc65-src/acc_scpu_speed.s +59 -0
- package/src/platforms/c64/lib/cc65-src/acc_turbomaster_speed.s +56 -0
- package/src/platforms/c64/lib/cc65-src/bordercolor.s +17 -0
- package/src/platforms/c64/lib/cc65-src/break.s +108 -0
- package/src/platforms/c64/lib/cc65-src/cgetc.s +62 -0
- package/src/platforms/c64/lib/cc65-src/clrscr.s +11 -0
- package/src/platforms/c64/lib/cc65-src/color.s +24 -0
- package/src/platforms/c64/lib/cc65-src/conio.s +10 -0
- package/src/platforms/c64/lib/cc65-src/cputc.s +105 -0
- package/src/platforms/c64/lib/cc65-src/crt0.s +117 -0
- package/src/platforms/c64/lib/cc65-src/devnum.s +7 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-65816.s +377 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-c256k.s +508 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-dqbb.s +447 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-georam.s +355 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-isepic.s +276 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-kerberos.s +281 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-ram.s +270 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-ramcart.s +297 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-reu.s +286 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-rrr.s +363 -0
- package/src/platforms/c64/lib/cc65-src/emd/c64-vdc.s +405 -0
- package/src/platforms/c64/lib/cc65-src/emd/dtv-himem.s +251 -0
- package/src/platforms/c64/lib/cc65-src/extra/soft80.s +71 -0
- package/src/platforms/c64/lib/cc65-src/extra/soft80mono.s +74 -0
- package/src/platforms/c64/lib/cc65-src/extra/tgimousedata.s +21 -0
- package/src/platforms/c64/lib/cc65-src/get_ostype.s +43 -0
- package/src/platforms/c64/lib/cc65-src/get_tv.s +20 -0
- package/src/platforms/c64/lib/cc65-src/gettime.s +83 -0
- package/src/platforms/c64/lib/cc65-src/irq.s +49 -0
- package/src/platforms/c64/lib/cc65-src/joy/c64-hitjoy.s +218 -0
- package/src/platforms/c64/lib/cc65-src/joy/c64-numpad.s +155 -0
- package/src/platforms/c64/lib/cc65-src/joy/c64-ptvjoy.s +146 -0
- package/src/platforms/c64/lib/cc65-src/joy/c64-stdjoy.s +111 -0
- package/src/platforms/c64/lib/cc65-src/joy_stat_stddrv.s +14 -0
- package/src/platforms/c64/lib/cc65-src/joy_stddrv.s +14 -0
- package/src/platforms/c64/lib/cc65-src/kbhit.s +23 -0
- package/src/platforms/c64/lib/cc65-src/kbrepeat.s +14 -0
- package/src/platforms/c64/lib/cc65-src/kernal.s +53 -0
- package/src/platforms/c64/lib/cc65-src/kplot.s +22 -0
- package/src/platforms/c64/lib/cc65-src/libref.s +16 -0
- package/src/platforms/c64/lib/cc65-src/mainargs.s +137 -0
- package/src/platforms/c64/lib/cc65-src/mcbdefault.s +146 -0
- package/src/platforms/c64/lib/cc65-src/mcbspritedata.s +4 -0
- package/src/platforms/c64/lib/cc65-src/mou/c64-1351.s +467 -0
- package/src/platforms/c64/lib/cc65-src/mou/c64-inkwell.s +446 -0
- package/src/platforms/c64/lib/cc65-src/mou/c64-joy.s +451 -0
- package/src/platforms/c64/lib/cc65-src/mou/c64-pot.s +409 -0
- package/src/platforms/c64/lib/cc65-src/mouse_stat_stddrv.s +14 -0
- package/src/platforms/c64/lib/cc65-src/mouse_stddrv.s +14 -0
- package/src/platforms/c64/lib/cc65-src/mouseref.s +23 -0
- package/src/platforms/c64/lib/cc65-src/pencalib.c +94 -0
- package/src/platforms/c64/lib/cc65-src/randomize.s +18 -0
- package/src/platforms/c64/lib/cc65-src/revers.s +27 -0
- package/src/platforms/c64/lib/cc65-src/ser/c64-swlink.s +484 -0
- package/src/platforms/c64/lib/cc65-src/ser_stat_stddrv.s +14 -0
- package/src/platforms/c64/lib/cc65-src/ser_stddrv.s +13 -0
- package/src/platforms/c64/lib/cc65-src/settime.s +84 -0
- package/src/platforms/c64/lib/cc65-src/soft80.inc +46 -0
- package/src/platforms/c64/lib/cc65-src/soft80_cgetc.s +85 -0
- package/src/platforms/c64/lib/cc65-src/soft80_charset.s +182 -0
- package/src/platforms/c64/lib/cc65-src/soft80_color.s +159 -0
- package/src/platforms/c64/lib/cc65-src/soft80_conio.s +157 -0
- package/src/platforms/c64/lib/cc65-src/soft80_cpeekc.s +148 -0
- package/src/platforms/c64/lib/cc65-src/soft80_cpeekcolor.s +19 -0
- package/src/platforms/c64/lib/cc65-src/soft80_cpeekrevers.s +15 -0
- package/src/platforms/c64/lib/cc65-src/soft80_cpeeks.s +71 -0
- package/src/platforms/c64/lib/cc65-src/soft80_cputc.s +521 -0
- package/src/platforms/c64/lib/cc65-src/soft80_kclrscr.s +76 -0
- package/src/platforms/c64/lib/cc65-src/soft80_kplot.s +63 -0
- package/src/platforms/c64/lib/cc65-src/soft80_scrsize.s +14 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_cgetc.s +67 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_color.s +65 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_conio.s +168 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_cpeekcolor.s +17 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_cputc.s +204 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_kclrscr.s +63 -0
- package/src/platforms/c64/lib/cc65-src/soft80mono_kplot.s +52 -0
- package/src/platforms/c64/lib/cc65-src/status.s +15 -0
- package/src/platforms/c64/lib/cc65-src/sysuname.s +37 -0
- package/src/platforms/c64/lib/cc65-src/tgi/c64-hi.s +881 -0
- package/src/platforms/c64/lib/cc65-src/tgi_stat_stddrv.s +14 -0
- package/src/platforms/c64/lib/cc65-src/tgi_stddrv.s +13 -0
- package/src/platforms/c64/lib/cc65-src/tmcommon.s +67 -0
- package/src/platforms/c64/lib/cc65-src/waitvsync.s +18 -0
- package/src/platforms/c64/lib/read_joystick.s +28 -0
- package/src/platforms/c64/lib/sid_play.s +48 -0
- package/src/platforms/c64/lib/sprite_table.s +73 -0
- package/src/platforms/c64/lib/vic_init.s +47 -0
- package/src/platforms/c64/sid.js +128 -0
- package/src/platforms/c64/song.js +262 -0
- package/src/platforms/c64/vic.js +273 -0
- package/src/platforms/common/default-palette.js +139 -0
- package/src/platforms/common/image-to-tiles.js +418 -0
- package/src/platforms/common/intent.js +111 -0
- package/src/platforms/common/metasprite-adapters.js +279 -0
- package/src/platforms/common/metasprite-codegen.js +192 -0
- package/src/platforms/common/metasprite-core.js +201 -0
- package/src/platforms/common/metasprite.js +89 -0
- package/src/platforms/common/platform-palette.js +137 -0
- package/src/platforms/common/registers.js +329 -0
- package/src/platforms/common/render-tiles.js +86 -0
- package/src/platforms/common/screenshot-sprite.js +153 -0
- package/src/platforms/common/tile-decode.js +149 -0
- package/src/platforms/gb/MENTAL_MODEL.md +262 -0
- package/src/platforms/gb/TROUBLESHOOTING.md +218 -0
- package/src/platforms/gb/UPSTREAM_SOURCES.md +43 -0
- package/src/platforms/gb/image-to-tilemap.js +173 -0
- package/src/platforms/gb/lib/README.md +115 -0
- package/src/platforms/gb/lib/c/LICENSE-HUGEDRIVER +25 -0
- package/src/platforms/gb/lib/c/README.md +122 -0
- package/src/platforms/gb/lib/c/SDCC_GOTCHAS.md +190 -0
- package/src/platforms/gb/lib/c/gb_crt0.s +163 -0
- package/src/platforms/gb/lib/c/gb_hardware.h +113 -0
- package/src/platforms/gb/lib/c/gb_runtime.c +284 -0
- package/src/platforms/gb/lib/c/gb_runtime.h +145 -0
- package/src/platforms/gb/lib/c/hUGEDriver.c +191 -0
- package/src/platforms/gb/lib/c/hUGEDriver.h +95 -0
- package/src/platforms/gb/lib/c/hUGEDriver.upstream.asm +1908 -0
- package/src/platforms/gb/lib/c/lcd_init.c +19 -0
- package/src/platforms/gb/lib/c/patch-header.js +154 -0
- package/src/platforms/gb/lib/c/song_data.c +88 -0
- package/src/platforms/gb/lib/c/unroll.h +52 -0
- package/src/platforms/gb/lib/c/wait_vblank.c +14 -0
- package/src/platforms/gb/lib/dma_oam.asm +51 -0
- package/src/platforms/gb/lib/header.asm +56 -0
- package/src/platforms/gb/lib/joypad_read.asm +47 -0
- package/src/platforms/gb/lib/lcd_init.asm +44 -0
- package/src/platforms/gb/lib/load_palette.asm +25 -0
- package/src/platforms/gb/lib/load_tiles.asm +29 -0
- package/src/platforms/gb/lib/vblank_wait.asm +31 -0
- package/src/platforms/gb/ppu.js +574 -0
- package/src/platforms/gb/song.js +140 -0
- package/src/platforms/gba/MENTAL_MODEL.md +216 -0
- package/src/platforms/gba/TROUBLESHOOTING.md +250 -0
- package/src/platforms/gba/UPSTREAM_SOURCES.md +41 -0
- package/src/platforms/gba/lib/arm-archives/libc.a +0 -0
- package/src/platforms/gba/lib/arm-archives/libgcc.a +0 -0
- package/src/platforms/gba/lib/arm-archives/libnosys.a +0 -0
- package/src/platforms/gba/lib/c/gba_sfx.c +81 -0
- package/src/platforms/gba/lib/c/gba_sfx.h +48 -0
- package/src/platforms/gba/lib/libgba/crtbegin.o +0 -0
- package/src/platforms/gba/lib/libgba/crtend.o +0 -0
- package/src/platforms/gba/lib/libgba/crti.o +0 -0
- package/src/platforms/gba/lib/libgba/crtn.o +0 -0
- package/src/platforms/gba/lib/libgba/gba_cart.ld +319 -0
- package/src/platforms/gba/lib/libgba/gba_crt0.s +258 -0
- package/src/platforms/gba/lib/libgba/include/BoyScout.h +128 -0
- package/src/platforms/gba/lib/libgba/include/disc.h +36 -0
- package/src/platforms/gba/lib/libgba/include/disc_io.h +64 -0
- package/src/platforms/gba/lib/libgba/include/dldi.h +112 -0
- package/src/platforms/gba/lib/libgba/include/erapi.h +195 -0
- package/src/platforms/gba/lib/libgba/include/fade.h +76 -0
- package/src/platforms/gba/lib/libgba/include/gba.h +47 -0
- package/src/platforms/gba/lib/libgba/include/gba_affine.h +83 -0
- package/src/platforms/gba/lib/libgba/include/gba_base.h +122 -0
- package/src/platforms/gba/lib/libgba/include/gba_compression.h +66 -0
- package/src/platforms/gba/lib/libgba/include/gba_console.h +55 -0
- package/src/platforms/gba/lib/libgba/include/gba_dma.h +100 -0
- package/src/platforms/gba/lib/libgba/include/gba_input.h +127 -0
- package/src/platforms/gba/lib/libgba/include/gba_interrupt.h +146 -0
- package/src/platforms/gba/lib/libgba/include/gba_multiboot.h +72 -0
- package/src/platforms/gba/lib/libgba/include/gba_sio.h +124 -0
- package/src/platforms/gba/lib/libgba/include/gba_sound.h +356 -0
- package/src/platforms/gba/lib/libgba/include/gba_sprites.h +195 -0
- package/src/platforms/gba/lib/libgba/include/gba_systemcalls.h +194 -0
- package/src/platforms/gba/lib/libgba/include/gba_timers.h +63 -0
- package/src/platforms/gba/lib/libgba/include/gba_types.h +60 -0
- package/src/platforms/gba/lib/libgba/include/gba_video.h +307 -0
- package/src/platforms/gba/lib/libgba/include/mappy.h +72 -0
- package/src/platforms/gba/lib/libgba/include/mbv2.h +90 -0
- package/src/platforms/gba/lib/libgba/include/xcomms.h +93 -0
- package/src/platforms/gba/lib/libgba/include/xcomms_cmd.h +53 -0
- package/src/platforms/gba/lib/libgba/libgba.seed.a +0 -0
- package/src/platforms/gba/lib/libgba/libgba.seed.hash +1 -0
- package/src/platforms/gba/lib/libgba/src/AffineSet.c +42 -0
- package/src/platforms/gba/lib/libgba/src/ArcTan.s +41 -0
- package/src/platforms/gba/lib/libgba/src/BoyScout/BoyScout.c +1242 -0
- package/src/platforms/gba/lib/libgba/src/BoyScout/GBASoundRegs.h +200 -0
- package/src/platforms/gba/lib/libgba/src/Compression.c +84 -0
- package/src/platforms/gba/lib/libgba/src/CpuSet.c +41 -0
- package/src/platforms/gba/lib/libgba/src/Div.s +58 -0
- package/src/platforms/gba/lib/libgba/src/DivArm.s +50 -0
- package/src/platforms/gba/lib/libgba/src/InterruptDispatcher.s +113 -0
- package/src/platforms/gba/lib/libgba/src/IntrWait.c +35 -0
- package/src/platforms/gba/lib/libgba/src/MultiBoot.s +33 -0
- package/src/platforms/gba/lib/libgba/src/Reset.s +49 -0
- package/src/platforms/gba/lib/libgba/src/Sound.s +48 -0
- package/src/platforms/gba/lib/libgba/src/Sqrt.s +34 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/disc.c +58 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/dldi.c +189 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/dldi_stub.s +78 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_cf_common.c +260 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_cf_common.h +72 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_m3_common.c +60 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_m3_common.h +48 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_m3cf.c +83 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_m3cf.h +45 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_m3sd.c +508 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_m3sd.h +45 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_mpcf.c +87 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_mpcf.h +42 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_sc_common.c +47 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_sc_common.h +43 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_sccf.c +83 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_sccf.h +45 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd.c +385 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd.h +48 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd_s.s +139 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_sd_common.c +203 -0
- package/src/platforms/gba/lib/libgba/src/disc_io/io_sd_common.h +108 -0
- package/src/platforms/gba/lib/libgba/src/fade.c +185 -0
- package/src/platforms/gba/lib/libgba/src/input.c +127 -0
- package/src/platforms/gba/lib/libgba/src/interrupt.c +116 -0
- package/src/platforms/gba/lib/libgba/src/mappy_print.c +74 -0
- package/src/platforms/gba/lib/libgba/src/mb2print.c +69 -0
- package/src/platforms/gba/lib/libgba/src/mbv2.c +230 -0
- package/src/platforms/gba/lib/libgba/src/mbv2.txt +119 -0
- package/src/platforms/gba/lib/libgba/src/xcomms.c +203 -0
- package/src/platforms/gba/lib/libgba/src/xcomms_print.c +56 -0
- package/src/platforms/gba/lib/libgba/sysinclude/_ansi.h +82 -0
- package/src/platforms/gba/lib/libgba/sysinclude/_newlib_version.h +11 -0
- package/src/platforms/gba/lib/libgba/sysinclude/_syslist.h +41 -0
- package/src/platforms/gba/lib/libgba/sysinclude/alloca.h +21 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ar.h +65 -0
- package/src/platforms/gba/lib/libgba/sysinclude/argz.h +33 -0
- package/src/platforms/gba/lib/libgba/sysinclude/assert.h +50 -0
- package/src/platforms/gba/lib/libgba/sysinclude/complex.h +150 -0
- package/src/platforms/gba/lib/libgba/sysinclude/cpio.h +30 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ctype.h +183 -0
- package/src/platforms/gba/lib/libgba/sysinclude/devctl.h +78 -0
- package/src/platforms/gba/lib/libgba/sysinclude/dirent.h +85 -0
- package/src/platforms/gba/lib/libgba/sysinclude/elf.h +3147 -0
- package/src/platforms/gba/lib/libgba/sysinclude/envlock.h +15 -0
- package/src/platforms/gba/lib/libgba/sysinclude/envz.h +16 -0
- package/src/platforms/gba/lib/libgba/sysinclude/errno.h +11 -0
- package/src/platforms/gba/lib/libgba/sysinclude/fastmath.h +13 -0
- package/src/platforms/gba/lib/libgba/sysinclude/fcntl.h +1 -0
- package/src/platforms/gba/lib/libgba/sysinclude/fenv.h +42 -0
- package/src/platforms/gba/lib/libgba/sysinclude/float.h +631 -0
- package/src/platforms/gba/lib/libgba/sysinclude/fnmatch.h +55 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ftw.h +66 -0
- package/src/platforms/gba/lib/libgba/sysinclude/getopt.h +185 -0
- package/src/platforms/gba/lib/libgba/sysinclude/glob.h +90 -0
- package/src/platforms/gba/lib/libgba/sysinclude/grp.h +86 -0
- package/src/platforms/gba/lib/libgba/sysinclude/iconv.h +63 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ieeefp.h +295 -0
- package/src/platforms/gba/lib/libgba/sysinclude/inttypes.h +345 -0
- package/src/platforms/gba/lib/libgba/sysinclude/iso646.h +45 -0
- package/src/platforms/gba/lib/libgba/sysinclude/langinfo.h +332 -0
- package/src/platforms/gba/lib/libgba/sysinclude/libgen.h +37 -0
- package/src/platforms/gba/lib/libgba/sysinclude/limits.h +168 -0
- package/src/platforms/gba/lib/libgba/sysinclude/locale.h +96 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/_arc4random.h +1 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/_default_types.h +250 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/_endian.h +39 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/_time.h +3 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/_types.h +8 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/ansi.h +1 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/endian.h +69 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/fastmath.h +98 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/ieee.h +127 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/ieeefp.h +533 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/malloc.h +8 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/param.h +8 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/setjmp-dj.h +43 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/setjmp.h +524 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/stdlib.h +8 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/termios.h +1 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/time.h +15 -0
- package/src/platforms/gba/lib/libgba/sysinclude/machine/types.h +13 -0
- package/src/platforms/gba/lib/libgba/sysinclude/malloc.h +173 -0
- package/src/platforms/gba/lib/libgba/sysinclude/math.h +645 -0
- package/src/platforms/gba/lib/libgba/sysinclude/memory.h +4 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ndbm.h +91 -0
- package/src/platforms/gba/lib/libgba/sysinclude/newlib.h +427 -0
- package/src/platforms/gba/lib/libgba/sysinclude/paths.h +9 -0
- package/src/platforms/gba/lib/libgba/sysinclude/pthread.h +456 -0
- package/src/platforms/gba/lib/libgba/sysinclude/pwd.h +83 -0
- package/src/platforms/gba/lib/libgba/sysinclude/reent.h +190 -0
- package/src/platforms/gba/lib/libgba/sysinclude/regdef.h +7 -0
- package/src/platforms/gba/lib/libgba/sysinclude/regex.h +103 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sched.h +112 -0
- package/src/platforms/gba/lib/libgba/sysinclude/search.h +64 -0
- package/src/platforms/gba/lib/libgba/sysinclude/setjmp.h +25 -0
- package/src/platforms/gba/lib/libgba/sysinclude/signal.h +35 -0
- package/src/platforms/gba/lib/libgba/sysinclude/spawn.h +111 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/ssp.h +76 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/stdio.h +101 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/stdlib.h +30 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/string.h +115 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/strings.h +55 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/unistd.h +93 -0
- package/src/platforms/gba/lib/libgba/sysinclude/ssp/wchar.h +97 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdarg.h +135 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdatomic.h +409 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdbool.h +51 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stddef.h +463 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdint.h +466 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdio.h +807 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdio_ext.h +79 -0
- package/src/platforms/gba/lib/libgba/sysinclude/stdlib.h +345 -0
- package/src/platforms/gba/lib/libgba/sysinclude/string.h +183 -0
- package/src/platforms/gba/lib/libgba/sysinclude/strings.h +80 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_default_fcntl.h +241 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_intsup.h +199 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_locale.h +12 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_pthreadtypes.h +233 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_sigset.h +43 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_stdint.h +90 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_timespec.h +52 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_timeval.h +60 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_types.h +228 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/_tz_structs.h +24 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/cdefs.h +754 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/config.h +314 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/custom_file.h +2 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/dir.h +10 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/dirent.h +13 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/endian.h +207 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/errno.h +198 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/fcntl.h +12 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/features.h +551 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/fenv.h +90 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/file.h +2 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/iconvnls.h +77 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/iosupport.h +143 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/lock.h +75 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/param.h +35 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/queue.h +919 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/reent.h +913 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/resource.h +24 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/sched.h +69 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/select.h +94 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/signal.h +388 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/stat.h +179 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/statvfs.h +41 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/stdio.h +27 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/string.h +2 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/syslimits.h +61 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/time.h +448 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/timeb.h +40 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/times.h +32 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/timespec.h +63 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/tree.h +864 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/types.h +228 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/unistd.h +591 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/utime.h +22 -0
- package/src/platforms/gba/lib/libgba/sysinclude/sys/wait.h +44 -0
- package/src/platforms/gba/lib/libgba/sysinclude/tar.h +43 -0
- package/src/platforms/gba/lib/libgba/sysinclude/termios.h +7 -0
- package/src/platforms/gba/lib/libgba/sysinclude/tgmath.h +127 -0
- package/src/platforms/gba/lib/libgba/sysinclude/threads.h +93 -0
- package/src/platforms/gba/lib/libgba/sysinclude/time.h +313 -0
- package/src/platforms/gba/lib/libgba/sysinclude/unctrl.h +42 -0
- package/src/platforms/gba/lib/libgba/sysinclude/unistd.h +6 -0
- package/src/platforms/gba/lib/libgba/sysinclude/utime.h +12 -0
- package/src/platforms/gba/lib/libgba/sysinclude/utmp.h +8 -0
- package/src/platforms/gba/lib/libgba/sysinclude/varargs.h +7 -0
- package/src/platforms/gba/lib/libgba/sysinclude/wchar.h +339 -0
- package/src/platforms/gba/lib/libgba/sysinclude/wctype.h +74 -0
- package/src/platforms/gba/lib/libgba/sysinclude/wordexp.h +53 -0
- package/src/platforms/gba/lib/libtonc/crtbegin.o +0 -0
- package/src/platforms/gba/lib/libtonc/crtend.o +0 -0
- package/src/platforms/gba/lib/libtonc/crti.o +0 -0
- package/src/platforms/gba/lib/libtonc/crtn.o +0 -0
- package/src/platforms/gba/lib/libtonc/gba_cart.ld +319 -0
- package/src/platforms/gba/lib/libtonc/gba_crt0.s +258 -0
- package/src/platforms/gba/lib/libtonc/include/tonc.h +72 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_asminc.h +132 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_bios.h +555 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_core.h +573 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_input.h +184 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_irq.h +121 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_legacy.h +481 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_libgba.h +537 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_math.h +692 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_memdef.h +962 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_memmap.h +583 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_nocash.h +51 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_oam.h +186 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_surface.h +461 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_text.h +270 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_tte.h +748 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_types.h +376 -0
- package/src/platforms/gba/lib/libtonc/include/tonc_video.h +615 -0
- package/src/platforms/gba/lib/libtonc/libtonc.seed.a +0 -0
- package/src/platforms/gba/lib/libtonc/libtonc.seed.hash +1 -0
- package/src/platforms/gba/lib/libtonc/src/asm/clr_blend_fast.s +72 -0
- package/src/platforms/gba/lib/libtonc/src/asm/clr_fade_fast.s +74 -0
- package/src/platforms/gba/lib/libtonc/src/asm/div_lut.s +54 -0
- package/src/platforms/gba/lib/libtonc/src/asm/sin_lut.s +90 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_bios.s +289 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_bios_ex.s +97 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_isr_master.s +92 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_isr_nest.s +98 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_memcpy.s +126 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_memset.s +123 -0
- package/src/platforms/gba/lib/libtonc/src/asm/tonc_nocash.s +73 -0
- package/src/platforms/gba/lib/libtonc/src/font/sys8.png +0 -0
- package/src/platforms/gba/lib/libtonc/src/font/sys8.s +46 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana10.png +0 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana10.s +293 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9.png +0 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9.s +167 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9_b4.png +0 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9_b4.s +545 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9b.png +0 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9b.s +167 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9i.png +0 -0
- package/src/platforms/gba/lib/libtonc/src/font/verdana9i.s +167 -0
- package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_bitmap.c +289 -0
- package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text.c +81 -0
- package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_bm.c +244 -0
- package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_map.c +122 -0
- package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_oam.c +113 -0
- package/src/platforms/gba/lib/libtonc/src/pre1.3/toncfont.s +43 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_bg.c +61 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_bg_affine.c +112 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_bmp16.c +240 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_bmp8.c +314 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_color.c +368 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_core.c +237 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_input.c +118 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_irq.c +271 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_math.c +54 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_oam.c +76 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_obj_affine.c +146 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_sbmp16.c +369 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_sbmp8.c +405 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_schr4c.c +588 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_schr4r.c +462 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_surface.c +105 -0
- package/src/platforms/gba/lib/libtonc/src/tonc_video.c +33 -0
- package/src/platforms/gba/lib/libtonc/src/tte/ase_drawg.c +83 -0
- package/src/platforms/gba/lib/libtonc/src/tte/bmp16_drawg.c +72 -0
- package/src/platforms/gba/lib/libtonc/src/tte/bmp16_drawg_b1cs.c +92 -0
- package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg.c +71 -0
- package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg_b1cs.c +104 -0
- package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg_b1cts_fast.s +115 -0
- package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b1cts.c +76 -0
- package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b1cts_fast.s +128 -0
- package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b4cts.c +67 -0
- package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b4cts_fast.s +127 -0
- package/src/platforms/gba/lib/libtonc/src/tte/chr4r_drawg_b1cts.c +80 -0
- package/src/platforms/gba/lib/libtonc/src/tte/chr4r_drawg_b1cts_fast.s +145 -0
- package/src/platforms/gba/lib/libtonc/src/tte/obj_drawg.c +61 -0
- package/src/platforms/gba/lib/libtonc/src/tte/se_drawg.c +110 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_init_ase.c +87 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_init_bmp.c +118 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_init_chr4c.c +86 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_init_chr4r.c +87 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_init_obj.c +84 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_init_se.c +96 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_iohook.c +264 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_main.c +756 -0
- package/src/platforms/gba/lib/libtonc/src/tte/tte_types.s +119 -0
- package/src/platforms/gba/lib/maxmod/LICENSE-MAXMOD +23 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_defs.inc +117 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_format_mas.inc +108 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_macros.inc +195 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_mas.inc +40 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_mas_structs.inc +189 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_mixer_ds.inc +46 -0
- package/src/platforms/gba/lib/maxmod/asm_include/mp_mixer_gba.inc +42 -0
- package/src/platforms/gba/lib/maxmod/asm_include/swi_gba.inc +23 -0
- package/src/platforms/gba/lib/maxmod/include/maxmod.h +412 -0
- package/src/platforms/gba/lib/maxmod/include/mm_types.h +333 -0
- package/src/platforms/gba/lib/maxmod/maxmod.seed.a +0 -0
- package/src/platforms/gba/lib/maxmod/maxmod.seed.hash +1 -0
- package/src/platforms/gba/lib/maxmod/music/chiptune.xm +0 -0
- package/src/platforms/gba/lib/maxmod/music/chiptune_soundbank.bin +0 -0
- package/src/platforms/gba/lib/maxmod/music/chiptune_soundbank.h +4 -0
- package/src/platforms/gba/lib/maxmod/music/make_chiptune_xm.js +203 -0
- package/src/platforms/gba/lib/maxmod/source/mm_effect.s +767 -0
- package/src/platforms/gba/lib/maxmod/source/mm_main.s +115 -0
- package/src/platforms/gba/lib/maxmod/source/mm_mas.s +4990 -0
- package/src/platforms/gba/lib/maxmod/source/mm_mas_arm.s +612 -0
- package/src/platforms/gba/lib/maxmod/source_gba/mm_init_default.s +98 -0
- package/src/platforms/gba/lib/maxmod/source_gba/mm_main_gba.s +292 -0
- package/src/platforms/gba/lib/maxmod/source_gba/mm_mixer_gba.s +1367 -0
- package/src/platforms/gba/lib/sysbase/gba_iosupport.c +138 -0
- package/src/platforms/gbc/MENTAL_MODEL.md +178 -0
- package/src/platforms/gbc/TROUBLESHOOTING.md +142 -0
- package/src/platforms/gbc/UPSTREAM_SOURCES.md +60 -0
- package/src/platforms/gbc/lib/c/LICENSE-HUGEDRIVER +25 -0
- package/src/platforms/gbc/lib/c/README.md +122 -0
- package/src/platforms/gbc/lib/c/SDCC_GOTCHAS.md +190 -0
- package/src/platforms/gbc/lib/c/gb_crt0.s +163 -0
- package/src/platforms/gbc/lib/c/gb_hardware.h +113 -0
- package/src/platforms/gbc/lib/c/gb_runtime.c +284 -0
- package/src/platforms/gbc/lib/c/gb_runtime.h +145 -0
- package/src/platforms/gbc/lib/c/hUGEDriver.c +191 -0
- package/src/platforms/gbc/lib/c/hUGEDriver.h +95 -0
- package/src/platforms/gbc/lib/c/hUGEDriver.upstream.asm +1908 -0
- package/src/platforms/gbc/lib/c/lcd_init.c +19 -0
- package/src/platforms/gbc/lib/c/patch-header.js +154 -0
- package/src/platforms/gbc/lib/c/song_data.c +88 -0
- package/src/platforms/gbc/lib/c/unroll.h +52 -0
- package/src/platforms/gbc/lib/c/wait_vblank.c +14 -0
- package/src/platforms/gbc/song.js +3 -0
- package/src/platforms/genesis/MENTAL_MODEL.md +306 -0
- package/src/platforms/genesis/TROUBLESHOOTING.md +226 -0
- package/src/platforms/genesis/UPSTREAM_SOURCES.md +53 -0
- package/src/platforms/genesis/image-to-tilemap.js +351 -0
- package/src/platforms/genesis/lib/README.md +160 -0
- package/src/platforms/genesis/lib/c/crtbegin.o +0 -0
- package/src/platforms/genesis/lib/c/crtend.o +0 -0
- package/src/platforms/genesis/lib/c/genesis.ld +44 -0
- package/src/platforms/genesis/lib/c/genesis_sfx.c +51 -0
- package/src/platforms/genesis/lib/c/genesis_sfx.h +49 -0
- package/src/platforms/genesis/lib/c/libc.a +0 -0
- package/src/platforms/genesis/lib/c/libgcc.a +0 -0
- package/src/platforms/genesis/lib/c/libm.a +0 -0
- package/src/platforms/genesis/lib/c/sega.s +71 -0
- package/src/platforms/genesis/lib/header.s +96 -0
- package/src/platforms/genesis/lib/nmi_safe.s +79 -0
- package/src/platforms/genesis/lib/pad_read.s +104 -0
- package/src/platforms/genesis/lib/sgdk/COPYING.RUNTIME +73 -0
- package/src/platforms/genesis/lib/sgdk/LICENSE +12 -0
- package/src/platforms/genesis/lib/sgdk/include/asm.h +52 -0
- package/src/platforms/genesis/lib/sgdk/include/asm_mac.i +9 -0
- package/src/platforms/genesis/lib/sgdk/include/bmp.h +690 -0
- package/src/platforms/genesis/lib/sgdk/include/config.h +208 -0
- package/src/platforms/genesis/lib/sgdk/include/dma.h +542 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/console.h +387 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/everdrive.h +116 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/fat16.h +84 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/flash-save/flash.h +164 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/flash-save/saveman.h +177 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/link_cable.h +316 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/minimusic/minimus.h +29 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/16c550.h +221 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/comm.h +93 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/gamejolt.h +541 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/jsmn.h +471 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/json.h +122 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/lsd.h +172 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/megawifi.h +984 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/mw-msg.h +392 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/ssf_ed_pro.h +38 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/mw/ssf_ed_x7.h +73 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/serial/buffer.h +8 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/serial/serial.h +133 -0
- package/src/platforms/genesis/lib/sgdk/include/ext/stb/stb_sprintf.h +1864 -0
- package/src/platforms/genesis/lib/sgdk/include/genesis.h +92 -0
- package/src/platforms/genesis/lib/sgdk/include/joy.h +482 -0
- package/src/platforms/genesis/lib/sgdk/include/kdebug.h +21 -0
- package/src/platforms/genesis/lib/sgdk/include/map.h +409 -0
- package/src/platforms/genesis/lib/sgdk/include/mapper.h +186 -0
- package/src/platforms/genesis/lib/sgdk/include/maths.h +1071 -0
- package/src/platforms/genesis/lib/sgdk/include/maths3D.h +480 -0
- package/src/platforms/genesis/lib/sgdk/include/memory.h +346 -0
- package/src/platforms/genesis/lib/sgdk/include/memory_base.h +37 -0
- package/src/platforms/genesis/lib/sgdk/include/object.h +171 -0
- package/src/platforms/genesis/lib/sgdk/include/pal.h +500 -0
- package/src/platforms/genesis/lib/sgdk/include/pool.h +171 -0
- package/src/platforms/genesis/lib/sgdk/include/psg.h +153 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_dpcm2.h +79 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_pcm.h +98 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_pcm4.h +125 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/pcm/tab_vol.h +6 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/smp_null.h +6 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/smp_null_dpcm.h +6 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/sound.h +70 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/xgm.h +399 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/xgm2.h +389 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/z80_def.i80 +41 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/z80_fct.i80 +83 -0
- package/src/platforms/genesis/lib/sgdk/include/snd/z80_mac.i80 +1476 -0
- package/src/platforms/genesis/lib/sgdk/include/sprite_eng.h +1095 -0
- package/src/platforms/genesis/lib/sgdk/include/sprite_eng_legacy.h +1030 -0
- package/src/platforms/genesis/lib/sgdk/include/sram.h +110 -0
- package/src/platforms/genesis/lib/sgdk/include/string.h +349 -0
- package/src/platforms/genesis/lib/sgdk/include/sys.h +511 -0
- package/src/platforms/genesis/lib/sgdk/include/tab_cnv.h +19 -0
- package/src/platforms/genesis/lib/sgdk/include/task.h +77 -0
- package/src/platforms/genesis/lib/sgdk/include/task_cst.h +33 -0
- package/src/platforms/genesis/lib/sgdk/include/timer.h +132 -0
- package/src/platforms/genesis/lib/sgdk/include/tools.h +450 -0
- package/src/platforms/genesis/lib/sgdk/include/types.h +320 -0
- package/src/platforms/genesis/lib/sgdk/include/vdp.h +1150 -0
- package/src/platforms/genesis/lib/sgdk/include/vdp_bg.h +723 -0
- package/src/platforms/genesis/lib/sgdk/include/vdp_pal.h +101 -0
- package/src/platforms/genesis/lib/sgdk/include/vdp_spr.h +448 -0
- package/src/platforms/genesis/lib/sgdk/include/vdp_tile.h +1136 -0
- package/src/platforms/genesis/lib/sgdk/include/vram.h +270 -0
- package/src/platforms/genesis/lib/sgdk/include/ym2612.h +87 -0
- package/src/platforms/genesis/lib/sgdk/include/z80_ctrl.h +420 -0
- package/src/platforms/genesis/lib/sgdk/libmd.seed.a +0 -0
- package/src/platforms/genesis/lib/sgdk/libmd.seed.hash +1 -0
- package/src/platforms/genesis/lib/sgdk/md.ld +120 -0
- package/src/platforms/genesis/lib/sgdk/music/demo.vgm +0 -0
- package/src/platforms/genesis/lib/sgdk/music/demo.xgc +0 -0
- package/src/platforms/genesis/lib/sgdk/music/demo.xgm +0 -0
- package/src/platforms/genesis/lib/sgdk/res/image/font_default.png +0 -0
- package/src/platforms/genesis/lib/sgdk/res/image/sgdk_logo.png +0 -0
- package/src/platforms/genesis/lib/sgdk/res/libres.h +10 -0
- package/src/platforms/genesis/lib/sgdk/res/libres.res +5 -0
- package/src/platforms/genesis/lib/sgdk/res/libres.s +166 -0
- package/src/platforms/genesis/lib/sgdk/res/sound/stop_xgm.bin +0 -0
- package/src/platforms/genesis/lib/sgdk/rom_header.c +33 -0
- package/src/platforms/genesis/lib/sgdk/sega.preprocessed.s +364 -0
- package/src/platforms/genesis/lib/sgdk/sega.s +365 -0
- package/src/platforms/genesis/lib/sgdk/src/bmp.c +1539 -0
- package/src/platforms/genesis/lib/sgdk/src/bmp_a.s +3477 -0
- package/src/platforms/genesis/lib/sgdk/src/boot/rom_header.c +33 -0
- package/src/platforms/genesis/lib/sgdk/src/boot/sega.s +365 -0
- package/src/platforms/genesis/lib/sgdk/src/dma.c +782 -0
- package/src/platforms/genesis/lib/sgdk/src/dma_a.s +23 -0
- package/src/platforms/genesis/lib/sgdk/src/error_a.s +376 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/console.c +490 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/everdrive.c +285 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/fat16.c +610 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/README.md +112 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/flash.c +300 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/saveman.c +641 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/link_cable.c +1758 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/CHANGELOG.md +31 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/LICENSE.txt +17 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/README.md +18 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/data.z80 +148 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/define.z80 +173 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/api-c.md +80 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/format.md +132 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/teradrive.md +33 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/fm.z80 +363 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/main.z80 +433 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/minimus.c +129 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/minimus_drv.s80 +17 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/psg.z80 +231 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/track.z80 +398 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/util.z80 +98 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/16c550.c +84 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/README.md +849 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/comm.c +141 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/gamejolt.c +758 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/json.c +153 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/lsd.c +364 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/megawifi.c +1501 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/ssf_ed_pro.c +98 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/mw/ssf_ed_x7.c +67 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/serial/buffer.c +69 -0
- package/src/platforms/genesis/lib/sgdk/src/ext/serial/serial.c +158 -0
- package/src/platforms/genesis/lib/sgdk/src/joy.c +1361 -0
- package/src/platforms/genesis/lib/sgdk/src/kdebug.s +109 -0
- package/src/platforms/genesis/lib/sgdk/src/map.c +1915 -0
- package/src/platforms/genesis/lib/sgdk/src/mapper.c +280 -0
- package/src/platforms/genesis/lib/sgdk/src/maths.c +878 -0
- package/src/platforms/genesis/lib/sgdk/src/maths3D.c +480 -0
- package/src/platforms/genesis/lib/sgdk/src/maths3D_a.s +205 -0
- package/src/platforms/genesis/lib/sgdk/src/memory.c +760 -0
- package/src/platforms/genesis/lib/sgdk/src/memory_a.s +306 -0
- package/src/platforms/genesis/lib/sgdk/src/object.c +111 -0
- package/src/platforms/genesis/lib/sgdk/src/pal.c +484 -0
- package/src/platforms/genesis/lib/sgdk/src/pool.c +234 -0
- package/src/platforms/genesis/lib/sgdk/src/psg.c +82 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/drv_null.s80 +27 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/drv_xgm.s80 +3037 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_dpcm2.s80 +984 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_pcm.s80 +592 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_pcm4.s80 +699 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_dpcm2.c +172 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_pcm.c +152 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_pcm4.c +213 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/pcm/tab_vol.c +277 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/smp_null.s +22 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/smp_null_dpcm.s +15 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/sound.c +33 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm.c +683 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2.s80 +993 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_fct.i80 +611 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_mac.i80 +133 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_pcm_fct.i80 +114 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_pcm_mac.i80 +1444 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_psg_fct.i80 +491 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_psg_mac.i80 +43 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_ym_fct.i80 +1664 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_ym_mac.i80 +295 -0
- package/src/platforms/genesis/lib/sgdk/src/snd/xgm2.c +1083 -0
- package/src/platforms/genesis/lib/sgdk/src/sprite_eng.c +2256 -0
- package/src/platforms/genesis/lib/sgdk/src/sprite_eng_legacy.c +2309 -0
- package/src/platforms/genesis/lib/sgdk/src/sram.c +30 -0
- package/src/platforms/genesis/lib/sgdk/src/sram_a.s +41 -0
- package/src/platforms/genesis/lib/sgdk/src/string.c +720 -0
- package/src/platforms/genesis/lib/sgdk/src/sys.c +1053 -0
- package/src/platforms/genesis/lib/sgdk/src/sys_a.s +74 -0
- package/src/platforms/genesis/lib/sgdk/src/tab_cnv.c +129 -0
- package/src/platforms/genesis/lib/sgdk/src/tab_log10.c +8201 -0
- package/src/platforms/genesis/lib/sgdk/src/tab_log2.c +8201 -0
- package/src/platforms/genesis/lib/sgdk/src/tab_sin.c +2058 -0
- package/src/platforms/genesis/lib/sgdk/src/tab_sqrt.c +8201 -0
- package/src/platforms/genesis/lib/sgdk/src/task.s +148 -0
- package/src/platforms/genesis/lib/sgdk/src/timer.c +201 -0
- package/src/platforms/genesis/lib/sgdk/src/tools.c +1299 -0
- package/src/platforms/genesis/lib/sgdk/src/tools_a.s +979 -0
- package/src/platforms/genesis/lib/sgdk/src/types.c +18 -0
- package/src/platforms/genesis/lib/sgdk/src/vdp.c +1060 -0
- package/src/platforms/genesis/lib/sgdk/src/vdp_bg.c +511 -0
- package/src/platforms/genesis/lib/sgdk/src/vdp_spr.c +322 -0
- package/src/platforms/genesis/lib/sgdk/src/vdp_tile.c +1011 -0
- package/src/platforms/genesis/lib/sgdk/src/vdp_tile_a.s +68 -0
- package/src/platforms/genesis/lib/sgdk/src/vram.c +273 -0
- package/src/platforms/genesis/lib/sgdk/src/ym2612.c +175 -0
- package/src/platforms/genesis/lib/sgdk/src/z80_ctrl.c +334 -0
- package/src/platforms/genesis/lib/sprite_table.s +129 -0
- package/src/platforms/genesis/lib/vblank_wait.s +73 -0
- package/src/platforms/genesis/lib/vdp_init.s +85 -0
- package/src/platforms/genesis/lib/wram.s +88 -0
- package/src/platforms/genesis/lib/z80_bootstrap.s +102 -0
- package/src/platforms/genesis/vdp.js +548 -0
- package/src/platforms/genesis/xgm2-pcm.js +165 -0
- package/src/platforms/gg/MENTAL_MODEL.md +174 -0
- package/src/platforms/gg/TROUBLESHOOTING.md +105 -0
- package/src/platforms/gg/UPSTREAM_SOURCES.md +36 -0
- package/src/platforms/gg/lib/c/gg_crt0.s +112 -0
- package/src/platforms/gg/lib/c/gg_hw.h +62 -0
- package/src/platforms/gg/lib/c/gg_music.c +155 -0
- package/src/platforms/gg/lib/c/gg_music.h +89 -0
- package/src/platforms/gg/lib/c/gg_sfx.c +82 -0
- package/src/platforms/gg/lib/c/gg_sfx.h +40 -0
- package/src/platforms/gg/lib/c/joypad_read.c +22 -0
- package/src/platforms/gg/lib/c/load_palette.c +20 -0
- package/src/platforms/gg/lib/c/load_tiles.c +32 -0
- package/src/platforms/gg/lib/c/sprite_table.c +60 -0
- package/src/platforms/gg/lib/c/vblank_wait.c +10 -0
- package/src/platforms/gg/lib/c/vdp_init.c +58 -0
- package/src/platforms/gg/song.js +189 -0
- package/src/platforms/index.js +7 -0
- package/src/platforms/lynx/MENTAL_MODEL.md +248 -0
- package/src/platforms/lynx/TROUBLESHOOTING.md +105 -0
- package/src/platforms/lynx/UPSTREAM_SOURCES.md +66 -0
- package/src/platforms/lynx/lib/c/lynx_music.c +63 -0
- package/src/platforms/lynx/lib/c/lynx_music.h +16 -0
- package/src/platforms/lynx/lib/c/lynx_sfx.c +147 -0
- package/src/platforms/lynx/lib/c/lynx_sfx.h +59 -0
- package/src/platforms/lynx/lib/cc65-src/bllhdr.s +18 -0
- package/src/platforms/lynx/lib/cc65-src/bootldr.s +195 -0
- package/src/platforms/lynx/lib/cc65-src/cgetc.s +69 -0
- package/src/platforms/lynx/lib/cc65-src/clock.s +87 -0
- package/src/platforms/lynx/lib/cc65-src/crt0.s +135 -0
- package/src/platforms/lynx/lib/cc65-src/defdir.s +29 -0
- package/src/platforms/lynx/lib/cc65-src/eeprom.s +255 -0
- package/src/platforms/lynx/lib/cc65-src/eeprom46.s +204 -0
- package/src/platforms/lynx/lib/cc65-src/eeprom66.s +227 -0
- package/src/platforms/lynx/lib/cc65-src/eeprom86.s +236 -0
- package/src/platforms/lynx/lib/cc65-src/exec.s +34 -0
- package/src/platforms/lynx/lib/cc65-src/exehdr.s +27 -0
- package/src/platforms/lynx/lib/cc65-src/extzp.inc +23 -0
- package/src/platforms/lynx/lib/cc65-src/extzp.s +30 -0
- package/src/platforms/lynx/lib/cc65-src/irq.s +45 -0
- package/src/platforms/lynx/lib/cc65-src/joy/lynx-stdjoy.s +93 -0
- package/src/platforms/lynx/lib/cc65-src/joy_stat_stddrv.s +14 -0
- package/src/platforms/lynx/lib/cc65-src/kbhit.s +56 -0
- package/src/platforms/lynx/lib/cc65-src/libref.s +9 -0
- package/src/platforms/lynx/lib/cc65-src/load.s +41 -0
- package/src/platforms/lynx/lib/cc65-src/lseek.s +58 -0
- package/src/platforms/lynx/lib/cc65-src/lynx-cart.s +98 -0
- package/src/platforms/lynx/lib/cc65-src/lynx-snd.s +1270 -0
- package/src/platforms/lynx/lib/cc65-src/mainargs.s +24 -0
- package/src/platforms/lynx/lib/cc65-src/open.s +136 -0
- package/src/platforms/lynx/lib/cc65-src/oserror.s +14 -0
- package/src/platforms/lynx/lib/cc65-src/read.s +44 -0
- package/src/platforms/lynx/lib/cc65-src/ser/lynx-comlynx.s +404 -0
- package/src/platforms/lynx/lib/cc65-src/ser_stat_stddrv.s +14 -0
- package/src/platforms/lynx/lib/cc65-src/sysuname.s +39 -0
- package/src/platforms/lynx/lib/cc65-src/tgi/lynx-160-102-16.s +1075 -0
- package/src/platforms/lynx/lib/cc65-src/tgi_colors.s +9 -0
- package/src/platforms/lynx/lib/cc65-src/tgi_irq.s +11 -0
- package/src/platforms/lynx/lib/cc65-src/tgi_stat_stddrv.s +14 -0
- package/src/platforms/lynx/lib/cc65-src/tgi_stddrv.s +13 -0
- package/src/platforms/lynx/lib/cc65-src/uploader.s +81 -0
- package/src/platforms/lynx/song.js +291 -0
- package/src/platforms/msx/MENTAL_MODEL.md +115 -0
- package/src/platforms/msx/TROUBLESHOOTING.md +62 -0
- package/src/platforms/msx/UPSTREAM_SOURCES.md +46 -0
- package/src/platforms/msx/image-to-tilemap.js +103 -0
- package/src/platforms/msx/lib/c/hello_msx.c +51 -0
- package/src/platforms/msx/lib/c/msx_crt0.s +74 -0
- package/src/platforms/msx/lib/c/msx_hw.h +92 -0
- package/src/platforms/msx/lib/c/msx_vdp.c +150 -0
- package/src/platforms/msx/tiles.js +99 -0
- package/src/platforms/msx/vdp.js +160 -0
- package/src/platforms/nes/MENTAL_MODEL.md +323 -0
- package/src/platforms/nes/TROUBLESHOOTING.md +319 -0
- package/src/platforms/nes/UPSTREAM_SOURCES.md +31 -0
- package/src/platforms/nes/image-to-chr.js +195 -0
- package/src/platforms/nes/image-to-tilemap.js +415 -0
- package/src/platforms/nes/lib/README.md +40 -0
- package/src/platforms/nes/lib/asm/LICENSE-FAMITONE +40 -0
- package/src/platforms/nes/lib/asm/chr_ram_header.s +32 -0
- package/src/platforms/nes/lib/asm/famitone2.s +1258 -0
- package/src/platforms/nes/lib/asm/famitone_bridge.s +50 -0
- package/src/platforms/nes/lib/asm/music_data.s +238 -0
- package/src/platforms/nes/lib/c/chr_ram_runtime_hello_sprite.c +81 -0
- package/src/platforms/nes/lib/c/chr_ram_runtime_hud_row.c +101 -0
- package/src/platforms/nes/lib/c/nes_runtime.c +347 -0
- package/src/platforms/nes/lib/c/nes_runtime.h +153 -0
- package/src/platforms/nes/lib/c/nmi_handler.c +51 -0
- package/src/platforms/nes/lib/c/nmi_trampoline.s +25 -0
- package/src/platforms/nes/lib/cc65-src/Makefile.inc +9 -0
- package/src/platforms/nes/lib/cc65-src/_scrsize.s +24 -0
- package/src/platforms/nes/lib/cc65-src/cclear.s +29 -0
- package/src/platforms/nes/lib/cc65-src/chline.s +31 -0
- package/src/platforms/nes/lib/cc65-src/clock.s +31 -0
- package/src/platforms/nes/lib/cc65-src/clrscr.s +72 -0
- package/src/platforms/nes/lib/cc65-src/color.s +68 -0
- package/src/platforms/nes/lib/cc65-src/cpeekc.s +37 -0
- package/src/platforms/nes/lib/cc65-src/cpeekcolor.s +8 -0
- package/src/platforms/nes/lib/cc65-src/cpeekrevers.s +37 -0
- package/src/platforms/nes/lib/cc65-src/cputc.s +95 -0
- package/src/platforms/nes/lib/cc65-src/crt0.s +180 -0
- package/src/platforms/nes/lib/cc65-src/cvline.s +31 -0
- package/src/platforms/nes/lib/cc65-src/get_tv.s +37 -0
- package/src/platforms/nes/lib/cc65-src/gotox.s +21 -0
- package/src/platforms/nes/lib/cc65-src/gotoxy.s +22 -0
- package/src/platforms/nes/lib/cc65-src/gotoy.s +22 -0
- package/src/platforms/nes/lib/cc65-src/irq.s +19 -0
- package/src/platforms/nes/lib/cc65-src/joy/nes-stdjoy.s +102 -0
- package/src/platforms/nes/lib/cc65-src/joy_stat_stddrv.s +14 -0
- package/src/platforms/nes/lib/cc65-src/libref.s +9 -0
- package/src/platforms/nes/lib/cc65-src/mainargs.s +24 -0
- package/src/platforms/nes/lib/cc65-src/neschar.s +4616 -0
- package/src/platforms/nes/lib/cc65-src/ppu.s +158 -0
- package/src/platforms/nes/lib/cc65-src/ppubuf.s +117 -0
- package/src/platforms/nes/lib/cc65-src/randomize.s +18 -0
- package/src/platforms/nes/lib/cc65-src/revers.s +27 -0
- package/src/platforms/nes/lib/cc65-src/setcursor.s +37 -0
- package/src/platforms/nes/lib/cc65-src/sysuname.s +39 -0
- package/src/platforms/nes/lib/cc65-src/tgi/nes-64-56-2.s +480 -0
- package/src/platforms/nes/lib/cc65-src/tgi_stat_stddrv.s +14 -0
- package/src/platforms/nes/lib/cc65-src/tgi_stddrv.s +13 -0
- package/src/platforms/nes/lib/cc65-src/waitvsync.s +18 -0
- package/src/platforms/nes/lib/cc65-src/wherex.s +19 -0
- package/src/platforms/nes/lib/cc65-src/wherey.s +19 -0
- package/src/platforms/nes/lib/clear_nametable.s +38 -0
- package/src/platforms/nes/lib/clear_oam.s +18 -0
- package/src/platforms/nes/lib/load_palette.s +31 -0
- package/src/platforms/nes/lib/nmi_safe.s +65 -0
- package/src/platforms/nes/lib/oam_dma.s +16 -0
- package/src/platforms/nes/lib/read_pad.s +46 -0
- package/src/platforms/nes/lib/reset.s +46 -0
- package/src/platforms/nes/lib/sprite_table_populate.s +75 -0
- package/src/platforms/nes/lib/wait_vblank.s +12 -0
- package/src/platforms/nes/palette.js +39 -0
- package/src/platforms/nes/ppu.js +448 -0
- package/src/platforms/pce/MENTAL_MODEL.md +98 -0
- package/src/platforms/pce/TROUBLESHOOTING.md +54 -0
- package/src/platforms/pce/UPSTREAM_SOURCES.md +38 -0
- package/src/platforms/pce/image-to-tilemap.js +123 -0
- package/src/platforms/pce/lib/c/hello_pce.c +37 -0
- package/src/platforms/pce/lib/c/pce_hw.h +130 -0
- package/src/platforms/pce/lib/c/pce_input.c +36 -0
- package/src/platforms/pce/lib/c/pce_sound.c +53 -0
- package/src/platforms/pce/lib/c/pce_video.c +113 -0
- package/src/platforms/pce/tiles.js +92 -0
- package/src/platforms/pce/vce.js +59 -0
- package/src/platforms/pce/vdc.js +52 -0
- package/src/platforms/sms/MENTAL_MODEL.md +286 -0
- package/src/platforms/sms/TROUBLESHOOTING.md +140 -0
- package/src/platforms/sms/UPSTREAM_SOURCES.md +29 -0
- package/src/platforms/sms/image-to-tilemap.js +260 -0
- package/src/platforms/sms/lib/README.md +117 -0
- package/src/platforms/sms/lib/c/joypad_read.c +33 -0
- package/src/platforms/sms/lib/c/load_palette.c +24 -0
- package/src/platforms/sms/lib/c/load_tiles.c +32 -0
- package/src/platforms/sms/lib/c/sms_crt0.s +101 -0
- package/src/platforms/sms/lib/c/sms_hw.h +53 -0
- package/src/platforms/sms/lib/c/sms_music.c +178 -0
- package/src/platforms/sms/lib/c/sms_music.h +50 -0
- package/src/platforms/sms/lib/c/sms_sfx.c +82 -0
- package/src/platforms/sms/lib/c/sms_sfx.h +40 -0
- package/src/platforms/sms/lib/c/sprite_table.c +60 -0
- package/src/platforms/sms/lib/c/vblank_wait.c +10 -0
- package/src/platforms/sms/lib/c/vdp_init.c +58 -0
- package/src/platforms/sms/lib/header.s +33 -0
- package/src/platforms/sms/lib/joypad_read.s +40 -0
- package/src/platforms/sms/lib/load_palette.s +30 -0
- package/src/platforms/sms/lib/load_tiles.s +50 -0
- package/src/platforms/sms/lib/sprite_table.s +44 -0
- package/src/platforms/sms/lib/vblank_wait.s +36 -0
- package/src/platforms/sms/lib/vdp_init.s +47 -0
- package/src/platforms/sms/song.js +217 -0
- package/src/platforms/sms/vdp.js +530 -0
- package/src/platforms/snes/MENTAL_MODEL.md +289 -0
- package/src/platforms/snes/TROUBLESHOOTING.md +208 -0
- package/src/platforms/snes/UPSTREAM_SOURCES.md +50 -0
- package/src/platforms/snes/brr.js +208 -0
- package/src/platforms/snes/image-to-tilemap.js +227 -0
- package/src/platforms/snes/lib/audio/apu_blob.asm +228 -0
- package/src/platforms/snes/lib/audio/apu_blob.bin +0 -0
- package/src/platforms/snes/lib/audio/explosion.brr +0 -0
- package/src/platforms/snes/lib/audio/sample_bank.bin +0 -0
- package/src/platforms/snes/lib/audio/shoot.brr +0 -0
- package/src/platforms/snes/lib/audio/spc_driver.asm +241 -0
- package/src/platforms/snes/lib/audio_pipeline.asm +62 -0
- package/src/platforms/snes/lib/c/crt0.asm +125 -0
- package/src/platforms/snes/lib/c/hdr.asm +50 -0
- package/src/platforms/snes/lib/c/snes_sfx.c +116 -0
- package/src/platforms/snes/lib/c/snes_sfx.h +96 -0
- package/src/platforms/snes/lib/c/snes_sfx_data.asm +25 -0
- package/src/platforms/snes/lib/cgram_upload.asm +43 -0
- package/src/platforms/snes/lib/lorom_header.asm +47 -0
- package/src/platforms/snes/lib/lorom_multibank.asm +66 -0
- package/src/platforms/snes/lib/nmi_safe.asm +77 -0
- package/src/platforms/snes/lib/oam_upload.asm +45 -0
- package/src/platforms/snes/lib/pad_read.asm +64 -0
- package/src/platforms/snes/lib/pvsneslib/LICENSE +21 -0
- package/src/platforms/snes/lib/pvsneslib/include/ctype.h +6 -0
- package/src/platforms/snes/lib/pvsneslib/include/float.h +4 -0
- package/src/platforms/snes/lib/pvsneslib/include/hdr.asm +47 -0
- package/src/platforms/snes/lib/pvsneslib/include/limits.h +13 -0
- package/src/platforms/snes/lib/pvsneslib/include/math.h +10 -0
- package/src/platforms/snes/lib/pvsneslib/include/setjmp.h +4 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/background.h +396 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/console.h +188 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/dma.h +381 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/input.h +289 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/interrupt.h +264 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/libversion.h +10 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/lzss.h +43 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/map.h +113 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/object.h +234 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/pixel.h +53 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/scores.h +66 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/snestypes.h +65 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/sound.h +245 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/sprite.h +456 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes/video.h +465 -0
- package/src/platforms/snes/lib/pvsneslib/include/snes.h +190 -0
- package/src/platforms/snes/lib/pvsneslib/include/stdarg.h +28 -0
- package/src/platforms/snes/lib/pvsneslib/include/stdbool.h +53 -0
- package/src/platforms/snes/lib/pvsneslib/include/stddef.h +27 -0
- package/src/platforms/snes/lib/pvsneslib/include/stdint.h +7 -0
- package/src/platforms/snes/lib/pvsneslib/include/stdio.h +9 -0
- package/src/platforms/snes/lib/pvsneslib/include/stdlib.h +13 -0
- package/src/platforms/snes/lib/pvsneslib/include/string.h +19 -0
- package/src/platforms/snes/lib/pvsneslib/include/strings.h +5 -0
- package/src/platforms/snes/lib/pvsneslib/source/Makefile +87 -0
- package/src/platforms/snes/lib/pvsneslib/source/backgrounds.asm +834 -0
- package/src/platforms/snes/lib/pvsneslib/source/consoles.asm +1028 -0
- package/src/platforms/snes/lib/pvsneslib/source/crt0_snes.asm +329 -0
- package/src/platforms/snes/lib/pvsneslib/source/dmas.asm +1275 -0
- package/src/platforms/snes/lib/pvsneslib/source/hdr.asm +56 -0
- package/src/platforms/snes/lib/pvsneslib/source/input.asm +445 -0
- package/src/platforms/snes/lib/pvsneslib/source/libc.asm +485 -0
- package/src/platforms/snes/lib/pvsneslib/source/libc_c.c +1214 -0
- package/src/platforms/snes/lib/pvsneslib/source/libm.asm +510 -0
- package/src/platforms/snes/lib/pvsneslib/source/libtcc.asm +374 -0
- package/src/platforms/snes/lib/pvsneslib/source/lzsss.asm +256 -0
- package/src/platforms/snes/lib/pvsneslib/source/maps.asm +1078 -0
- package/src/platforms/snes/lib/pvsneslib/source/objects.asm +2881 -0
- package/src/platforms/snes/lib/pvsneslib/source/scores.asm +226 -0
- package/src/platforms/snes/lib/pvsneslib/source/sm_spc.asm +187 -0
- package/src/platforms/snes/lib/pvsneslib/source/snesmodwla.asm +1186 -0
- package/src/platforms/snes/lib/pvsneslib/source/sounds.asm +273 -0
- package/src/platforms/snes/lib/pvsneslib/source/sprites.asm +3946 -0
- package/src/platforms/snes/lib/pvsneslib/source/vblank.asm +917 -0
- package/src/platforms/snes/lib/pvsneslib/source/videos.asm +1137 -0
- package/src/platforms/snes/lib/reset_init.asm +31 -0
- package/src/platforms/snes/lib/sprite_table_populate.asm +122 -0
- package/src/platforms/snes/lib/vram_dma_upload.asm +42 -0
- package/src/platforms/snes/ppu.js +606 -0
- package/src/platforms/snes/song.js +128 -0
- package/src/playtest/playtest.js +841 -0
- package/src/rom-id/identifier.js +421 -0
- package/src/rom-id/patch.js +217 -0
- package/src/toolchains/_worker/pool.js +253 -0
- package/src/toolchains/_worker/run.js +78 -0
- package/src/toolchains/_worker/wasm-worker.js +233 -0
- package/src/toolchains/arm-none-eabi-gcc/gcc.js +216 -0
- package/src/toolchains/asar/asar.js +542 -0
- package/src/toolchains/assemble-snippet.js +256 -0
- package/src/toolchains/cc65/cc65.js +395 -0
- package/src/toolchains/cc65/da65.js +119 -0
- package/src/toolchains/cc65/dbgparse.js +274 -0
- package/src/toolchains/cc65/preset-resolver.js +59 -0
- package/src/toolchains/cc65/presets/nes/chr-ram-runtime.cfg +79 -0
- package/src/toolchains/cc65/presets/nes/chr-ram-runtime.crt0.s +178 -0
- package/src/toolchains/cc65/presets/nes/chr-ram.cfg +76 -0
- package/src/toolchains/cc65/presets/nes/chr-ram.crt0.s +106 -0
- package/src/toolchains/common/ar.js +121 -0
- package/src/toolchains/common/reassemble.js +353 -0
- package/src/toolchains/common/sdk-cache.js +116 -0
- package/src/toolchains/common/symbols.js +139 -0
- package/src/toolchains/dasm/dasm.js +96 -0
- package/src/toolchains/gba-c/gba-c.js +838 -0
- package/src/toolchains/genesis-c/README.md +61 -0
- package/src/toolchains/genesis-c/genesis-c.js +600 -0
- package/src/toolchains/gnu-ld-map.js +86 -0
- package/src/toolchains/index.js +862 -0
- package/src/toolchains/m68k-elf-gcc/gcc.js +230 -0
- package/src/toolchains/objdump.js +199 -0
- package/src/toolchains/parse-errors.js +338 -0
- package/src/toolchains/registry.js +67 -0
- package/src/toolchains/rgbds/rgbds.js +144 -0
- package/src/toolchains/sdcc/preflight-lint.js +295 -0
- package/src/toolchains/sdcc/sdcc.js +540 -0
- package/src/toolchains/sjasm/sjasm.js +85 -0
- package/src/toolchains/snes-c/snes-c.js +409 -0
- package/src/toolchains/tcc816/tcc816.js +79 -0
- package/src/toolchains/vasm68k/vasm68k.js +138 -0
- package/src/toolchains/wladx/wladx.js +120 -0
- package/src/toolchains/z80/binutils.js +82 -0
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, writeFile, readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { TOOLCHAINS } from "../../toolchains/registry.js";
|
|
5
|
+
import { buildForPlatform } from "../../toolchains/index.js";
|
|
6
|
+
import { resolveLinkerConfig } from "../../toolchains/cc65/preset-resolver.js";
|
|
7
|
+
import { resolveCore } from "../../cores/registry.js";
|
|
8
|
+
import { resetHost, getDisclosure } from "../state.js";
|
|
9
|
+
import { PLATFORM_VIRTUAL_EXT } from "../../host/LibretroHost.js";
|
|
10
|
+
import { imageContent, jsonContent, safeTool, textContent } from "../util.js";
|
|
11
|
+
import { isPlaytestRunning } from "./playtest.js";
|
|
12
|
+
import { buildSourceWithDebugCore } from "./symbols.js";
|
|
13
|
+
import { log as serverLog } from "../log.js";
|
|
14
|
+
|
|
15
|
+
// Record a build outcome into the /log ring buffer so a failed build's stage +
|
|
16
|
+
// error tail are diagnosable later (the request was already traced; this adds
|
|
17
|
+
// the RESULT). On failure we keep a chunk of the build log; on success just the
|
|
18
|
+
// shape. Always recorded; only printed to stdout in verbose mode.
|
|
19
|
+
function logBuildResult(verb, platform, result) {
|
|
20
|
+
if (result?.ok) {
|
|
21
|
+
serverLog.debug(`[build] ${verb} ${platform} OK ${result.binary ? result.binary.length + "B" : ""}`.trim());
|
|
22
|
+
} else {
|
|
23
|
+
const errTail = (result?.log || result?.err || "").slice(-1500);
|
|
24
|
+
serverLog.debug(`[build] ${verb} ${platform} FAILED stage=${result?.stage ?? "?"}${errTail ? "\n" + errTail : ""}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// One-shot "open playtest" hint state — per MCP session, set after the
|
|
29
|
+
// hint has been delivered once so we don't keep nagging legitimate
|
|
30
|
+
// headless flows (CI, automated tests, batch RE work). Keyed by the
|
|
31
|
+
// opaque sessionKey passed in to registerToolchainTools so two MCP
|
|
32
|
+
// sessions don't share state.
|
|
33
|
+
//
|
|
34
|
+
// Cleared when the module is reloaded (server restart). That's fine —
|
|
35
|
+
// the hint is meant to be a gentle one-time nudge, not durable state.
|
|
36
|
+
/** @type {Set<string>} */
|
|
37
|
+
const playtestHintGiven = new Set();
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Make a projectName safe to use as a virtual ROM filename (drives the
|
|
41
|
+
* playtest window title). Strip path separators / control chars, collapse
|
|
42
|
+
* whitespace, cap length. Never returns "" — falls back to "game".
|
|
43
|
+
* @param {string} name
|
|
44
|
+
* @returns {string}
|
|
45
|
+
*/
|
|
46
|
+
function sanitizeProjectName(name) {
|
|
47
|
+
const clean = String(name)
|
|
48
|
+
.replace(/[/\\<>:"|?*\x00-\x1f]/g, " ")
|
|
49
|
+
.replace(/\s+/g, " ")
|
|
50
|
+
.trim()
|
|
51
|
+
.slice(0, 48);
|
|
52
|
+
return clean || "game";
|
|
53
|
+
}
|
|
54
|
+
import { fileURLToPath } from "node:url";
|
|
55
|
+
|
|
56
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
57
|
+
|
|
58
|
+
// Build-log gating (mirrors symbols.js logField). A failing/verbose build
|
|
59
|
+
// log can be huge and explodes the response. Small logs stay inline; large
|
|
60
|
+
// logs are written to a sibling path (when one exists) and only a tail comes
|
|
61
|
+
// back; inline:true returns the full log regardless.
|
|
62
|
+
const LOG_TAIL = 1200;
|
|
63
|
+
|
|
64
|
+
// On a SUCCESSFUL build the GCC LTO path (Genesis/GBA m68k/arm) prints
|
|
65
|
+
// interprocedural-optimization phase banners and a per-pass timing table that
|
|
66
|
+
// carry no diagnostic value — they just crowd the linker-map / objcopy
|
|
67
|
+
// confirmation out of the tail. Strip those blocks on success so the signal
|
|
68
|
+
// stays visible. Left intact on failure (timing can matter when diagnosing a
|
|
69
|
+
// hang/OOM). The full untrimmed log is still written to logPath when spilled.
|
|
70
|
+
export function denoiseSuccessLog(log) {
|
|
71
|
+
const lines = log.split("\n");
|
|
72
|
+
const kept = [];
|
|
73
|
+
let inTiming = false;
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
// GCC `-ftime-report` table: starts at a "Time variable" header and runs
|
|
76
|
+
// through the "TOTAL ... GGC" row. Drop the whole block.
|
|
77
|
+
if (/^\s*Time variable\b/.test(line)) { inTiming = true; continue; }
|
|
78
|
+
if (inTiming) {
|
|
79
|
+
if (/^\s*TOTAL\b/.test(line)) inTiming = false;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// LTO interprocedural-optimization phase dump:
|
|
83
|
+
// "Performing interprocedural optimizations"
|
|
84
|
+
// " <*free_lang_data> {heap 32M} <visibility> {heap 32M} ..."
|
|
85
|
+
if (/^\s*Performing interprocedural optimizations\s*$/.test(line)) continue;
|
|
86
|
+
if (/^\s*<[\w*][^>]*>\s*\{heap\b/.test(line)) continue;
|
|
87
|
+
kept.push(line);
|
|
88
|
+
}
|
|
89
|
+
return kept.join("\n");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Fold the build log into a response payload per the gating rule.
|
|
94
|
+
* @param {string|undefined|null} log
|
|
95
|
+
* @param {boolean} inline caller asked for the full log inline
|
|
96
|
+
* @param {string|null} siblingPath where to write a large log (e.g. ROM path + ".build.log"); null = nowhere
|
|
97
|
+
* @param {boolean} [ok=false] whether the build succeeded — denoise LTO/timing on success
|
|
98
|
+
* @returns {object} fields to spread into the response
|
|
99
|
+
*/
|
|
100
|
+
async function logField(log, inline, siblingPath, ok = false) {
|
|
101
|
+
if (!log) return { log: null };
|
|
102
|
+
// Always write the FULL untrimmed log to disk (it's the forensic record);
|
|
103
|
+
// only the inline/tail view is denoised on success.
|
|
104
|
+
const view = ok ? denoiseSuccessLog(log) : log;
|
|
105
|
+
if (inline || view.length <= LOG_TAIL) return { log: view };
|
|
106
|
+
if (siblingPath) {
|
|
107
|
+
await writeFile(siblingPath, log, "utf8");
|
|
108
|
+
return { logPath: siblingPath, logTail: view.slice(-LOG_TAIL), logBytes: log.length };
|
|
109
|
+
}
|
|
110
|
+
// No place to write — the log is a byproduct, not a primary artifact, so
|
|
111
|
+
// return the tail + size rather than throwing.
|
|
112
|
+
return { logTail: view.slice(-LOG_TAIL), logBytes: log.length };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// SDCC platforms whose stock-SDCC crt0 doesn't actually boot the target
|
|
116
|
+
// hardware. We bundle a working crt0 in lib/c/ for each — when the
|
|
117
|
+
// agent calls buildSource without an explicit crt0, auto-inject the
|
|
118
|
+
// bundled one so "createProject + buildSource" Just Works.
|
|
119
|
+
//
|
|
120
|
+
// Paths are relative to src/, resolved against this module's location.
|
|
121
|
+
// GB/GBC also ship gb_crt0.s but require codeLoc:0x150 (cart header
|
|
122
|
+
// reserves $0100-$014F) — keep them opt-in to avoid breaking scripts
|
|
123
|
+
// that don't pass codeLoc.
|
|
124
|
+
const AUTO_CRT0_PLATFORMS = {
|
|
125
|
+
sms: "platforms/sms/lib/c/sms_crt0.s",
|
|
126
|
+
gg: "platforms/gg/lib/c/gg_crt0.s",
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
async function resolveAutoCrt0(platform) {
|
|
130
|
+
const rel = AUTO_CRT0_PLATFORMS[platform];
|
|
131
|
+
if (!rel) return null;
|
|
132
|
+
const abs = path.resolve(__dirname, "..", "..", rel);
|
|
133
|
+
return await readFile(abs, "utf-8");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Describe a built ROM's on-disk layout in human terms. Surfaces the
|
|
138
|
+
* "why is this 40976 bytes when my code is 200 lines?" question so the
|
|
139
|
+
* agent doesn't have to discover NROM/LoROM padding empirically. Returns
|
|
140
|
+
* null when the platform/binary doesn't have a recognizable header.
|
|
141
|
+
*
|
|
142
|
+
* @param {string} platform
|
|
143
|
+
* @param {Uint8Array | Buffer | null | undefined} bin
|
|
144
|
+
* @returns {string | null}
|
|
145
|
+
*/
|
|
146
|
+
function describeRomLayout(platform, bin) {
|
|
147
|
+
if (!bin || bin.length < 16) return null;
|
|
148
|
+
const total = bin.length;
|
|
149
|
+
// NES iNES header: "NES\x1A" + prgBanks(16K) + chrBanks(8K) + flags
|
|
150
|
+
if (platform === "nes" && bin[0] === 0x4E && bin[1] === 0x45 && bin[2] === 0x53 && bin[3] === 0x1A) {
|
|
151
|
+
const prgBanks = bin[4];
|
|
152
|
+
const chrBanks = bin[5];
|
|
153
|
+
const flags6 = bin[6];
|
|
154
|
+
const flags7 = bin[7];
|
|
155
|
+
const mapper = (flags6 >> 4) | (flags7 & 0xF0);
|
|
156
|
+
const prgK = prgBanks * 16;
|
|
157
|
+
const chrK = chrBanks * 8;
|
|
158
|
+
const chrKind = chrBanks === 0 ? "CHR-RAM (no CHR data in ROM)" : `${chrK}KB CHR-ROM`;
|
|
159
|
+
return `${total}B = 16B iNES header + ${prgK}KB PRG-ROM + ${chrKind}, mapper ${mapper}` +
|
|
160
|
+
(mapper === 0 ? " (NROM — fixed size; padding is normal)" : "");
|
|
161
|
+
}
|
|
162
|
+
// SNES LoROM/HiROM: size is always 32KB-aligned (LoROM banks) or 64KB-aligned (HiROM).
|
|
163
|
+
if (platform === "snes") {
|
|
164
|
+
const k = Math.floor(total / 1024);
|
|
165
|
+
const layout = total % 32768 === 0 ? "LoROM (32KB banks)" : "HiROM (64KB banks)";
|
|
166
|
+
return `${total}B = ${k}KB, ${layout}`;
|
|
167
|
+
}
|
|
168
|
+
// Genesis: flat 68k binary, finalized like SGDK (padded to a 128KB
|
|
169
|
+
// boundary, min 512KB, with the $18E checksum fixed) so it loads on
|
|
170
|
+
// strict cores (RetroArch Genesis Plus GX, BlastEm) and flashcarts —
|
|
171
|
+
// not just gpgx-WASM.
|
|
172
|
+
if (platform === "genesis") {
|
|
173
|
+
const k = Math.floor(total / 1024);
|
|
174
|
+
const aligned = total % 131072 === 0;
|
|
175
|
+
return `${total}B = ${k}KB 68k ROM (padded to 128KB boundary${aligned ? "" : " — WARN: not aligned"}, $18E checksum fixed; loads on real cores/flashcarts)`;
|
|
176
|
+
}
|
|
177
|
+
// GB / GBC: 32KB minimum (one ROM bank).
|
|
178
|
+
if (platform === "gb" || platform === "gbc") {
|
|
179
|
+
const k = Math.floor(total / 1024);
|
|
180
|
+
return `${total}B = ${k}KB Game Boy ROM (${total >= 32768 ? "≥1 ROM bank" : "smaller than min bank — may not boot"})`;
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** platform({op:'toolchains'}) without an id — list bundled toolchains. */
|
|
186
|
+
export function listToolchainsCore() {
|
|
187
|
+
return {
|
|
188
|
+
toolchains: Object.values(TOOLCHAINS).map((t) => ({
|
|
189
|
+
id: t.id,
|
|
190
|
+
displayName: t.displayName,
|
|
191
|
+
platforms: t.platforms,
|
|
192
|
+
tier: t.tier,
|
|
193
|
+
installed: t.tier === 1, // Tier-1 is always bundled
|
|
194
|
+
})),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** platform({op:'toolchains', id}) — confirm one toolchain's install status (no-op in v1). */
|
|
199
|
+
export function installToolchainCore({ id }) {
|
|
200
|
+
const t = TOOLCHAINS[id];
|
|
201
|
+
if (!t) throw new Error(`unknown toolchain '${id}'. Use platform({op:'toolchains'}) to see available ids.`);
|
|
202
|
+
if (t.tier === 1) return { id, installed: true, note: `toolchain '${id}' is bundled — nothing to install` };
|
|
203
|
+
throw new Error(`toolchain '${id}' is tier-2 and not yet implemented in v1`);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function registerToolchainTools(server, z, sessionKey) {
|
|
207
|
+
async function buildSourceImpl({ platform, language, source, sourcePath, sources, sourcesPaths, includes, binaryIncludes, binaryIncludePaths, includePaths, crt0, crt0Path, codeLoc, dataLoc, options, linkerConfig, outputPath, inline = false, includeSymbols = false, lint = "advisory", runtime, maxmod, rebuildSdk }) {
|
|
208
|
+
// Reject conflicting inline vs path args — fail loud, not silent.
|
|
209
|
+
if (source != null && sourcePath != null) {
|
|
210
|
+
throw new Error("build({output:'rom'}): pass either `source` OR `sourcePath`, not both.");
|
|
211
|
+
}
|
|
212
|
+
if (sources != null && sourcesPaths != null) {
|
|
213
|
+
throw new Error("build({output:'rom'}): pass either `sources` OR `sourcesPaths`, not both.");
|
|
214
|
+
}
|
|
215
|
+
if (crt0 != null && crt0Path != null) {
|
|
216
|
+
throw new Error("build({output:'rom'}): pass either `crt0` OR `crt0Path`, not both.");
|
|
217
|
+
}
|
|
218
|
+
// crt0Path → crt0 source.
|
|
219
|
+
if (crt0Path) {
|
|
220
|
+
crt0 = await readFile(crt0Path, "utf-8");
|
|
221
|
+
}
|
|
222
|
+
// Auto-inject the bundled crt0 for SMS/GG when caller didn't pass
|
|
223
|
+
// one. Stock SDCC crt0 doesn't boot these targets; without this,
|
|
224
|
+
// user main() is never called → black screen. See AUTO_CRT0_PLATFORMS.
|
|
225
|
+
if (crt0 == null) {
|
|
226
|
+
crt0 = await resolveAutoCrt0(platform);
|
|
227
|
+
}
|
|
228
|
+
// Resolve sourcePath → source.
|
|
229
|
+
if (sourcePath) {
|
|
230
|
+
source = await readFile(sourcePath, "utf-8");
|
|
231
|
+
}
|
|
232
|
+
// Resolve sourcesPaths → sources.
|
|
233
|
+
if (sourcesPaths) {
|
|
234
|
+
sources = {};
|
|
235
|
+
for (const [name, p] of Object.entries(sourcesPaths)) {
|
|
236
|
+
sources[name] = await readFile(p, "utf-8");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Resolve path-based includes by reading from disk. Lets agents skip
|
|
240
|
+
// pumping big binary blobs through their own context window.
|
|
241
|
+
const mergedIncludes = { ...(includes ?? {}) };
|
|
242
|
+
if (includePaths) {
|
|
243
|
+
for (const [name, p] of Object.entries(includePaths)) {
|
|
244
|
+
mergedIncludes[name] = await readFile(p, "utf-8");
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const mergedBinaryIncludes = { ...(binaryIncludes ?? {}) };
|
|
248
|
+
if (binaryIncludePaths) {
|
|
249
|
+
for (const [name, p] of Object.entries(binaryIncludePaths)) {
|
|
250
|
+
const bytes = await readFile(p);
|
|
251
|
+
mergedBinaryIncludes[name] = bytes.toString("base64");
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const { cfg: resolvedLinkerConfig, supportSources } = await resolveLinkerConfig(platform, linkerConfig);
|
|
255
|
+
// Splice preset support sources (e.g. custom crt0) into the project.
|
|
256
|
+
// User sources take precedence — never overwrite a source the agent
|
|
257
|
+
// explicitly provided.
|
|
258
|
+
const mergedSources = sources
|
|
259
|
+
? { ...supportSources, ...sources }
|
|
260
|
+
: Object.keys(supportSources).length
|
|
261
|
+
? { ...supportSources, ...(source ? { "main.c": source } : {}) }
|
|
262
|
+
: undefined;
|
|
263
|
+
const useSource = mergedSources ? undefined : source;
|
|
264
|
+
// Assemble caller-supplied crt0 (SDCC platforms). sm83 → sdasgb,
|
|
265
|
+
// everything else → sdasz80.
|
|
266
|
+
let crt0Rel;
|
|
267
|
+
if (crt0) {
|
|
268
|
+
const isSm83 = platform === "gb" || platform === "gbc";
|
|
269
|
+
const { runSdasgb, runSdasz80 } = await import("../../toolchains/sdcc/sdcc.js");
|
|
270
|
+
const asm = isSm83 ? await runSdasgb({ source: crt0 }) : await runSdasz80({ source: crt0 });
|
|
271
|
+
if (!asm.rel) {
|
|
272
|
+
throw new Error(`crt0 assembly failed:\n${asm.log}`);
|
|
273
|
+
}
|
|
274
|
+
crt0Rel = asm.rel;
|
|
275
|
+
}
|
|
276
|
+
const result = await buildForPlatform({
|
|
277
|
+
platform,
|
|
278
|
+
language,
|
|
279
|
+
runtime,
|
|
280
|
+
maxmod,
|
|
281
|
+
rebuildSdk,
|
|
282
|
+
source: useSource,
|
|
283
|
+
// Basename of the on-disk source, when given — lets language inference
|
|
284
|
+
// route by extension (main.c → C, main.s → asm) so an omitted
|
|
285
|
+
// `language` doesn't fall to the wrong toolchain (the genesis foot-gun).
|
|
286
|
+
sourceName: sourcePath ? path.basename(sourcePath) : undefined,
|
|
287
|
+
sources: mergedSources,
|
|
288
|
+
includes: Object.keys(mergedIncludes).length ? mergedIncludes : undefined,
|
|
289
|
+
binaryIncludes: Object.keys(mergedBinaryIncludes).length ? mergedBinaryIncludes : undefined,
|
|
290
|
+
options,
|
|
291
|
+
linkerConfig: resolvedLinkerConfig,
|
|
292
|
+
crt0: crt0Rel,
|
|
293
|
+
codeLoc,
|
|
294
|
+
dataLoc,
|
|
295
|
+
});
|
|
296
|
+
logBuildResult("buildSource", platform, result);
|
|
297
|
+
// lint:"strict" — if any lint warning fired, fail the build with
|
|
298
|
+
// stage:"lint" so the agent must fix patterns before iterating.
|
|
299
|
+
// We mutate the result rather than re-running because the lint
|
|
300
|
+
// already ran inside buildForPlatform.
|
|
301
|
+
if (lint === "strict" && result.issues) {
|
|
302
|
+
const lintHits = result.issues.filter((x) => x.stage === "lint");
|
|
303
|
+
if (lintHits.length > 0) {
|
|
304
|
+
result.ok = false;
|
|
305
|
+
result.binary = null; // refuse to ship a binary in strict mode
|
|
306
|
+
result.stage = "lint";
|
|
307
|
+
result.exitCode = result.exitCode || 1;
|
|
308
|
+
result.lintStrictBlocked = lintHits.length;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
let finalPath = null;
|
|
312
|
+
if (result.binary) {
|
|
313
|
+
if (outputPath) {
|
|
314
|
+
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
315
|
+
await writeFile(outputPath, result.binary);
|
|
316
|
+
finalPath = outputPath;
|
|
317
|
+
} else if (!inline) {
|
|
318
|
+
// Default: write to a temp file so the response stays tiny.
|
|
319
|
+
const tmpDir = await mkdtemp(path.join(tmpdir(), "romdev-"));
|
|
320
|
+
finalPath = path.join(tmpDir, "out.bin");
|
|
321
|
+
await writeFile(finalPath, result.binary);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// One-shot session hint: nudge the agent toward playtest the first
|
|
325
|
+
// time a build succeeds, IF the show category isn't already loaded.
|
|
326
|
+
// Fires once per session so it isn't spam on every iteration.
|
|
327
|
+
const d = getDisclosure();
|
|
328
|
+
const showHint = result.ok && d && !d.isLoaded("show")
|
|
329
|
+
? d.consumeHint(
|
|
330
|
+
"show-after-first-build",
|
|
331
|
+
"Build succeeded — your user can watch the game live by calling " +
|
|
332
|
+
"loadCategory({category:'show'}) then playtest({}). It returns immediately " +
|
|
333
|
+
"and the window follows your rebuilds, so the emulator stays available to " +
|
|
334
|
+
"all other tools (screenshot, readMemory, saveState, pause, stepFrames, ...) " +
|
|
335
|
+
"while the human plays — screenshot() shows the same frame the human sees. " +
|
|
336
|
+
"Recommended early in any session where a user is watching."
|
|
337
|
+
)
|
|
338
|
+
: null;
|
|
339
|
+
// Gate the build log: small → inline; large → sibling file next to the
|
|
340
|
+
// ROM (or its tail when there's nowhere to write); inline:true → full.
|
|
341
|
+
const logSibling = finalPath ? `${finalPath}.build.log` : null;
|
|
342
|
+
const payload = {
|
|
343
|
+
ok: result.ok,
|
|
344
|
+
toolchain: result.toolchain,
|
|
345
|
+
exitCode: result.exitCode,
|
|
346
|
+
binaryBytes: result.binary ? result.binary.length : 0,
|
|
347
|
+
binaryPath: finalPath,
|
|
348
|
+
outputPath: outputPath && result.binary ? outputPath : null,
|
|
349
|
+
romLayout: describeRomLayout(platform, result.binary),
|
|
350
|
+
...(result.ramUsage ? { ramUsage: result.ramUsage } : {}),
|
|
351
|
+
...(result.stage ? { stage: result.stage } : {}),
|
|
352
|
+
...(result.sdkEditIgnored ? { sdkEditIgnored: result.sdkEditIgnored } : {}),
|
|
353
|
+
...(await logField(result.log, inline, logSibling, result.ok)),
|
|
354
|
+
issues: result.issues ?? [],
|
|
355
|
+
...(showHint ? { hint: showHint } : {}),
|
|
356
|
+
};
|
|
357
|
+
// When a build failed on a specific TU (multi-source SDCC build),
|
|
358
|
+
// surface that explicitly so the agent doesn't have to grep the
|
|
359
|
+
// log for "FAILED on TU 'name'". If sourcesPaths was used, also
|
|
360
|
+
// include the host path so the agent can open the right file.
|
|
361
|
+
if (result.failedTU) {
|
|
362
|
+
payload.failedTU = result.failedTU;
|
|
363
|
+
payload.compiledOK = result.compiledOK ?? [];
|
|
364
|
+
if (sourcesPaths && sourcesPaths[result.failedTU]) {
|
|
365
|
+
payload.failedTUHostPath = sourcesPaths[result.failedTU];
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// lint:"strict" — surface the count of lint hits that blocked the
|
|
369
|
+
// build so the agent immediately knows WHY ok:false (vs. a real
|
|
370
|
+
// compiler error).
|
|
371
|
+
if (result.lintStrictBlocked) {
|
|
372
|
+
payload.lintStrictBlocked = result.lintStrictBlocked;
|
|
373
|
+
payload.note = `Build failed in lint:"strict" mode — ${result.lintStrictBlocked} pattern(s) flagged. ` +
|
|
374
|
+
`Fix the issues[] entries with stage:"lint" and rebuild. Pass lint:"advisory" (default) to treat them as warnings instead.`;
|
|
375
|
+
}
|
|
376
|
+
// Only include binaryBase64 when the caller actually wants the
|
|
377
|
+
// bytes inline. Otherwise it's just a confusing `null` field on
|
|
378
|
+
// every response.
|
|
379
|
+
if (inline && result.binary) {
|
|
380
|
+
payload.binaryBase64 = Buffer.from(result.binary).toString("base64");
|
|
381
|
+
}
|
|
382
|
+
// Symbols/map info: only include when the underlying toolchain
|
|
383
|
+
// produced something. SDCC stuffs the .map file here; cc65 writes
|
|
384
|
+
// a .sym table; vasm68k emits a listing. Keep it small.
|
|
385
|
+
if (result.symbols && result.symbols.length > 0) {
|
|
386
|
+
payload.symbolsBytes = result.symbols.length;
|
|
387
|
+
// Don't embed the whole map by default — it can be 30+ KB on
|
|
388
|
+
// bigger games and explodes the response. Caller passes
|
|
389
|
+
// `includeSymbols:true` to opt in.
|
|
390
|
+
if (includeSymbols) {
|
|
391
|
+
payload.symbols = result.symbols;
|
|
392
|
+
} else {
|
|
393
|
+
payload.symbolsHint = "Pass `includeSymbols: true` to get the full .map/.sym text inline. Or call `addressToSymbol({pc})` to look up a single address without loading it.";
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return jsonContent(payload);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
async function runSourceImpl({ platform, language, source, sourcePath, sources, sourcesPaths, includes, binaryIncludes, binaryIncludePaths, includePaths, runtime, maxmod, rebuildSdk, crt0, crt0Path, codeLoc, dataLoc, linkerConfig, frames = 60, holdInputs, screenshotPath, projectName }) {
|
|
400
|
+
const { buildForPlatform } = await import("../../toolchains/index.js");
|
|
401
|
+
const resolved = resolveCore(platform);
|
|
402
|
+
if (!resolved) throw new Error(`no core available for platform '${platform}'`);
|
|
403
|
+
|
|
404
|
+
if (source != null && sourcePath != null) {
|
|
405
|
+
throw new Error("build({output:'run'}): pass either `source` OR `sourcePath`, not both.");
|
|
406
|
+
}
|
|
407
|
+
if (sources != null && sourcesPaths != null) {
|
|
408
|
+
throw new Error("build({output:'run'}): pass either `sources` OR `sourcesPaths`, not both.");
|
|
409
|
+
}
|
|
410
|
+
if (crt0 != null && crt0Path != null) {
|
|
411
|
+
throw new Error("build({output:'run'}): pass either `crt0` OR `crt0Path`, not both.");
|
|
412
|
+
}
|
|
413
|
+
if (crt0Path) {
|
|
414
|
+
crt0 = await readFile(crt0Path, "utf-8");
|
|
415
|
+
}
|
|
416
|
+
// Auto-inject bundled crt0 for SMS/GG when caller didn't pass one
|
|
417
|
+
// (stock SDCC crt0 doesn't boot these targets — see buildSource).
|
|
418
|
+
if (crt0 == null) {
|
|
419
|
+
crt0 = await resolveAutoCrt0(platform);
|
|
420
|
+
}
|
|
421
|
+
if (sourcePath) {
|
|
422
|
+
source = await readFile(sourcePath, "utf-8");
|
|
423
|
+
}
|
|
424
|
+
if (sourcesPaths) {
|
|
425
|
+
sources = {};
|
|
426
|
+
for (const [name, p] of Object.entries(sourcesPaths)) {
|
|
427
|
+
sources[name] = await readFile(p, "utf-8");
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
const mergedIncludes = { ...(includes ?? {}) };
|
|
431
|
+
if (includePaths) {
|
|
432
|
+
for (const [name, p] of Object.entries(includePaths)) {
|
|
433
|
+
mergedIncludes[name] = await readFile(p, "utf-8");
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
const mergedBinaryIncludes = { ...(binaryIncludes ?? {}) };
|
|
437
|
+
if (binaryIncludePaths) {
|
|
438
|
+
for (const [name, p] of Object.entries(binaryIncludePaths)) {
|
|
439
|
+
const bytes = await readFile(p);
|
|
440
|
+
mergedBinaryIncludes[name] = bytes.toString("base64");
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const { cfg: resolvedLinkerConfig2, supportSources: supportSources2 } = await resolveLinkerConfig(platform, linkerConfig);
|
|
444
|
+
const mergedSources2 = sources
|
|
445
|
+
? { ...supportSources2, ...sources }
|
|
446
|
+
: Object.keys(supportSources2).length
|
|
447
|
+
? { ...supportSources2, ...(source ? { "main.c": source } : {}) }
|
|
448
|
+
: undefined;
|
|
449
|
+
const useSource2 = mergedSources2 ? undefined : source;
|
|
450
|
+
// Assemble caller-supplied crt0 (SDCC platforms).
|
|
451
|
+
let crt0Rel2;
|
|
452
|
+
if (crt0) {
|
|
453
|
+
const isSm83 = platform === "gb" || platform === "gbc";
|
|
454
|
+
const { runSdasgb, runSdasz80 } = await import("../../toolchains/sdcc/sdcc.js");
|
|
455
|
+
const asm = isSm83 ? await runSdasgb({ source: crt0 }) : await runSdasz80({ source: crt0 });
|
|
456
|
+
if (!asm.rel) {
|
|
457
|
+
throw new Error(`crt0 assembly failed:\n${asm.log}`);
|
|
458
|
+
}
|
|
459
|
+
crt0Rel2 = asm.rel;
|
|
460
|
+
}
|
|
461
|
+
const build = await buildForPlatform({
|
|
462
|
+
platform,
|
|
463
|
+
language,
|
|
464
|
+
runtime,
|
|
465
|
+
maxmod,
|
|
466
|
+
rebuildSdk,
|
|
467
|
+
source: useSource2,
|
|
468
|
+
sourceName: sourcePath ? path.basename(sourcePath) : undefined,
|
|
469
|
+
sources: mergedSources2,
|
|
470
|
+
includes: Object.keys(mergedIncludes).length ? mergedIncludes : undefined,
|
|
471
|
+
binaryIncludes: Object.keys(mergedBinaryIncludes).length ? mergedBinaryIncludes : undefined,
|
|
472
|
+
linkerConfig: resolvedLinkerConfig2,
|
|
473
|
+
crt0: crt0Rel2,
|
|
474
|
+
codeLoc,
|
|
475
|
+
dataLoc,
|
|
476
|
+
});
|
|
477
|
+
logBuildResult("runSource", platform, build);
|
|
478
|
+
if (!build.ok || !build.binary) {
|
|
479
|
+
// runSource builds in-memory (no ROM path), so a large failure log
|
|
480
|
+
// has nowhere to land — gate it to a tail + size rather than dumping
|
|
481
|
+
// the whole thing. No `inline` param here; the tail is the contract.
|
|
482
|
+
return jsonContent({
|
|
483
|
+
ok: false,
|
|
484
|
+
stage: "build",
|
|
485
|
+
toolchain: build.toolchain,
|
|
486
|
+
exitCode: build.exitCode,
|
|
487
|
+
...(await logField(build.log, false, null)),
|
|
488
|
+
issues: build.issues ?? [],
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const host = resetHost(sessionKey);
|
|
493
|
+
await host.loadCore(resolved.jsPath, resolved.wasmPath);
|
|
494
|
+
// Pass projectName as a virtualName so the playtest window titles itself
|
|
495
|
+
// with the game name (the SDL window reads host.status.mediaPath). Keep
|
|
496
|
+
// a platform-correct extension so shared cores still resolve the system.
|
|
497
|
+
const virtualName = projectName
|
|
498
|
+
? sanitizeProjectName(projectName) + (PLATFORM_VIRTUAL_EXT[platform] ?? "")
|
|
499
|
+
: undefined;
|
|
500
|
+
await host.loadMedia({ platform, bytes: build.binary, virtualName });
|
|
501
|
+
if (holdInputs && holdInputs.length > 0) {
|
|
502
|
+
host.setInput({ ports: holdInputs });
|
|
503
|
+
}
|
|
504
|
+
host.stepFrames(frames);
|
|
505
|
+
// NES: the NMI handler DMAs shadow OAM → real OAM at the START of each
|
|
506
|
+
// vblank, so sprites the game staged on frame N only become visible
|
|
507
|
+
// when frame N+1 renders. Without this, the screenshot looks "one frame
|
|
508
|
+
// behind" the staged OAM (a real surprise agents hit during debugging).
|
|
509
|
+
// Step one extra frame on NES so the screenshot matches staged sprites.
|
|
510
|
+
if (platform === "nes") host.stepFrames(1);
|
|
511
|
+
const shot = host.screenshot();
|
|
512
|
+
|
|
513
|
+
// One-shot "open playtest" hint. Conditions to attach:
|
|
514
|
+
// - the run succeeded (we only got here on success)
|
|
515
|
+
// - no playtest window is currently open
|
|
516
|
+
// - we haven't already delivered the hint in this MCP session
|
|
517
|
+
// Repeated hints would be annoying for legitimate headless flows
|
|
518
|
+
// (CI, automated tests, agent working alone). Once is a nudge;
|
|
519
|
+
// repeated is friction.
|
|
520
|
+
let hint;
|
|
521
|
+
if (!isPlaytestRunning(sessionKey) && !playtestHintGiven.has(sessionKey)) {
|
|
522
|
+
playtestHintGiven.add(sessionKey);
|
|
523
|
+
hint = "No playtest window is open. If a human is watching, consider " +
|
|
524
|
+
"`loadCategory({category:\"show\"})` then `playtest()` so they can " +
|
|
525
|
+
"play this ROM live while you keep iterating with runSource " +
|
|
526
|
+
"(rebuilds update the live game in place). Skip if this session " +
|
|
527
|
+
"is headless (CI / batch / automated).";
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
const summary = {
|
|
531
|
+
ok: true,
|
|
532
|
+
platform,
|
|
533
|
+
core: resolved.coreName,
|
|
534
|
+
toolchain: build.toolchain,
|
|
535
|
+
binaryBytes: build.binary.length,
|
|
536
|
+
romLayout: describeRomLayout(platform, build.binary),
|
|
537
|
+
...(build.ramUsage ? { ramUsage: build.ramUsage } : {}),
|
|
538
|
+
...(build.sdkEditIgnored ? { sdkEditIgnored: build.sdkEditIgnored } : {}),
|
|
539
|
+
framesRun: frames,
|
|
540
|
+
framebuffer: { width: shot.width, height: shot.height },
|
|
541
|
+
// Surface lint/build issues even on successful runs so agents see
|
|
542
|
+
// linter warnings BEFORE the next iteration (was: runSource silently
|
|
543
|
+
// ran with warnings, agent missed them, hit the crash 100 functions later).
|
|
544
|
+
...((build.issues ?? []).length > 0 ? { issues: build.issues } : {}),
|
|
545
|
+
...(hint ? { hint } : {}),
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
// Default: screenshot comes back inline (runSource is the "show me the
|
|
549
|
+
// result" loop). If screenshotPath is set, write it there instead —
|
|
550
|
+
// for clients that can't display inline images.
|
|
551
|
+
if (screenshotPath) {
|
|
552
|
+
// Create the parent dir if missing so a path like ".../shots/title.png"
|
|
553
|
+
// doesn't ENOENT when the agent hasn't pre-made the folder.
|
|
554
|
+
await mkdir(path.dirname(screenshotPath), { recursive: true });
|
|
555
|
+
await writeFile(screenshotPath, Buffer.from(shot.pngBase64, "base64"));
|
|
556
|
+
const json = jsonContent({ ...summary, screenshotPath });
|
|
557
|
+
json._observerImages = [{ kind: "image", mimeType: "image/png", base64: shot.pngBase64 }];
|
|
558
|
+
return json;
|
|
559
|
+
}
|
|
560
|
+
return {
|
|
561
|
+
content: [
|
|
562
|
+
imageContent(shot.pngBase64),
|
|
563
|
+
{ type: "text", text: JSON.stringify(summary, null, 2) },
|
|
564
|
+
],
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// build({output:'project'}) — build a project DIRECTORY (no per-call manifest).
|
|
569
|
+
// Discovers main.c (C/SGDK/GBA/cc65 C) or main.s/main.asm (asm) and links
|
|
570
|
+
// every source in the dir. Delegates to the module-scope buildProjectCore.
|
|
571
|
+
const buildProjectImpl = (args) => buildProjectCore(args);
|
|
572
|
+
|
|
573
|
+
// ── the `build` router ──────────────────────────────────────────────────
|
|
574
|
+
const sourcesShape = z.record(z.string(), z.string());
|
|
575
|
+
const holdInputShape = z.object({
|
|
576
|
+
up: z.boolean().optional(), down: z.boolean().optional(),
|
|
577
|
+
left: z.boolean().optional(), right: z.boolean().optional(),
|
|
578
|
+
a: z.boolean().optional(), b: z.boolean().optional(),
|
|
579
|
+
x: z.boolean().optional(), y: z.boolean().optional(),
|
|
580
|
+
l: z.boolean().optional(), r: z.boolean().optional(),
|
|
581
|
+
l2: z.boolean().optional(), r2: z.boolean().optional(),
|
|
582
|
+
l3: z.boolean().optional(), r3: z.boolean().optional(),
|
|
583
|
+
start: z.boolean().optional(), select: z.boolean().optional(),
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
server.tool(
|
|
587
|
+
"build",
|
|
588
|
+
"Compile/assemble source for a target platform; one tool keyed by `output`.\n" +
|
|
589
|
+
"• output:'rom' (default) — assemble or compile `source` (single) / `sources` ({name:contents}) / `sourcePath` / `sourcesPaths`. Returns the ROM (path by default; `inline:true` for binaryBase64) + build log. **`binaryIncludes`/`binaryIncludePaths` (base64/path CHR-ROM, music blobs for `.incbin`) — WITHOUT them no game with external assets builds.** `includes`/`includePaths` for `.include`d text. `linkerConfig` (cc65; NES preset 'chr-ram-runtime' RECOMMENDED). `crt0`/`crt0Path`/`codeLoc`/`dataLoc` (SDCC). `runtime`/`maxmod`/`rebuildSdk` (GBA/Genesis SDK). **`lint:'strict'` fails the build (stage:'lint', no binary) if the pre-flight SDCC crash-pattern scan flags anything (e.g. the uint8 loop-bound trap); 'advisory' (default) just lists hits in issues[].** **`includeSymbols:true` returns the .map text inline on a PLAIN rom build — distinct from output:'romWithDebug' which writes .dbg/.map FILES.** Language is inferred from extension/content — usually OMIT `language`.\n" +
|
|
590
|
+
"• output:'romWithDebug' — like 'rom' but also emits linker debug info for the `symbols` tool: cc65 → `.dbg`, SDCC → sdld `.map`, Genesis m68k → GNU ld map (find where a RAM var landed). DEFAULT writes ROM + debug file + log to disk (`outputPath` required unless `inline:true`).\n" +
|
|
591
|
+
"• output:'run' — BUILD + LOAD + RUN + SCREENSHOT in one round trip — the fastest iteration loop. Same build args; runs `frames` frames and returns the screenshot INLINE. `holdInputs` holds controller state; `screenshotPath` writes the PNG to disk instead; `projectName` titles the playtest window.\n" +
|
|
592
|
+
"• output:'project' — build a project DIRECTORY (`path`) without re-passing the file manifest each call. Entry point is `main.c` (C/SGDK Genesis, GBA, cc65/SDCC C) OR `main.s`/`main.asm` (asm). Every `.c`/`.s`/`.asm` in the dir is a translation unit (linked together), every `.h`/`.inc` an include, and `.bin/.chr/.pcm/.brr/.vgm/...` become binaryIncludes (for `.incbin`). Iterate an on-disk project by re-calling with just `{path, platform}`.",
|
|
593
|
+
{
|
|
594
|
+
output: z.enum(["rom", "romWithDebug", "run", "project"])
|
|
595
|
+
.describe("rom=produce a ROM (default); romWithDebug=ROM + .dbg/.map debug files; run=build+load+run+screenshot; project=build a project directory."),
|
|
596
|
+
platform: z.string().describe("Target platform id (e.g. 'nes', 'genesis')."),
|
|
597
|
+
language: z.string().optional().describe("Language override ('c'/'asm'/'basic'). USUALLY OMIT — inferred from source extension/content; only the ambiguous case falls to the platform default. Ignored by output:'romWithDebug' (C only)."),
|
|
598
|
+
// source inputs (rom/romWithDebug/run)
|
|
599
|
+
source: z.string().optional().describe("Single source file contents. PREFER `sourcePath` for on-disk files."),
|
|
600
|
+
sourcePath: z.string().optional().describe("Absolute path to a single source file (server reads it). Mutually exclusive with `source`. NOT read by output:'romWithDebug' — use `source` there."),
|
|
601
|
+
sources: sourcesShape.optional().describe("Multi-file project: filename → contents ({'main.s':'...', 'aliens.s':'...'})."),
|
|
602
|
+
sourcesPaths: sourcesShape.optional().describe("Path-based `sources`: virtual filename → absolute path. Mutually exclusive with `sources`. NOT read by output:'romWithDebug'."),
|
|
603
|
+
includes: sourcesShape.optional().describe("Virtual filename → contents for `.include`d files (NOT separate translation units)."),
|
|
604
|
+
includePaths: sourcesShape.optional().describe("Path-based `includes` (text files; server reads them). NOT read by output:'romWithDebug'."),
|
|
605
|
+
binaryIncludes: sourcesShape.optional().describe("Like `includes` but BINARY blobs (CHR ROM, music) as base64, for `.incbin`. PREFER `binaryIncludePaths`. NOT read by output:'romWithDebug'."),
|
|
606
|
+
binaryIncludePaths: sourcesShape.optional().describe("Path-based `binaryIncludes`: virtual filename → absolute path (server reads the bytes). NOT read by output:'romWithDebug'."),
|
|
607
|
+
crt0: z.string().optional().describe("SDCC platforms — custom crt0.s source (assembled via sdasgb/sdasz80, linked instead of the stock crt0). SMS/GG auto-inject the bundled crt0 when omitted; GB/GBC pass gb_crt0 + codeLoc:0x150. (romWithDebug reads `crt0` but NOT `crt0Path`.)"),
|
|
608
|
+
crt0Path: z.string().optional().describe("Path-based `crt0`. NOT read by output:'romWithDebug' — pass `crt0` there."),
|
|
609
|
+
codeLoc: z.coerce.number().int().optional().describe("SDCC — _CODE load address (default $0000; GB/GBC bundled crt0 wants 0x150)."),
|
|
610
|
+
dataLoc: z.coerce.number().int().optional().describe("SDCC — _DATA (WRAM) load address (default $C000 on Z80). NOT read by output:'romWithDebug'."),
|
|
611
|
+
options: z.array(z.string()).optional().describe("output:'rom' — extra toolchain CLI options."),
|
|
612
|
+
linkerConfig: z.string().optional().describe("ld65 linker config (cc65). NES preset 'chr-ram-runtime' (RECOMMENDED — full crt0 + iNES header + NMI w/ OAM DMA + `_shadow_oam` at $0200) or 'chr-ram' (bare nmi:rti stub), or full .cfg contents. Preset NAMES only resolve on output:'rom'/'run'; output:'romWithDebug' takes raw .cfg contents only."),
|
|
613
|
+
runtime: z.string().optional().describe("GBA — runtime: 'libtonc' (default), 'libgba', or 'none'."),
|
|
614
|
+
maxmod: z.boolean().optional().describe("GBA — link maxmod for music (libmm.a). You still call mmInit/mmStart + hook mmVBlank."),
|
|
615
|
+
rebuildSdk: z.boolean().optional().describe("GBA + Genesis — rebuild the bundled SDK (libtonc/libgba/maxmod/SGDK) from vendored source instead of the prebuilt seed (~20-40s). Only if you edited SDK source (else an `sdkEditIgnored` warning fires)."),
|
|
616
|
+
lint: z.enum(["advisory", "strict"]).default("advisory").describe("output:'rom' SDCC — 'advisory' (default, warnings in issues[]) or 'strict' (any lint warning fails the build with stage:'lint' before the compiler runs — the SDCC crash-pattern guard)."),
|
|
617
|
+
includeSymbols: z.boolean().default(false).describe("output:'rom' — return the toolchain's symbol/map text inline (sdld .map / cc65 .sym). False = only symbolsBytes (call symbols/addressToSymbol to look up a PC). Maps can be 30+ KB."),
|
|
618
|
+
// run-only
|
|
619
|
+
frames: z.number().int().min(1).max(100000).default(60).describe("output:'run' — frames to run before the screenshot (default 60)."),
|
|
620
|
+
holdInputs: z.array(holdInputShape).max(2).optional().describe("output:'run' — per-port input state to hold during the run (index 0 = port 0)."),
|
|
621
|
+
screenshotPath: z.string().optional().describe("output:'run' — write the screenshot here and return {screenshotPath} instead of the inline image (for clients that can't show inline images)."),
|
|
622
|
+
projectName: z.string().optional().describe("output:'run' — playtest window title (no effect on the ROM)."),
|
|
623
|
+
// project-only
|
|
624
|
+
path: z.string().optional().describe("output:'project' — absolute path to the project directory."),
|
|
625
|
+
// shared output
|
|
626
|
+
outputPath: z.string().optional().describe("output:'rom'/'romWithDebug'/'project' — absolute path to write the ROM (romWithDebug writes .dbg/.map/.log alongside; REQUIRED for romWithDebug unless inline:true). output:'rom' omitted → temp-file path returned (or inline:true for base64)."),
|
|
627
|
+
inline: z.boolean().default(false).describe("output:'rom'/'romWithDebug' — return binaryBase64 (+ debug text for romWithDebug) in the response instead of writing to disk."),
|
|
628
|
+
},
|
|
629
|
+
safeTool(async (args) => {
|
|
630
|
+
switch (args.output) {
|
|
631
|
+
case "rom": return await buildSourceImpl(args);
|
|
632
|
+
case "run": return await runSourceImpl(args);
|
|
633
|
+
case "project": {
|
|
634
|
+
if (!args.path) throw new Error("build({output:'project'}): `path` (the project directory) is required.");
|
|
635
|
+
return await buildProjectImpl(args);
|
|
636
|
+
}
|
|
637
|
+
case "romWithDebug": return await buildSourceWithDebugCore(args);
|
|
638
|
+
default: throw new Error(`build: unknown output '${args.output}'`);
|
|
639
|
+
}
|
|
640
|
+
}),
|
|
641
|
+
);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* build({output:'project'}) — build a project DIRECTORY (no per-call manifest).
|
|
646
|
+
* Module-scope + exported so it's unit-testable. Discovers main.c (C/SGDK/GBA/
|
|
647
|
+
* cc65 C) or main.s/main.asm (asm) and links every source in the dir. Returns
|
|
648
|
+
* a jsonContent payload (the router calls it via safeTool, which turns a throw —
|
|
649
|
+
* e.g. no entry point — into an {isError:true} result).
|
|
650
|
+
*/
|
|
651
|
+
export async function buildProjectCore({ path: projPath, platform, outputPath }) {
|
|
652
|
+
const entries = await readdir(projPath, { withFileTypes: true });
|
|
653
|
+
const files = entries.filter((e) => e.isFile());
|
|
654
|
+
|
|
655
|
+
// Entry point: a C project uses main.c (SGDK/Genesis, GBA, cc65/SDCC C); an
|
|
656
|
+
// asm project uses main.s / main.asm. Pick whichever exists — so the SAME
|
|
657
|
+
// dir-build works for C/SGDK Genesis projects, not just asm/cc65.
|
|
658
|
+
const hasC = files.some((f) => f.name === "main.c");
|
|
659
|
+
const hasAsm = files.some((f) => f.name === "main.s" || f.name === "main.asm");
|
|
660
|
+
if (!hasC && !hasAsm) {
|
|
661
|
+
throw new Error(
|
|
662
|
+
`no entry point in ${projPath}: expected main.c (C/SGDK/GBA/cc65 project) or main.s / main.asm (asm project). ` +
|
|
663
|
+
`Found: ${files.map((f) => f.name).join(", ") || "(empty)"}.`
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// Every .c/.s/.asm is its own translation unit (linked together — cc65 routes
|
|
668
|
+
// .c→cc65 + .s→ca65; SDCC/SGDK/GBA compile every .c). Every .h/.inc is an
|
|
669
|
+
// include (NOT a TU). Binary assets become binaryIncludes so .incbin survives.
|
|
670
|
+
/** @type {Record<string,string>} */ const sources = {};
|
|
671
|
+
/** @type {Record<string,string>} */ const includes = {};
|
|
672
|
+
/** @type {Record<string,string>} */ const binaryIncludes = {};
|
|
673
|
+
for (const f of files) {
|
|
674
|
+
const n = f.name;
|
|
675
|
+
if (/\.(c|s|asm)$/i.test(n)) sources[n] = await readFile(path.join(projPath, n), "utf-8");
|
|
676
|
+
else if (/\.(h|inc)$/i.test(n)) includes[n] = await readFile(path.join(projPath, n), "utf-8");
|
|
677
|
+
else if (/\.(bin|chr|pcm|brr|vgm|xgm|nsf|raw|pal)$/i.test(n)) {
|
|
678
|
+
binaryIncludes[n] = (await readFile(path.join(projPath, n))).toString("base64");
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Route through resolveLinkerConfig like build({output:'rom'}) so cc65 presets
|
|
683
|
+
// + support sources still apply for a dir-built cc65 project.
|
|
684
|
+
const { cfg: resolvedLinkerConfig, supportSources } = await resolveLinkerConfig(platform, undefined);
|
|
685
|
+
const mergedSources = Object.keys(supportSources).length ? { ...supportSources, ...sources } : sources;
|
|
686
|
+
|
|
687
|
+
// Single-source toolchains (dasm/atari2600, vasm/asm) take `source`, not the
|
|
688
|
+
// multi-TU `sources` map. When the dir has exactly one source file and no
|
|
689
|
+
// preset support sources, pass it as `source` so those targets still build
|
|
690
|
+
// (the original asm-only buildProject behavior).
|
|
691
|
+
const srcNames = Object.keys(sources);
|
|
692
|
+
const singleSource = srcNames.length === 1 && Object.keys(supportSources).length === 0;
|
|
693
|
+
const result = await buildForPlatform({
|
|
694
|
+
platform,
|
|
695
|
+
...(singleSource
|
|
696
|
+
? { source: sources[srcNames[0]], sourceName: srcNames[0] }
|
|
697
|
+
: { sources: mergedSources }),
|
|
698
|
+
includes: Object.keys(includes).length ? includes : undefined,
|
|
699
|
+
binaryIncludes: Object.keys(binaryIncludes).length ? binaryIncludes : undefined,
|
|
700
|
+
linkerConfig: resolvedLinkerConfig,
|
|
701
|
+
});
|
|
702
|
+
if (outputPath && result.binary) {
|
|
703
|
+
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
704
|
+
await writeFile(outputPath, result.binary);
|
|
705
|
+
}
|
|
706
|
+
const logSibling = outputPath && result.binary ? `${outputPath}.build.log` : null;
|
|
707
|
+
return jsonContent({
|
|
708
|
+
ok: result.ok,
|
|
709
|
+
toolchain: result.toolchain,
|
|
710
|
+
exitCode: result.exitCode,
|
|
711
|
+
binaryBytes: result.binary ? result.binary.length : 0,
|
|
712
|
+
outputPath: outputPath && result.binary ? outputPath : null,
|
|
713
|
+
sourcesBuilt: Object.keys(sources),
|
|
714
|
+
...(Object.keys(binaryIncludes).length ? { binaryIncludes: Object.keys(binaryIncludes) } : {}),
|
|
715
|
+
romLayout: describeRomLayout(platform, result.binary),
|
|
716
|
+
...(result.stage ? { stage: result.stage } : {}),
|
|
717
|
+
...(await logField(result.log, false, logSibling, result.ok)),
|
|
718
|
+
issues: result.issues ?? [],
|
|
719
|
+
});
|
|
720
|
+
}
|