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,862 @@
|
|
|
1
|
+
// Toolchain dispatcher: build a project for a given platform using the right
|
|
2
|
+
// bundled assembler/compiler.
|
|
3
|
+
|
|
4
|
+
import { runDasm } from "./dasm/dasm.js";
|
|
5
|
+
import { buildC, buildAsm } from "./cc65/cc65.js";
|
|
6
|
+
import { runAsar } from "./asar/asar.js";
|
|
7
|
+
import { runVasm68k } from "./vasm68k/vasm68k.js";
|
|
8
|
+
import { finalizeGenesisRom } from "./genesis-c/genesis-c.js";
|
|
9
|
+
import { buildGB, runRgbfix } from "./rgbds/rgbds.js";
|
|
10
|
+
import { buildZ80C, SDCC_PORTS } from "./sdcc/sdcc.js";
|
|
11
|
+
import { parseBuildLog } from "./parse-errors.js";
|
|
12
|
+
|
|
13
|
+
/** Map our platform ids to cc65 target ids. */
|
|
14
|
+
const CC65_TARGET = {
|
|
15
|
+
nes: "nes",
|
|
16
|
+
c64: "c64",
|
|
17
|
+
atari7800: "atari7800",
|
|
18
|
+
lynx: "lynx",
|
|
19
|
+
pce: "pce",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* (platform, language) → toolchain dispatch.
|
|
24
|
+
*
|
|
25
|
+
* `language` is optional on buildSource; each platform has a documented
|
|
26
|
+
* default (see PLATFORM_DEFAULT_LANGUAGE). Defaults reflect the best
|
|
27
|
+
* choice for vibe-coding: smallest toolchain footprint, fastest build,
|
|
28
|
+
* highest LLM fluency. Picky users override via `language: "c"` etc.
|
|
29
|
+
*
|
|
30
|
+
* Adding a new language for a platform = add a row here + ship the
|
|
31
|
+
* toolchain wasm. The `available: false` entries declare future
|
|
32
|
+
* intent but don't yet ship a toolchain — listPlatforms surfaces them
|
|
33
|
+
* so the discoverability story is honest.
|
|
34
|
+
*
|
|
35
|
+
* @type {Record<string, Record<string, { toolchain: string, available: boolean, note?: string }>>}
|
|
36
|
+
*/
|
|
37
|
+
const LANGUAGE_TOOLCHAIN = {
|
|
38
|
+
atari2600: {
|
|
39
|
+
asm: { toolchain: "dasm", available: true },
|
|
40
|
+
basic: { toolchain: "batariBasic", available: false, note: "BASIC for 2600 via batariBasic — not bundled. bB's transpiler is written in Perl, which we don't ship as WASM. A port to C or JS would be a multi-day project. For now, write 2600 games in 6507 asm via dasm — the bundled scaffolds (default, paddle, single_screen) show the canonical race-the-beam pattern, and an LLM agent writes 2600 asm fluently." },
|
|
41
|
+
},
|
|
42
|
+
nes: {
|
|
43
|
+
asm: { toolchain: "cc65", available: true },
|
|
44
|
+
c: { toolchain: "cc65", available: true },
|
|
45
|
+
},
|
|
46
|
+
c64: {
|
|
47
|
+
c: { toolchain: "cc65", available: true },
|
|
48
|
+
asm: { toolchain: "cc65", available: true },
|
|
49
|
+
},
|
|
50
|
+
atari7800: {
|
|
51
|
+
c: { toolchain: "cc65", available: true },
|
|
52
|
+
asm: { toolchain: "cc65", available: true },
|
|
53
|
+
},
|
|
54
|
+
lynx: {
|
|
55
|
+
c: { toolchain: "cc65", available: true },
|
|
56
|
+
asm: { toolchain: "cc65", available: true },
|
|
57
|
+
},
|
|
58
|
+
gb: {
|
|
59
|
+
asm: { toolchain: "rgbds", available: true },
|
|
60
|
+
c: { toolchain: "sdcc", available: true, note: "C for GB via SDCC's sm83 port (GBDK-style)" },
|
|
61
|
+
},
|
|
62
|
+
gbc: {
|
|
63
|
+
asm: { toolchain: "rgbds", available: true },
|
|
64
|
+
c: { toolchain: "sdcc", available: true, note: "C for GBC via SDCC's sm83 port (GBDK-style)" },
|
|
65
|
+
},
|
|
66
|
+
snes: {
|
|
67
|
+
asm: { toolchain: "asar", available: true },
|
|
68
|
+
c: { toolchain: "tcc816+wladx", available: true, note: "C for SNES via tcc-65816 + wla-65816 + wlalink. The PVSnesLib runtime IS bundled (built from source) and auto-linked — #include <snes.h> gives you consoleDrawText, setMode, oamSet, WaitForVBlank, etc. out of the box. `createGame`/`createProject` scaffold a complete PVSnesLib C project. Pass options.pvsneslib:false for the bare-main minimum-viable path." },
|
|
69
|
+
},
|
|
70
|
+
genesis: {
|
|
71
|
+
asm: { toolchain: "vasm68k", available: true },
|
|
72
|
+
c: { toolchain: "m68k-elf-gcc", available: true, note: "C for Genesis via gcc 14.2.0 + binutils + newlib, all compiled to WASM. The SGDK runtime IS bundled (built from source) and auto-linked — sprite engine, VDP, controller, PSG/Z80 sound, resource helpers all work; #include <genesis.h>. `createGame`/`createProject` scaffold a complete SGDK C project (the recommended path). Pass options.sgdk:false for the bare-gcc minimum-viable path." },
|
|
73
|
+
},
|
|
74
|
+
gba: {
|
|
75
|
+
c: { toolchain: "arm-none-eabi-gcc", available: true, note: "C for GBA via gcc 14.2.0 + binutils + newlib + libtonc 1.4.5 (default) OR libgba 0.5.4 (opt-in via runtime:\"libgba\"), all compiled to WASM (R24 + R28). #include <tonc.h> + tte_write/tte_printf works out of the box — that's the canonical Tonc-tutorial API every published GBA C resource uses. Caveat: tte_iohook (libtonc) and console.c (libgba) — the libsysbase-backed iprintf bridges — are NOT bundled. Use tte_printf directly, which is what the Tonc tutorial actually does." },
|
|
76
|
+
},
|
|
77
|
+
sms: { c: { toolchain: "sdcc", available: true }, asm: { toolchain: "sdcc", available: true } },
|
|
78
|
+
gg: { c: { toolchain: "sdcc", available: true }, asm: { toolchain: "sdcc", available: true } },
|
|
79
|
+
spc700: { asm: { toolchain: "asar", available: true } },
|
|
80
|
+
pce: {
|
|
81
|
+
c: { toolchain: "cc65", available: true, note: "C for PC Engine via cc65's huc6280 target — crt0 + pce.lib (VDC/VCE/PSG/joypad helpers) auto-linked. #include <pce.h>." },
|
|
82
|
+
asm: { toolchain: "cc65", available: true },
|
|
83
|
+
},
|
|
84
|
+
msx: {
|
|
85
|
+
c: { toolchain: "sdcc", available: true, note: "C for MSX via SDCC's z80 port. Cartridge ROM with the 'AB' header + INIT pointer at $4000; boots on C-BIOS (open MSX BIOS). MSX2 by default (runs MSX1 carts too)." },
|
|
86
|
+
asm: { toolchain: "sdcc", available: true },
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Default language per platform. The choice reflects what's fastest /
|
|
92
|
+
* smallest / best-matched to LLM fluency. Every platform that has a bundled
|
|
93
|
+
* C compiler + runtime defaults to C — that's the canonical, productive path
|
|
94
|
+
* and what `createGame`/`createProject` scaffold (cc65 for NES/C64/Atari7800/
|
|
95
|
+
* Lynx, SDCC for GB/GBC/SMS/GG, gcc+SGDK for Genesis, tcc+PVSnesLib for SNES,
|
|
96
|
+
* gcc+libtonc for GBA). Platforms whose only bundled toolchain is an assembler
|
|
97
|
+
* default to asm (Atari 2600 → dasm; SNES/Genesis keep an asm option too, but
|
|
98
|
+
* C is now the default since the SDKs are bundled from source).
|
|
99
|
+
*
|
|
100
|
+
* @type {Record<string, string>}
|
|
101
|
+
*/
|
|
102
|
+
const PLATFORM_DEFAULT_LANGUAGE = {
|
|
103
|
+
atari2600: "asm",
|
|
104
|
+
nes: "c",
|
|
105
|
+
c64: "c",
|
|
106
|
+
atari7800: "c",
|
|
107
|
+
lynx: "c",
|
|
108
|
+
gb: "c",
|
|
109
|
+
gbc: "c",
|
|
110
|
+
snes: "c",
|
|
111
|
+
genesis: "c",
|
|
112
|
+
gba: "c",
|
|
113
|
+
sms: "c",
|
|
114
|
+
gg: "c",
|
|
115
|
+
spc700: "asm",
|
|
116
|
+
pce: "c",
|
|
117
|
+
msx: "c",
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Public API for the platforms tool to discover the language matrix.
|
|
122
|
+
* Returns `{defaultLanguage, languages: [{language, toolchain, available, note?}]}`.
|
|
123
|
+
* Returns null for platforms with no language entries (shouldn't
|
|
124
|
+
* happen for any supported platform — fallback safety).
|
|
125
|
+
*/
|
|
126
|
+
export function getLanguageOptions(platform) {
|
|
127
|
+
const langs = LANGUAGE_TOOLCHAIN[platform];
|
|
128
|
+
if (!langs) return null;
|
|
129
|
+
return {
|
|
130
|
+
defaultLanguage: PLATFORM_DEFAULT_LANGUAGE[platform] ?? Object.keys(langs)[0],
|
|
131
|
+
languages: Object.entries(langs).map(([language, info]) => ({
|
|
132
|
+
language,
|
|
133
|
+
...info,
|
|
134
|
+
})),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Per-platform ROM size for Z80 (SDCC) targets. Cores expect the binary
|
|
140
|
+
* padded to a specific size; agents shouldn't have to know this.
|
|
141
|
+
* @type {Record<string, number>}
|
|
142
|
+
*/
|
|
143
|
+
const SDCC_ROM_SIZE = {
|
|
144
|
+
sms: 32 * 1024, // Master System min cartridge size
|
|
145
|
+
gg: 32 * 1024, // Game Gear same
|
|
146
|
+
gb: 32 * 1024, // Game Boy 32 KB ROM (no MBC needed)
|
|
147
|
+
gbc: 32 * 1024,
|
|
148
|
+
msx: 32 * 1024, // 32KB MSX cartridge ($4000-$BFFF, 2 pages)
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// MSX cartridge ROMs map into the $4000-$BFFF region and begin with a 16-byte
|
|
152
|
+
// ROM header at $4000: "AB" magic + an INIT routine pointer (the BIOS calls it
|
|
153
|
+
// at boot). The code therefore links at $4010 (right after the header). We
|
|
154
|
+
// build the SDCC image based at $4000 then strip the linker's $0000-$3FFF
|
|
155
|
+
// padding so the .rom starts at the header.
|
|
156
|
+
const MSX_CODE_LOC = 0x4010;
|
|
157
|
+
const MSX_ROM_BASE = 0x4000;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @typedef {Object} BuildArgs
|
|
161
|
+
* @property {string} platform target platform id
|
|
162
|
+
* @property {string} [language] optional language override (e.g. "c", "asm", "basic"). Each platform has a documented default; only pass this when you specifically want a non-default language. Use listPlatforms() to see the matrix.
|
|
163
|
+
* @property {string} [source] main source contents (single-file shortcut)
|
|
164
|
+
* @property {Record<string, string>} [sources] multi-file project: {name: contents}.
|
|
165
|
+
* For cc65, each entry becomes its own translation unit (ca65 .o or cc65→ca65→.o).
|
|
166
|
+
* Files with .s/.asm extensions go straight to ca65; others are treated as C.
|
|
167
|
+
* @property {Record<string, string>} [includes] virtual filename → contents (for `.include`d files)
|
|
168
|
+
* @property {string[]} [options] extra toolchain flags
|
|
169
|
+
* @property {string} [linkerConfig] custom ld65 .cfg (cc65-targets only)
|
|
170
|
+
*/
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @typedef {Object} BuildResult
|
|
174
|
+
* @property {boolean} ok
|
|
175
|
+
* @property {Uint8Array | null} binary the assembled ROM (or null on failure)
|
|
176
|
+
* @property {string} listing optional listing file content
|
|
177
|
+
* @property {string} symbols optional symbol table
|
|
178
|
+
* @property {string} log compiler log (stdout+stderr merged)
|
|
179
|
+
* @property {number} exitCode
|
|
180
|
+
* @property {string} toolchain
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Fill the SNES internal checksum ($FFDE) + complement ($FFDC). The SNES
|
|
185
|
+
* has no boot-ROM gate, so this isn't needed to run on bare hardware — but
|
|
186
|
+
* emulators and flashcarts read it (some flashcarts use it to tell LoROM
|
|
187
|
+
* from HiROM), so a zeroed checksum can cause RetroArch / flashcart load
|
|
188
|
+
* failures or mapper mis-detection. Mirrors pvsneslib's snestools algorithm.
|
|
189
|
+
*
|
|
190
|
+
* Detect LoROM vs HiROM from the map-mode byte at header+$15 (bit0 set =
|
|
191
|
+
* HiROM). Header is at file $7FC0 (LoROM) or $FFC0 (HiROM); checksum fields
|
|
192
|
+
* are at header+$1C (complement) and header+$1E (checksum). Sum every byte
|
|
193
|
+
* but treat the 4 checksum bytes as $FF,$FF,$00,$00 (= the +$1FE constant),
|
|
194
|
+
* which is their value once complement=$FFFF and checksum=$0000. Assumes a
|
|
195
|
+
* power-of-2 ROM (asar/pvsneslib pad to 32KB+); skips finalize otherwise.
|
|
196
|
+
*
|
|
197
|
+
* @param {Uint8Array} bin
|
|
198
|
+
* @returns {{ bin: Uint8Array, note: string }}
|
|
199
|
+
*/
|
|
200
|
+
function finalizeSnesRom(bin) {
|
|
201
|
+
// Need at least a 32KB LoROM to have a header.
|
|
202
|
+
if (!bin || bin.length < 0x8000) return { bin, note: "too small for a SNES header — checksum skipped" };
|
|
203
|
+
// Pad to the next power of two (min 32KB). asar already pads; pvsneslib's
|
|
204
|
+
// C output does NOT (e.g. 35136 bytes), and flashcarts/emulators expect a
|
|
205
|
+
// power-of-2 image — and the simple sum-all-bytes checksum below is only
|
|
206
|
+
// correct for power-of-2 sizes. So pad first, then checksum.
|
|
207
|
+
let padNote = "";
|
|
208
|
+
if ((bin.length & (bin.length - 1)) !== 0) {
|
|
209
|
+
let target = 0x8000;
|
|
210
|
+
while (target < bin.length) target <<= 1;
|
|
211
|
+
const padded = new Uint8Array(target); // zero-filled
|
|
212
|
+
padded.set(bin);
|
|
213
|
+
padNote = ` (padded ${bin.length}→${target})`;
|
|
214
|
+
bin = padded;
|
|
215
|
+
}
|
|
216
|
+
const loHdr = 0x7FC0, hiHdr = 0xFFC0;
|
|
217
|
+
// Map-mode byte sits at header+$15. Prefer LoROM detection: read both
|
|
218
|
+
// candidates; bit0 set = HiROM. Default to LoROM (asar/pvsneslib default).
|
|
219
|
+
let hdr = loHdr;
|
|
220
|
+
const loMode = bin[loHdr + 0x15];
|
|
221
|
+
const hiMode = bin.length > hiHdr + 0x15 ? bin[hiHdr + 0x15] : undefined;
|
|
222
|
+
// If the LoROM map byte doesn't look like a valid mode (0x20/0x30) but the
|
|
223
|
+
// HiROM one does (0x21/0x31), treat as HiROM.
|
|
224
|
+
const looksLo = (loMode & 0x0F) === 0x00 || loMode === 0x20 || loMode === 0x30;
|
|
225
|
+
if (hiMode !== undefined && ((hiMode & 0x01) === 1) && !((loMode & 0x01) === 0 && looksLo)) {
|
|
226
|
+
hdr = hiHdr;
|
|
227
|
+
} else if ((loMode & 0x01) === 1) {
|
|
228
|
+
hdr = hiHdr;
|
|
229
|
+
}
|
|
230
|
+
const compOff = hdr + 0x1C; // $FFDC / $7FDC
|
|
231
|
+
const sumOff = hdr + 0x1E; // $FFDE / $7FDE
|
|
232
|
+
// Sum all bytes, counting the 4 checksum bytes as their finalized values
|
|
233
|
+
// ($FF,$FF,$00,$00) regardless of what's there now.
|
|
234
|
+
let sum = 0;
|
|
235
|
+
for (let i = 0; i < bin.length; i++) {
|
|
236
|
+
if (i >= compOff && i < compOff + 4) continue; // skip the 4 cksum bytes
|
|
237
|
+
sum = (sum + bin[i]) & 0xFFFF;
|
|
238
|
+
}
|
|
239
|
+
sum = (sum + 0x1FE) & 0xFFFF; // = 0xFF+0xFF+0x00+0x00 for the skipped bytes
|
|
240
|
+
const comp = sum ^ 0xFFFF;
|
|
241
|
+
bin[compOff] = comp & 0xFF;
|
|
242
|
+
bin[compOff + 1] = (comp >> 8) & 0xFF;
|
|
243
|
+
bin[sumOff] = sum & 0xFF;
|
|
244
|
+
bin[sumOff + 1] = (sum >> 8) & 0xFF;
|
|
245
|
+
return { bin, note: `SNES checksum ${sum.toString(16).toUpperCase().padStart(4,"0")} written (${hdr === hiHdr ? "HiROM" : "LoROM"} header @ $${hdr.toString(16).toUpperCase()})${padNote}` };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* @param {BuildArgs} args
|
|
250
|
+
* @returns {Promise<BuildResult>}
|
|
251
|
+
*/
|
|
252
|
+
/**
|
|
253
|
+
* Decide which language a build should use when the caller didn't pass one.
|
|
254
|
+
* Explicit `language` always wins. Otherwise we infer ONLY from a POSITIVE
|
|
255
|
+
* signal — a C filename (`sources` key ending .c/.h/.cpp) or unambiguous C
|
|
256
|
+
* content (`#include`, a `/* */` block comment, `int/void main(`) ⇒ "c"; an
|
|
257
|
+
* asm filename or a clear asm tell (leading `;` comment, `.org`/`dc.x`/`equ`/
|
|
258
|
+
* `arch` directives, `$`-hex with no C tokens) ⇒ "asm". When nothing points
|
|
259
|
+
* either way we return `undefined` and leave the historical dispatch alone
|
|
260
|
+
* (which falls to the platform's first/asm toolchain) — so this is a strict
|
|
261
|
+
* IMPROVEMENT, never a behavior change for inputs that already worked.
|
|
262
|
+
*
|
|
263
|
+
* This fixes the genesis foot-gun: `runSource({platform:"genesis", source:
|
|
264
|
+
* cCode})` with no `language` used to assemble C as 68k via vasm68k; the C
|
|
265
|
+
* content tell now routes it to m68k-elf-gcc + SGDK (the advertised default).
|
|
266
|
+
* Only relevant for platforms with BOTH a C and an asm toolchain producing
|
|
267
|
+
* different binaries (genesis, gba, gb/gbc, snes); cc65/sdcc platforms route
|
|
268
|
+
* by extension further down regardless.
|
|
269
|
+
*
|
|
270
|
+
* @param {{platform:string, language?:string, source?:string, sources?:Record<string,string>}} args
|
|
271
|
+
* @returns {string | undefined} the resolved language, or undefined to leave
|
|
272
|
+
* the existing dispatch untouched (no positive signal / no language matrix)
|
|
273
|
+
*/
|
|
274
|
+
function resolveEffectiveLanguage(args) {
|
|
275
|
+
if (args.language) return args.language;
|
|
276
|
+
const langs = LANGUAGE_TOOLCHAIN[args.platform];
|
|
277
|
+
if (!langs) return undefined;
|
|
278
|
+
|
|
279
|
+
// 1) Filenames are the strongest signal. `sourceName` (single-file, threaded
|
|
280
|
+
// from sourcePath's basename or the synthetic name) and the `sources` keys.
|
|
281
|
+
const names = [
|
|
282
|
+
...(args.sourceName ? [args.sourceName] : []),
|
|
283
|
+
...(args.sources ? Object.keys(args.sources) : []),
|
|
284
|
+
];
|
|
285
|
+
if (names.some((n) => /\.(c|h|cpp|cc|cxx)$/i.test(n))) return langs.c?.available ? "c" : undefined;
|
|
286
|
+
if (names.length && names.every((n) => /\.(s|asm)$/i.test(n))) return langs.asm?.available ? "asm" : undefined;
|
|
287
|
+
|
|
288
|
+
// 2) Single-source content sniff — a LAST resort when no filename is known.
|
|
289
|
+
// Require an unambiguous C tell that can't appear in an asm `;` comment.
|
|
290
|
+
// (We deliberately do NOT trust a `/* */` block — asm doc-comments embed
|
|
291
|
+
// them as prose, e.g. "buildSource({ source: /* this file */ })".) A C
|
|
292
|
+
// preprocessor directive must be the first non-space on its line, which a
|
|
293
|
+
// `;`-commented asm line never satisfies.
|
|
294
|
+
const body = args.source || "";
|
|
295
|
+
if (!body) return undefined;
|
|
296
|
+
const cTell = /^[ \t]*#[ \t]*(include|define|ifdef|ifndef|pragma)\b/m.test(body) ||
|
|
297
|
+
/^[ \t]*(?:int|void)\s+main\s*\(/m.test(body);
|
|
298
|
+
if (cTell && langs.c?.available) return "c";
|
|
299
|
+
// No clear signal → leave the historical default alone (asm-first dispatch).
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Heuristic "is this C source?" for error messaging only (not dispatch). Looser
|
|
305
|
+
* than the dispatch sniff on purpose: here we WANT to catch a C file that ended
|
|
306
|
+
* up at an assembler so we can tell the agent to pass language:"c". Used to
|
|
307
|
+
* annotate a failed vasm68k/asm build with the real fix.
|
|
308
|
+
* @param {string} [src]
|
|
309
|
+
*/
|
|
310
|
+
function looksLikeCSource(src) {
|
|
311
|
+
if (!src) return false;
|
|
312
|
+
return /^[ \t]*#[ \t]*(include|define|ifdef|ifndef|pragma)\b/m.test(src) ||
|
|
313
|
+
/^[ \t]*(?:int|void|char|short|long|unsigned|static|const)\b.*\b\w+\s*\(/m.test(src) ||
|
|
314
|
+
/\b(?:int|void)\s+main\s*\(/.test(src) ||
|
|
315
|
+
(/\/\*[\s\S]*?\*\//.test(src) && /[;{}]\s*$/m.test(src) && !/^\s*;/m.test(src));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export async function buildForPlatform(args) {
|
|
319
|
+
// Resolve an omitted language from source filenames/content when there's a
|
|
320
|
+
// clear signal. Without this, genesis/gba/etc. silently fell to their FIRST
|
|
321
|
+
// (asm) toolchain instead of `defaultLanguage` — so a bare
|
|
322
|
+
// `runSource({platform:"genesis", source:cCode})` assembled C as 68k.
|
|
323
|
+
args = { ...args, language: resolveEffectiveLanguage(args) };
|
|
324
|
+
|
|
325
|
+
// ---- language axis: validate before dispatching to toolchain ----
|
|
326
|
+
// When specified, we check that the (platform, language) pair is supported
|
|
327
|
+
// AND available; reject with a structured error if not. (When still omitted
|
|
328
|
+
// — no positive signal — the per-platform dispatch below applies its own
|
|
329
|
+
// historical default.)
|
|
330
|
+
if (args.language) {
|
|
331
|
+
const langs = LANGUAGE_TOOLCHAIN[args.platform];
|
|
332
|
+
const entry = langs?.[args.language];
|
|
333
|
+
if (!entry) {
|
|
334
|
+
const available = langs ? Object.keys(langs) : [];
|
|
335
|
+
throw new Error(
|
|
336
|
+
`language '${args.language}' not supported for platform '${args.platform}'. ` +
|
|
337
|
+
`Supported: ${available.join(", ") || "(none)"}. ` +
|
|
338
|
+
`Call listPlatforms() to see the full matrix.`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
if (!entry.available) {
|
|
342
|
+
throw new Error(
|
|
343
|
+
`language '${args.language}' for platform '${args.platform}' is planned but not yet bundled. ` +
|
|
344
|
+
`${entry.note ?? ""} ` +
|
|
345
|
+
`Default for this platform is '${PLATFORM_DEFAULT_LANGUAGE[args.platform]}'; omit the language parameter to use it.`
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
// entry.available === true — continue with existing dispatch.
|
|
349
|
+
// The dispatch is keyed on platform alone today; future expansion
|
|
350
|
+
// would route within a platform by language. For now the asserted
|
|
351
|
+
// language matches what the platform's single toolchain produces,
|
|
352
|
+
// so we proceed unchanged.
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
if (args.platform === "atari2600") {
|
|
356
|
+
const r = await runDasm({
|
|
357
|
+
source: args.source,
|
|
358
|
+
includes: args.includes,
|
|
359
|
+
options: args.options,
|
|
360
|
+
outputFormat: "f3",
|
|
361
|
+
});
|
|
362
|
+
return {
|
|
363
|
+
ok: r.exitCode === 0 && r.binary !== null,
|
|
364
|
+
binary: r.binary,
|
|
365
|
+
listing: r.listing,
|
|
366
|
+
symbols: r.symbols,
|
|
367
|
+
log: r.log,
|
|
368
|
+
issues: parseBuildLog(r.log),
|
|
369
|
+
exitCode: r.exitCode,
|
|
370
|
+
toolchain: "dasm",
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const cc65Target = CC65_TARGET[args.platform];
|
|
375
|
+
if (cc65Target) {
|
|
376
|
+
// For multi-file projects, route by extension. If even one source has a
|
|
377
|
+
// C-looking name (.c / .h) we use buildC (which can mix .c and .s files);
|
|
378
|
+
// otherwise everything goes through buildAsm.
|
|
379
|
+
/** @type {Record<string, string>} */
|
|
380
|
+
let sources = args.sources;
|
|
381
|
+
if (!sources) {
|
|
382
|
+
// single-source: route by heuristic on the contents
|
|
383
|
+
const looksLikeAsm = /^\s*\.(segment|proc|byte|word|repeat|res|setcpu|export|import|zeropage|code|macro|include)\b/m.test(args.source);
|
|
384
|
+
const looksLikeC = !looksLikeAsm && /\b(int|void|return|#include|main\s*\()/.test(args.source);
|
|
385
|
+
sources = { [looksLikeC ? "main.c" : "main.s"]: args.source };
|
|
386
|
+
}
|
|
387
|
+
const anyC = Object.keys(sources).some((n) => /\.(c|h)$/i.test(n));
|
|
388
|
+
|
|
389
|
+
// Resolve preset linkerConfig (e.g. "chr-ram") into the actual .cfg
|
|
390
|
+
// contents + any companion support sources (custom crt0, etc.).
|
|
391
|
+
// Caller passes either a preset name or the .cfg contents directly;
|
|
392
|
+
// the build pipeline does NOT auto-select presets based on source
|
|
393
|
+
// contents — every byte that compiles must be visible to the caller.
|
|
394
|
+
const { resolveLinkerConfig } = await import("./cc65/preset-resolver.js");
|
|
395
|
+
const { cfg, supportSources } = await resolveLinkerConfig(args.platform, args.linkerConfig);
|
|
396
|
+
|
|
397
|
+
// Splice in any preset support sources (crt0, etc.). User sources win
|
|
398
|
+
// if there's a name collision, but the preset uses `_preset_*` so it
|
|
399
|
+
// wouldn't normally collide.
|
|
400
|
+
sources = { ...supportSources, ...sources };
|
|
401
|
+
|
|
402
|
+
const builder = anyC ? buildC : buildAsm;
|
|
403
|
+
const r = await builder({
|
|
404
|
+
sources,
|
|
405
|
+
target: cc65Target,
|
|
406
|
+
[anyC ? "headers" : "includes"]: args.includes,
|
|
407
|
+
binaryIncludes: args.binaryIncludes,
|
|
408
|
+
linkerConfig: cfg,
|
|
409
|
+
});
|
|
410
|
+
return {
|
|
411
|
+
ok: r.exitCode === 0 && r.binary !== null,
|
|
412
|
+
binary: r.binary,
|
|
413
|
+
listing: "",
|
|
414
|
+
symbols: "",
|
|
415
|
+
log: r.log,
|
|
416
|
+
issues: parseBuildLog(r.log),
|
|
417
|
+
exitCode: r.exitCode,
|
|
418
|
+
toolchain: anyC ? "cc65" : "ca65+ld65",
|
|
419
|
+
...(r.ramUsage ? { ramUsage: r.ramUsage } : {}),
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (args.platform === "gb" || args.platform === "gbc") {
|
|
424
|
+
// Default is C (sdcc sm83 port) — matches how LLMs naturally think
|
|
425
|
+
// about game logic, same default we use on NES/SMS. Pass
|
|
426
|
+
// `language:"asm"` to route through RGBDS for hand-tuned binaries.
|
|
427
|
+
// C-mode requires the sm83 SDCC port libs (share/sdcc/lib/sm83/*)
|
|
428
|
+
// — built by scripts/build-sdcc.sh.
|
|
429
|
+
if (args.language === "asm") {
|
|
430
|
+
const r = await buildGB({
|
|
431
|
+
source: args.source,
|
|
432
|
+
includes: args.includes,
|
|
433
|
+
});
|
|
434
|
+
return {
|
|
435
|
+
ok: r.exitCode === 0 && r.binary !== null,
|
|
436
|
+
binary: r.binary,
|
|
437
|
+
listing: "",
|
|
438
|
+
symbols: "",
|
|
439
|
+
log: r.log,
|
|
440
|
+
issues: parseBuildLog(r.log),
|
|
441
|
+
exitCode: r.exitCode,
|
|
442
|
+
toolchain: "rgbds",
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
// language === "c" or undefined → fall through to the sdcc dispatch
|
|
446
|
+
// below (SDCC_PORTS["gb"] = sm83 port).
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (args.platform === "gba") {
|
|
450
|
+
// R24 + R28: language:"c" routes through the arm-none-eabi gcc +
|
|
451
|
+
// binutils WASM toolchain (cc1-arm → as → ld → objcopy). Three
|
|
452
|
+
// runtime modes:
|
|
453
|
+
// - "libtonc" (default) — Tonc tutorial-aligned. `#include <tonc.h>`,
|
|
454
|
+
// TTE for text, tonccpy/toncset, OBJ_ATTR sprite API.
|
|
455
|
+
// - "libgba" — devkitPro's official SDK. `#include <gba.h>`.
|
|
456
|
+
// - "none" — bare gcc + newlib only.
|
|
457
|
+
// Legacy `libgba: true|false` flag still accepted for R24 callers.
|
|
458
|
+
// language defaults to "c" since no asm path is wired yet — saves
|
|
459
|
+
// every caller from having to spell it out.
|
|
460
|
+
if (args.language === "c" || args.language == null) {
|
|
461
|
+
const { buildGbaC } = await import("./gba-c/gba-c.js");
|
|
462
|
+
const r = await buildGbaC({
|
|
463
|
+
source: args.source,
|
|
464
|
+
sources: args.sources,
|
|
465
|
+
headers: args.includes,
|
|
466
|
+
binaryIncludes: args.binaryIncludes, // R34 — soundbank.bin et al.
|
|
467
|
+
runtime: args.runtime, // explicit wins
|
|
468
|
+
libgba: args.libgba, // legacy R24 flag (undef passes through)
|
|
469
|
+
maxmod: args.maxmod, // R33 — opt-in maxmod music link
|
|
470
|
+
rebuildSdk: args.rebuildSdk, // compile SDK from source vs seed
|
|
471
|
+
});
|
|
472
|
+
return {
|
|
473
|
+
ok: r.ok,
|
|
474
|
+
binary: r.binary,
|
|
475
|
+
listing: "",
|
|
476
|
+
// GNU ld map (name→address) so symbols({op:'resolve'/...}) works on GBA
|
|
477
|
+
// too — same as Genesis/m68k. buildGbaC returns it from runArmLd.
|
|
478
|
+
symbols: r.symbols ?? "",
|
|
479
|
+
log: r.log,
|
|
480
|
+
issues: parseBuildLog(r.log),
|
|
481
|
+
exitCode: r.exitCode,
|
|
482
|
+
toolchain: "arm-none-eabi-gcc",
|
|
483
|
+
stage: r.stage,
|
|
484
|
+
...(r.crash ? { crash: r.crash } : {}),
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
// GBA without language:"c" — no asm fallback yet; surface the error
|
|
488
|
+
throw new Error("gba: only language:\"c\" supported today; asm path not yet wired");
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if (args.platform === "genesis") {
|
|
492
|
+
// R20: language:"c" routes through the m68k-elf gcc + binutils WASM
|
|
493
|
+
// toolchain (cc1 → as → ld → objcopy) with our minimum-viable sega.s
|
|
494
|
+
// crt0 + genesis.ld linker script. Bare `int main(void)` produces a
|
|
495
|
+
// runnable Genesis ROM. SGDK runtime helpers (sprite engine, VDP,
|
|
496
|
+
// sound) follow in stage 3 of R20.
|
|
497
|
+
if (args.language === "c") {
|
|
498
|
+
const { buildGenesisC } = await import("./genesis-c/genesis-c.js");
|
|
499
|
+
const r = await buildGenesisC({
|
|
500
|
+
source: args.source,
|
|
501
|
+
sources: args.sources,
|
|
502
|
+
headers: args.includes,
|
|
503
|
+
// R42: binaryIncludes lets data.s siblings .incbin music/sample
|
|
504
|
+
// blobs (e.g. demo.xgc for XGM2) without going through rescomp.
|
|
505
|
+
binaryIncludes: args.binaryIncludes,
|
|
506
|
+
// Default: link against bundled SGDK runtime. Pass sgdk:false in
|
|
507
|
+
// `options` for the bare-gcc minimum-viable path.
|
|
508
|
+
sgdk: args.sgdk !== false,
|
|
509
|
+
rebuildSdk: args.rebuildSdk, // compile SGDK from source vs seed
|
|
510
|
+
});
|
|
511
|
+
return {
|
|
512
|
+
ok: r.ok,
|
|
513
|
+
// Finalize like SGDK's makefile (pad to 128KB boundary, min 512KB,
|
|
514
|
+
// fix the $18E checksum) so the ROM loads on strict cores
|
|
515
|
+
// (RetroArch Genesis Plus GX / BlastEm) and flashcarts.
|
|
516
|
+
binary: r.ok && r.binary ? finalizeGenesisRom(r.binary) : r.binary,
|
|
517
|
+
listing: "",
|
|
518
|
+
// The m68k-elf-ld map (symbol → final address) when the link produced
|
|
519
|
+
// one — used by buildSourceWithDebug / addressToSymbol for Genesis.
|
|
520
|
+
symbols: r.symbols ?? "",
|
|
521
|
+
log: r.log,
|
|
522
|
+
issues: parseBuildLog(r.log),
|
|
523
|
+
exitCode: r.exitCode,
|
|
524
|
+
toolchain: "m68k-elf-gcc",
|
|
525
|
+
stage: r.stage,
|
|
526
|
+
...(r.crash ? { crash: r.crash } : {}),
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Default (language:"asm" or undefined): vasm68k path.
|
|
531
|
+
// vasm68k is single-source. Accept either `source` (preferred) or
|
|
532
|
+
// `sources` (multi-file shortcut) — when given the latter, pick a
|
|
533
|
+
// canonical entry-point and write the rest into includes so the
|
|
534
|
+
// entry can `incsrc "other.s"` them.
|
|
535
|
+
//
|
|
536
|
+
// Without this resolution, passing `sources` left args.source as
|
|
537
|
+
// undefined, which crashed Emscripten with "Unsupported data type"
|
|
538
|
+
// when MEMFS.writeFile got handed undefined.
|
|
539
|
+
let source = args.source;
|
|
540
|
+
let extraIncludes = {};
|
|
541
|
+
if (!source && args.sources) {
|
|
542
|
+
const entries = Object.entries(args.sources);
|
|
543
|
+
if (entries.length === 0) throw new Error("vasm68k: sources is empty");
|
|
544
|
+
// Pick main.s if present, else first key.
|
|
545
|
+
const mainKey = args.sources["main.s"] != null ? "main.s" : entries[0][0];
|
|
546
|
+
source = args.sources[mainKey];
|
|
547
|
+
// Stage the others as text includes so the agent can `incsrc` them.
|
|
548
|
+
for (const [name, content] of entries) {
|
|
549
|
+
if (name !== mainKey) extraIncludes[name] = content;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
if (!source) {
|
|
553
|
+
throw new Error("vasm68k requires `source` or `sources` with at least one entry");
|
|
554
|
+
}
|
|
555
|
+
const r = await runVasm68k({
|
|
556
|
+
source,
|
|
557
|
+
includes: { ...(args.includes ?? {}), ...extraIncludes },
|
|
558
|
+
binaryIncludes: args.binaryIncludes,
|
|
559
|
+
options: args.options,
|
|
560
|
+
});
|
|
561
|
+
const vasmOk = r.exitCode === 0 && r.binary !== null;
|
|
562
|
+
// If vasm68k FAILED on what is obviously C source, say so — don't let the
|
|
563
|
+
// agent read "missing reset vector / identifier expected" and conclude
|
|
564
|
+
// "Genesis wants hand-written asm." (Belt-and-suspenders: the language
|
|
565
|
+
// resolver above already routes C to gcc; this only fires if someone forced
|
|
566
|
+
// language:"asm" on a C file, or an exotic C file dodged every tell.)
|
|
567
|
+
let log = r.log;
|
|
568
|
+
if (!vasmOk && looksLikeCSource(source)) {
|
|
569
|
+
log = "[romdev] This source looks like C but was assembled as 68000 by vasm68k, " +
|
|
570
|
+
"which is why you're seeing 'identifier expected' / 'missing reset vector'. " +
|
|
571
|
+
"Genesis C builds through m68k-elf-gcc + SGDK — pass language:\"c\" (or give the " +
|
|
572
|
+
"file a .c name). You do NOT need to write 68k assembly.\n\n" + r.log;
|
|
573
|
+
}
|
|
574
|
+
return {
|
|
575
|
+
ok: vasmOk,
|
|
576
|
+
// Same SGDK-style finalize (pad + $18E checksum) for hand-written
|
|
577
|
+
// asm ROMs — they hit the exact same strict-core load failure.
|
|
578
|
+
binary: vasmOk && r.binary ? finalizeGenesisRom(r.binary) : r.binary,
|
|
579
|
+
listing: "",
|
|
580
|
+
symbols: "",
|
|
581
|
+
log,
|
|
582
|
+
issues: parseBuildLog(log),
|
|
583
|
+
exitCode: r.exitCode,
|
|
584
|
+
toolchain: "vasm68k",
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// SPC700: same asar WASM, but produce a flat raw binary (no SNES header,
|
|
589
|
+
// no 256KB ROM padding). Lets agents author standalone SPC programs as
|
|
590
|
+
// separate inputs that get .incbin'd into a SNES main.asm.
|
|
591
|
+
if (args.platform === "spc700") {
|
|
592
|
+
const r = await runAsar({
|
|
593
|
+
source: args.source,
|
|
594
|
+
includes: args.includes,
|
|
595
|
+
binaryIncludes: args.binaryIncludes,
|
|
596
|
+
options: args.options,
|
|
597
|
+
flatBinary: true,
|
|
598
|
+
});
|
|
599
|
+
const ok = r.exitCode === 0 && r.binary !== null && r.binary.length > 0;
|
|
600
|
+
let issues = parseBuildLog(r.log);
|
|
601
|
+
if (!ok && issues.length === 0) {
|
|
602
|
+
issues = [{
|
|
603
|
+
severity: "error",
|
|
604
|
+
stage: "asar",
|
|
605
|
+
message: r.log.trim() ||
|
|
606
|
+
`asar (spc700 mode) failed with exit code ${r.exitCode} and no diagnostic. ` +
|
|
607
|
+
`Make sure your source starts with \`arch spc700\` and an \`org $XXXX\` directive.`,
|
|
608
|
+
}];
|
|
609
|
+
}
|
|
610
|
+
return {
|
|
611
|
+
ok,
|
|
612
|
+
binary: r.binary,
|
|
613
|
+
listing: "",
|
|
614
|
+
symbols: "",
|
|
615
|
+
log: r.log,
|
|
616
|
+
issues,
|
|
617
|
+
exitCode: r.exitCode,
|
|
618
|
+
toolchain: "asar-spc700",
|
|
619
|
+
flatStartOffset: r.flatStartOffset ?? 0,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
if (args.platform === "snes") {
|
|
624
|
+
// R15: language:"c" routes through the tcc-65816 + wla-65816 + wlalink
|
|
625
|
+
// pipeline, with our minimum-viable crt0 + hdr.asm bundled. Bare
|
|
626
|
+
// `int main(void) { ... }` produces a runnable 32 KB LoROM. Anything
|
|
627
|
+
// beyond that (graphics, sound, console helpers) the agent writes in
|
|
628
|
+
// C against direct SNES hardware addresses or in a sibling .asm file.
|
|
629
|
+
if (args.language === "c") {
|
|
630
|
+
const { buildSnesC } = await import("./snes-c/snes-c.js");
|
|
631
|
+
const r = await buildSnesC({
|
|
632
|
+
source: args.source,
|
|
633
|
+
sources: args.sources,
|
|
634
|
+
headers: args.includes,
|
|
635
|
+
binaryIncludes: args.binaryIncludes,
|
|
636
|
+
});
|
|
637
|
+
let snesLog = r.log;
|
|
638
|
+
let snesBin = r.binary;
|
|
639
|
+
if (r.ok && snesBin) {
|
|
640
|
+
const fin = finalizeSnesRom(snesBin);
|
|
641
|
+
snesBin = fin.bin;
|
|
642
|
+
snesLog += "\n--- " + fin.note + " ---";
|
|
643
|
+
}
|
|
644
|
+
return {
|
|
645
|
+
ok: r.ok,
|
|
646
|
+
binary: snesBin,
|
|
647
|
+
listing: "",
|
|
648
|
+
symbols: "",
|
|
649
|
+
log: snesLog,
|
|
650
|
+
issues: parseBuildLog(r.log),
|
|
651
|
+
exitCode: r.exitCode,
|
|
652
|
+
toolchain: "tcc816+wladx",
|
|
653
|
+
stage: r.stage,
|
|
654
|
+
...(r.crash ? { crash: r.crash } : {}),
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
const r = await runAsar({
|
|
658
|
+
source: args.source,
|
|
659
|
+
includes: args.includes,
|
|
660
|
+
binaryIncludes: args.binaryIncludes,
|
|
661
|
+
options: args.options,
|
|
662
|
+
});
|
|
663
|
+
const ok = r.exitCode === 0 && r.binary !== null;
|
|
664
|
+
let issues = parseBuildLog(r.log);
|
|
665
|
+
// If asar failed but we couldn't parse anything useful, synthesize a
|
|
666
|
+
// catch-all issue so the caller never sees `{ok:false, issues:[]}` and
|
|
667
|
+
// has SOMETHING to act on. (asar's WASM build sometimes throws C++
|
|
668
|
+
// exceptions without writing diagnostics; see asar wrapper for detail.)
|
|
669
|
+
if (!ok && issues.length === 0) {
|
|
670
|
+
issues = [{
|
|
671
|
+
severity: "error",
|
|
672
|
+
stage: "asar",
|
|
673
|
+
message: r.log.trim() ||
|
|
674
|
+
`asar failed with exit code ${r.exitCode} but produced no diagnostic output. ` +
|
|
675
|
+
`This usually means a C++ exception (bank border, section overlap, ROM size) ` +
|
|
676
|
+
`escaped silently. Reduce the source size or move data to a different bank, ` +
|
|
677
|
+
`then bisect to isolate the offending directive.`,
|
|
678
|
+
}];
|
|
679
|
+
}
|
|
680
|
+
let asarBin = r.binary;
|
|
681
|
+
let asarLog = r.log;
|
|
682
|
+
if (ok && asarBin) {
|
|
683
|
+
const fin = finalizeSnesRom(asarBin);
|
|
684
|
+
asarBin = fin.bin;
|
|
685
|
+
asarLog += "\n--- " + fin.note + " ---";
|
|
686
|
+
}
|
|
687
|
+
return {
|
|
688
|
+
ok,
|
|
689
|
+
binary: asarBin,
|
|
690
|
+
listing: "",
|
|
691
|
+
symbols: r.symbols ?? "",
|
|
692
|
+
log: asarLog,
|
|
693
|
+
issues,
|
|
694
|
+
exitCode: r.exitCode,
|
|
695
|
+
toolchain: "asar",
|
|
696
|
+
layout: r.layout ?? null,
|
|
697
|
+
includes: r.includes ?? {},
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
// Z80 family (SMS, GG) — sdcc.
|
|
702
|
+
const sdccPort = SDCC_PORTS[args.platform];
|
|
703
|
+
if (sdccPort) {
|
|
704
|
+
const sources = args.sources ?? { "main.c": args.source };
|
|
705
|
+
// GB/GBC: _CODE goes at $0150 — the area $0000-$014F is reserved for
|
|
706
|
+
// the cartridge header + reset vectors which the custom crt0 provides.
|
|
707
|
+
// MSX: _CODE goes at $4010 — a cartridge maps at $4000-$BFFF and the first
|
|
708
|
+
// 16 bytes are the ROM header ("AB" + INIT vector) the crt0 emits.
|
|
709
|
+
const codeLoc = args.codeLoc ?? (args.platform === "msx" ? MSX_CODE_LOC : 0x0000);
|
|
710
|
+
const romSize = SDCC_ROM_SIZE[args.platform] ?? 32 * 1024;
|
|
711
|
+
|
|
712
|
+
// crt0 + headers + sources come straight from the caller. The build
|
|
713
|
+
// pipeline does NOT auto-inject platform runtimes, custom crt0s,
|
|
714
|
+
// or post-link header patches. Every byte that compiles is visible
|
|
715
|
+
// to the caller's repo. Use `createProject({platform, template})`
|
|
716
|
+
// to scaffold a self-contained project with the runtime files
|
|
717
|
+
// copied in, or call `getStarterSnippet` / `getAllStarterSnippets`
|
|
718
|
+
// to fetch individual pieces.
|
|
719
|
+
const crt0 = args.crt0;
|
|
720
|
+
|
|
721
|
+
// Pre-flight lint: scan the C sources for known SDCC C89 violations
|
|
722
|
+
// so agents see actionable warnings before SDCC's misleading parser
|
|
723
|
+
// errors. See src/platforms/gb/lib/c/SDCC_GOTCHAS.md.
|
|
724
|
+
//
|
|
725
|
+
// Pass `port` so message text says the right port — SDCC sm83 on GB/GBC,
|
|
726
|
+
// SDCC z80 on SMS/GG. Pre-r26 it always said
|
|
727
|
+
// "SDCC sm83" regardless of the actual port (a copy-paste bug).
|
|
728
|
+
const { lintSources } = await import("./sdcc/preflight-lint.js");
|
|
729
|
+
const lintIssues = lintSources(sources, { port: sdccPort.marg });
|
|
730
|
+
|
|
731
|
+
const r = await buildZ80C({
|
|
732
|
+
sources,
|
|
733
|
+
port: sdccPort.marg,
|
|
734
|
+
romSize,
|
|
735
|
+
headers: args.includes,
|
|
736
|
+
codeLoc,
|
|
737
|
+
dataLoc: args.dataLoc,
|
|
738
|
+
libraries: args.libraries,
|
|
739
|
+
crt0,
|
|
740
|
+
// MSX cartridges map at $4000 — produce a $4000-based page image so the
|
|
741
|
+
// "AB" header lands at offset 0 (not offset $4000 of a $0000-based image).
|
|
742
|
+
romBase: args.platform === "msx" ? MSX_ROM_BASE : undefined,
|
|
743
|
+
});
|
|
744
|
+
let binary = r.binary;
|
|
745
|
+
// GB/GBC via SDCC: the C path produces a raw .gb with an UNPATCHED
|
|
746
|
+
// header — no Nintendo logo at $0104, no header checksum at $014D. The
|
|
747
|
+
// boot ROM on real Game Boy hardware (and strict emulators) LOCKS UP on
|
|
748
|
+
// that. The asm path runs rgbfix; the C path didn't, so a C-built GB ROM
|
|
749
|
+
// ran fine in our lenient WASM gambatte but white-screened / hung on
|
|
750
|
+
// hardware. Run rgbfix here so buildSource always returns a bootable ROM.
|
|
751
|
+
// (-v = valid logo + header/global checksums; -p 0xFF = pad; -C marks a
|
|
752
|
+
// CGB-only ROM so .gbc builds set the $0143 CGB flag correctly.)
|
|
753
|
+
if (binary && r.exitCode === 0 && (args.platform === "gb" || args.platform === "gbc")) {
|
|
754
|
+
// -v: valid logo + header/global checksums. -p 0xFF: pad. -C: CGB-only
|
|
755
|
+
// ($0143=$C0) for .gbc. CRITICAL: also set the cartridge-type ($0147)
|
|
756
|
+
// and RAM-size ($0149) bytes — without -m/-r, -v leaves them at the
|
|
757
|
+
// linker's garbage pad (e.g. type $3C), and emulators/hardware reject
|
|
758
|
+
// an unknown MBC type with "retro_load_game failed". -m 0x00 = ROM ONLY
|
|
759
|
+
// (no mapper), -r 0x00 = no cart RAM — correct for these 32KB scaffolds.
|
|
760
|
+
const fixOpts = args.platform === "gbc"
|
|
761
|
+
? ["-v", "-p", "0xFF", "-C", "-m", "0x00", "-r", "0x00"]
|
|
762
|
+
: ["-v", "-p", "0xFF", "-m", "0x00", "-r", "0x00"];
|
|
763
|
+
const fix = await runRgbfix({ rom: binary, options: fixOpts });
|
|
764
|
+
if (fix.exitCode === 0 && fix.binary) {
|
|
765
|
+
binary = fix.binary;
|
|
766
|
+
// rgbfix has no "force DMG" flag — without -c/-C it leaves $0143 at
|
|
767
|
+
// whatever the linker padded ($FF here). $FF has bit 7 set, so a
|
|
768
|
+
// DMG (.gb) ROM would wrongly trip CGB mode → BGP/OBP writes ignored
|
|
769
|
+
// → white screen on a CGB-capable emulator. Force $0143 = $00 for
|
|
770
|
+
// .gb. (.gbc already got $C0 from -C.)
|
|
771
|
+
if (args.platform === "gb" && binary.length > 0x143) {
|
|
772
|
+
binary[0x143] = 0x00;
|
|
773
|
+
// $0143 is inside the header-checksum range ($0134..$014C), so
|
|
774
|
+
// recompute that 8-bit checksum at $014D after editing it.
|
|
775
|
+
let x = 0;
|
|
776
|
+
for (let i = 0x134; i <= 0x14C; i++) x = (x - binary[i] - 1) & 0xFF;
|
|
777
|
+
binary[0x14D] = x;
|
|
778
|
+
}
|
|
779
|
+
r.log += "\n--- rgbfix (auto header fix) ---\n" + (fix.log || "(ok)");
|
|
780
|
+
} else {
|
|
781
|
+
r.log += "\n--- rgbfix FAILED (header left unpatched — may not boot on hardware) ---\n" + (fix.log || "");
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
// SMS/GG: if the ROM carries a "TMR SEGA" header at $7FF0, fill its
|
|
785
|
+
// checksum word at $7FFA. The export (US/EU) SMS BIOS verifies it and
|
|
786
|
+
// shows "SOFTWARE ERROR" if it's wrong — our header.s ships a $00,$00
|
|
787
|
+
// placeholder, so a real Master System (and RetroDECK with the SMS BIOS)
|
|
788
|
+
// rejected it. Checksum = sum of bytes $0000..$7FEF (everything before
|
|
789
|
+
// the header), stored little-endian. GG BIOS doesn't check, but writing
|
|
790
|
+
// it is harmless. Only touches ROMs that actually have the header.
|
|
791
|
+
if (binary && r.exitCode === 0 && (args.platform === "sms" || args.platform === "gg") && binary.length >= 0x8000) {
|
|
792
|
+
const hdr = 0x7FF0;
|
|
793
|
+
const hasHeader = String.fromCharCode(...binary.slice(hdr, hdr + 8)) === "TMR SEGA";
|
|
794
|
+
if (!hasHeader) {
|
|
795
|
+
// No header emitted by the crt0 → write a complete TMR SEGA header
|
|
796
|
+
// into the last 16 bytes of bank 0 ($7FF0-$7FFF). Without this the
|
|
797
|
+
// export (US/EU) SMS BIOS shows "SOFTWARE ERROR" and refuses to run.
|
|
798
|
+
// $7FF0-$7FF7 "TMR SEGA"; $7FF8-$7FF9 reserved ($00); $7FFA-$7FFB
|
|
799
|
+
// checksum (filled below); $7FFC-$7FFE product code/version (zeros
|
|
800
|
+
// ok for homebrew); $7FFF region+size = $4C (region 4 = export,
|
|
801
|
+
// size $C = 32KB, the checksum range that covers $0000-$7FEF).
|
|
802
|
+
const TMR = [0x54,0x4D,0x52,0x20,0x53,0x45,0x47,0x41]; // "TMR SEGA"
|
|
803
|
+
for (let i = 0; i < 8; i++) binary[hdr + i] = TMR[i];
|
|
804
|
+
binary[hdr + 8] = 0x00; binary[hdr + 9] = 0x00; // reserved
|
|
805
|
+
binary[hdr + 12] = 0x00; binary[hdr + 13] = 0x00; // product code lo
|
|
806
|
+
binary[hdr + 14] = 0x00; // product/version
|
|
807
|
+
binary[hdr + 15] = 0x4C; // region 4 (export) + size $C (32KB)
|
|
808
|
+
}
|
|
809
|
+
// Checksum = sum of bytes $0000..$7FEF (everything before the header),
|
|
810
|
+
// stored little-endian at $7FFA. Region/size $4C declares the 32KB
|
|
811
|
+
// range, so the BIOS checksums $0000-$7FEF.
|
|
812
|
+
let sum = 0;
|
|
813
|
+
for (let i = 0; i < 0x7FF0; i++) sum = (sum + binary[i]) & 0xFFFF;
|
|
814
|
+
binary[0x7FFA] = sum & 0xFF;
|
|
815
|
+
binary[0x7FFB] = (sum >> 8) & 0xFF;
|
|
816
|
+
r.log += `\n--- SMS header ${hasHeader ? "checksum fixed" : "written + checksummed"} ($7FFA=${sum.toString(16).toUpperCase().padStart(4,"0")}, region/size=$4C) ---`;
|
|
817
|
+
}
|
|
818
|
+
// MSX: the binary built with codeLoc=$4010 is a $4000-based page image.
|
|
819
|
+
// SDCC/sdldz80 emit an ihx that, converted to bin, starts at the lowest
|
|
820
|
+
// used address. Ensure the output is exactly the $4000-$BFFF cartridge image
|
|
821
|
+
// and that the first 16 bytes are a valid ROM header ("AB" + INIT pointer).
|
|
822
|
+
// The crt0 (msx_crt0.s) normally writes the header; if a bare build skipped
|
|
823
|
+
// it, synthesize a minimal one pointing INIT at $4010.
|
|
824
|
+
if (binary && r.exitCode === 0 && args.platform === "msx") {
|
|
825
|
+
if (!(binary[0] === 0x41 && binary[1] === 0x42)) { // not "AB"
|
|
826
|
+
// Synthesize: "AB", INIT=$4010 (LE), STATEMENT/DEVICE/TEXT = 0.
|
|
827
|
+
const hdr = new Uint8Array(16);
|
|
828
|
+
hdr[0] = 0x41; hdr[1] = 0x42; // "AB"
|
|
829
|
+
hdr[2] = MSX_CODE_LOC & 0xFF; // INIT lo
|
|
830
|
+
hdr[3] = (MSX_CODE_LOC >> 8) & 0xFF; // INIT hi
|
|
831
|
+
// bytes 4-15 (STATEMENT/DEVICE/TEXT/reserved) stay zero.
|
|
832
|
+
binary.set(hdr, 0);
|
|
833
|
+
r.log += "\n--- MSX ROM header synthesized (\"AB\" + INIT=$4010) ---";
|
|
834
|
+
} else {
|
|
835
|
+
r.log += "\n--- MSX ROM header present (\"AB\") ---";
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
// Combine lint warnings with parsed build log. Lint comes first so
|
|
839
|
+
// agents see them at the top of the issues array.
|
|
840
|
+
const buildIssues = parseBuildLog(r.log);
|
|
841
|
+
const issues = [...lintIssues, ...buildIssues];
|
|
842
|
+
return {
|
|
843
|
+
ok: r.exitCode === 0 && binary !== null,
|
|
844
|
+
binary,
|
|
845
|
+
listing: "",
|
|
846
|
+
symbols: r.map ?? "",
|
|
847
|
+
log: r.log,
|
|
848
|
+
issues,
|
|
849
|
+
exitCode: r.exitCode,
|
|
850
|
+
toolchain: "sdcc",
|
|
851
|
+
stage: r.stage,
|
|
852
|
+
failedTU: r.failedTU, // which .c/.s file killed the build (if any)
|
|
853
|
+
compiledOK: r.compiledOK, // ordered list of TUs that DID compile
|
|
854
|
+
};
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
throw new Error(
|
|
858
|
+
`no bundled toolchain for platform '${args.platform}'. Supported: atari2600 (dasm), nes/c64/atari7800/lynx (cc65), snes (C via tcc-65816+wla+PVSnesLib, or asm via asar), genesis (C via m68k-gcc+SGDK, or asm via vasm68k), gba (C via arm-gcc+libtonc/libgba), gb/gbc (sdcc sm83 / rgbds), sms/gg (sdcc). Call listPlatforms for the live matrix.`,
|
|
859
|
+
);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
export { runDasm, buildC, buildAsm, runAsar, runVasm68k, buildGB };
|