romdev-mcp 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +726 -0
- package/LICENSE +45 -0
- package/NOTICE +86 -0
- package/README.md +46 -0
- package/examples/README.md +36 -0
- package/examples/art-first-workflow/README.md +205 -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/nes/main.c +143 -0
- package/examples/nes/space-shooter/README.md +68 -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/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 +83 -0
- package/src/cli/smoke.js +283 -0
- package/src/cores/registry.js +95 -0
- package/src/host/LibretroHost.js +502 -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 +422 -0
- package/src/host/dsp-state.js +188 -0
- package/src/host/framebuffer.js +115 -0
- package/src/host/gpgx-state.js +309 -0
- package/src/host/index.js +4 -0
- package/src/host/retroConstants.js +72 -0
- package/src/host/snes9x-state.js +35 -0
- package/src/host/types.js +280 -0
- package/src/mcp/disclosure.js +250 -0
- package/src/mcp/log.js +87 -0
- package/src/mcp/server.js +433 -0
- package/src/mcp/state.js +83 -0
- package/src/mcp/tools/address-to-symbol.js +151 -0
- package/src/mcp/tools/art-loaders.js +740 -0
- package/src/mcp/tools/assets.js +89 -0
- package/src/mcp/tools/audio.js +173 -0
- package/src/mcp/tools/cart-parts.js +649 -0
- package/src/mcp/tools/diff-roms.js +412 -0
- package/src/mcp/tools/disasm.js +980 -0
- package/src/mcp/tools/find-references.js +361 -0
- package/src/mcp/tools/font-map.js +353 -0
- package/src/mcp/tools/frame.js +249 -0
- package/src/mcp/tools/free-space.js +95 -0
- package/src/mcp/tools/index.js +351 -0
- package/src/mcp/tools/input-layout.js +215 -0
- package/src/mcp/tools/input.js +142 -0
- package/src/mcp/tools/lifecycle.js +110 -0
- package/src/mcp/tools/lospec.js +156 -0
- package/src/mcp/tools/memory.js +169 -0
- package/src/mcp/tools/metasprite-tools.js +261 -0
- package/src/mcp/tools/platform-docs.js +102 -0
- package/src/mcp/tools/platform-tools.js +1063 -0
- package/src/mcp/tools/platforms.js +86 -0
- package/src/mcp/tools/playtest.js +280 -0
- package/src/mcp/tools/preview-tile.js +360 -0
- package/src/mcp/tools/project.js +1885 -0
- package/src/mcp/tools/record.js +131 -0
- package/src/mcp/tools/rendering-context.js +700 -0
- package/src/mcp/tools/rom-id.js +256 -0
- package/src/mcp/tools/run-until.js +173 -0
- package/src/mcp/tools/snippets.js +235 -0
- package/src/mcp/tools/splice-chr.js +215 -0
- package/src/mcp/tools/sprite-pipeline.js +614 -0
- package/src/mcp/tools/state.js +99 -0
- package/src/mcp/tools/symbols.js +277 -0
- package/src/mcp/tools/tile-inspect.js +206 -0
- package/src/mcp/tools/toolchain.js +680 -0
- package/src/mcp/tools/watch-memory.js +212 -0
- package/src/mcp/tools/which-tiles.js +193 -0
- package/src/mcp/util.js +85 -0
- package/src/observer/bus.js +127 -0
- package/src/observer/livestream.html +589 -0
- package/src/observer/server.js +66 -0
- package/src/observer/tool-wrap.js +115 -0
- package/src/platforms/atari2600/MENTAL_MODEL.md +185 -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 +306 -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/c64/MENTAL_MODEL.md +175 -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/vic.js +273 -0
- package/src/platforms/common/default-palette.js +139 -0
- package/src/platforms/common/image-to-tiles.js +407 -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 +252 -0
- package/src/platforms/gb/TROUBLESHOOTING.md +221 -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 +120 -0
- package/src/platforms/gb/lib/c/SDCC_GOTCHAS.md +189 -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/gba/MENTAL_MODEL.md +203 -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 +165 -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 +120 -0
- package/src/platforms/gbc/lib/c/SDCC_GOTCHAS.md +189 -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/genesis/MENTAL_MODEL.md +223 -0
- package/src/platforms/genesis/TROUBLESHOOTING.md +193 -0
- package/src/platforms/genesis/UPSTREAM_SOURCES.md +52 -0
- package/src/platforms/genesis/image-to-tilemap.js +333 -0
- package/src/platforms/genesis/lib/README.md +157 -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 +495 -0
- package/src/platforms/gg/MENTAL_MODEL.md +155 -0
- package/src/platforms/gg/TROUBLESHOOTING.md +91 -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/index.js +7 -0
- package/src/platforms/lynx/MENTAL_MODEL.md +231 -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/nes/MENTAL_MODEL.md +301 -0
- package/src/platforms/nes/TROUBLESHOOTING.md +321 -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 +372 -0
- package/src/platforms/sms/MENTAL_MODEL.md +267 -0
- package/src/platforms/sms/TROUBLESHOOTING.md +124 -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/vdp.js +530 -0
- package/src/platforms/snes/MENTAL_MODEL.md +275 -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/playtest/playtest.js +612 -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 +208 -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/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 +832 -0
- package/src/toolchains/genesis-c/README.md +61 -0
- package/src/toolchains/genesis-c/genesis-c.js +598 -0
- package/src/toolchains/index.js +727 -0
- package/src/toolchains/m68k-elf-gcc/gcc.js +220 -0
- package/src/toolchains/m68kdasm.js +438 -0
- package/src/toolchains/parse-errors.js +258 -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 +519 -0
- package/src/toolchains/sjasm/sjasm.js +85 -0
- package/src/toolchains/sm83dasm.js +194 -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/z80dasm.js +303 -0
|
@@ -0,0 +1,980 @@
|
|
|
1
|
+
// Disassembly MCP tools — exposed as `disassemble` and `disassembleRom`.
|
|
2
|
+
|
|
3
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import { jsonContent, safeTool, writeOutput } from "../util.js";
|
|
5
|
+
import { parseSymbols, buildSymbolMap } from "../../toolchains/common/symbols.js";
|
|
6
|
+
import { registersForPlatform } from "../../platforms/common/registers.js";
|
|
7
|
+
|
|
8
|
+
// ── Per-platform CPU-address → file-offset mappers ────────────────
|
|
9
|
+
// Each returns { bytes, fileOffset, cpu, notes } given the full ROM
|
|
10
|
+
// bytes and a desired CPU address. Throws with a clear message if the
|
|
11
|
+
// address can't be mapped (e.g. outside ROM, bank not present).
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* NES iNES file. PRG-ROM starts at file offset 16; CPU $8000-$FFFF
|
|
15
|
+
* maps into the last 32 KB of PRG (16KB carts mirror $8000 ↔ $C000).
|
|
16
|
+
* Returns the slice starting at the requested CPU address.
|
|
17
|
+
*/
|
|
18
|
+
export function mapNesAddress(data, cpuAddr, length) {
|
|
19
|
+
if (data[0] !== 0x4e || data[1] !== 0x45 || data[2] !== 0x53 || data[3] !== 0x1a) {
|
|
20
|
+
throw new Error("not a valid iNES file (missing NES\\x1a magic at offset 0)");
|
|
21
|
+
}
|
|
22
|
+
const prgBanks = data[4];
|
|
23
|
+
const prgSize = prgBanks * 16384;
|
|
24
|
+
const prgFileStart = 16;
|
|
25
|
+
// Mapper number = high nibble of flags6 + high nibble of flags7.
|
|
26
|
+
const mapperNum = ((data[6] >> 4) & 0xF) | (data[7] & 0xF0);
|
|
27
|
+
// For NROM (mapper 0): 16KB → mirrored at $8000 + $C000; 32KB → linear $8000-$FFFF.
|
|
28
|
+
// For mapper>0 the topmost bank is fixed at $C000-$FFFF (UxROM, MMC1 final
|
|
29
|
+
// bank, MMC3 last two banks all do this); other banks are switchable. With
|
|
30
|
+
// no further info, default to "the bank that lives at $C000" for $C000+ and
|
|
31
|
+
// "bank 0" for $8000-$BFFF; agents who need a different bank pass a
|
|
32
|
+
// `bank` arg to disassembleRom.
|
|
33
|
+
let offsetInPrg;
|
|
34
|
+
let mapperLabel;
|
|
35
|
+
if (prgSize === 16384) {
|
|
36
|
+
// NROM-128 — mirror.
|
|
37
|
+
offsetInPrg = cpuAddr & 0x3FFF;
|
|
38
|
+
mapperLabel = `mapper ${mapperNum} (NROM-128 mirror)`;
|
|
39
|
+
} else if (mapperNum === 0) {
|
|
40
|
+
offsetInPrg = cpuAddr - 0x8000;
|
|
41
|
+
mapperLabel = `mapper 0 (NROM-256)`;
|
|
42
|
+
} else {
|
|
43
|
+
// Banked mapper: top 16KB fixed at $C000, bank 0 at $8000 by default.
|
|
44
|
+
if (cpuAddr >= 0xC000) {
|
|
45
|
+
offsetInPrg = (prgSize - 0x4000) + (cpuAddr - 0xC000);
|
|
46
|
+
} else if (cpuAddr >= 0x8000) {
|
|
47
|
+
offsetInPrg = cpuAddr - 0x8000;
|
|
48
|
+
} else {
|
|
49
|
+
offsetInPrg = -1;
|
|
50
|
+
}
|
|
51
|
+
mapperLabel = `mapper ${mapperNum} (top bank fixed at $C000, bank 0 at $8000)`;
|
|
52
|
+
}
|
|
53
|
+
if (offsetInPrg < 0 || offsetInPrg >= prgSize) {
|
|
54
|
+
throw new Error(`CPU address $${cpuAddr.toString(16)} outside PRG ROM (${prgSize} bytes, ${mapperLabel})`);
|
|
55
|
+
}
|
|
56
|
+
const fileOffset = prgFileStart + offsetInPrg;
|
|
57
|
+
const slice = data.slice(fileOffset, fileOffset + length);
|
|
58
|
+
return {
|
|
59
|
+
bytes: slice,
|
|
60
|
+
fileOffset,
|
|
61
|
+
cpu: "6502",
|
|
62
|
+
note: `${mapperLabel}, PRG ${prgSize >> 10} KB`,
|
|
63
|
+
mapperNum,
|
|
64
|
+
prgSize,
|
|
65
|
+
prgFileStart,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* SNES LoROM / HiROM file. Handles optional 512-byte SMC copier header,
|
|
71
|
+
* picks LoROM vs HiROM by checking the internal header at $7FC0 or $FFC0.
|
|
72
|
+
*
|
|
73
|
+
* Mapping (no SA-1 / ExHiROM support yet — those are rare for the kind
|
|
74
|
+
* of homebrew agents we care about):
|
|
75
|
+
* LoROM: bank $80-$FF mirrors $00-$7F. Address $XX:8000-$XX:FFFF →
|
|
76
|
+
* file offset = (bank & 0x7F) * 0x8000 + (addr & 0x7FFF) + copier_off
|
|
77
|
+
* HiROM: address $XX:0000-$XX:FFFF (banks $C0-$FF and $40-$7F) →
|
|
78
|
+
* file offset = (bank & 0x3F) * 0x10000 + (addr & 0xFFFF) + copier_off
|
|
79
|
+
*/
|
|
80
|
+
export function mapSnesAddress(data, cpuAddr, length, mapperHint) {
|
|
81
|
+
// Strip optional 512B copier header (SMC files have it; SFC files don't).
|
|
82
|
+
const copierOff = (data.length % 0x8000 === 0x200) ? 0x200 : 0;
|
|
83
|
+
|
|
84
|
+
let isLo, mapper;
|
|
85
|
+
if (mapperHint === "lorom") {
|
|
86
|
+
isLo = true;
|
|
87
|
+
mapper = "LoROM (user-specified)";
|
|
88
|
+
} else if (mapperHint === "hirom") {
|
|
89
|
+
isLo = false;
|
|
90
|
+
mapper = "HiROM (user-specified)";
|
|
91
|
+
} else {
|
|
92
|
+
// Detect mapper: check internal header at LoROM ($7FC0) vs HiROM ($FFC0)
|
|
93
|
+
// by looking at the mapper byte at offset $15 in the header. Valid
|
|
94
|
+
// mapper bytes: $20 (LoROM), $21 (HiROM), $30 (FastROM LoROM), $31 (FastROM HiROM).
|
|
95
|
+
const loMapperByte = data[copierOff + 0x7FC0 + 0x15];
|
|
96
|
+
const hiMapperByte = data[copierOff + 0xFFC0 + 0x15];
|
|
97
|
+
const detectedLo = loMapperByte === 0x20 || loMapperByte === 0x30 || loMapperByte === 0x32;
|
|
98
|
+
const detectedHi = hiMapperByte === 0x21 || hiMapperByte === 0x31;
|
|
99
|
+
if (!detectedLo && !detectedHi) {
|
|
100
|
+
// No valid header — small homebrew often doesn't ship one. Default
|
|
101
|
+
// to LoROM (most common for small carts; HiROM is unusual at <256KB).
|
|
102
|
+
isLo = true;
|
|
103
|
+
mapper = "LoROM (assumed — no valid header found)";
|
|
104
|
+
} else {
|
|
105
|
+
isLo = detectedLo;
|
|
106
|
+
mapper = isLo ? "LoROM" : "HiROM";
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Decompose CPU address into bank + offset-within-bank.
|
|
111
|
+
const bank = (cpuAddr >>> 16) & 0xFF;
|
|
112
|
+
const bankAddr = cpuAddr & 0xFFFF;
|
|
113
|
+
|
|
114
|
+
let fileOffset;
|
|
115
|
+
if (isLo) {
|
|
116
|
+
// LoROM: only $8000-$FFFF inside a bank holds ROM data; bank $80-$FF mirrors $00-$7F.
|
|
117
|
+
if (bankAddr < 0x8000) {
|
|
118
|
+
throw new Error(`LoROM: CPU offset $${bankAddr.toString(16)} inside bank is RAM/IO; ROM data is at $8000-$FFFF`);
|
|
119
|
+
}
|
|
120
|
+
fileOffset = copierOff + ((bank & 0x7F) * 0x8000) + (bankAddr - 0x8000);
|
|
121
|
+
} else {
|
|
122
|
+
// HiROM: full 64KB banks; bank $C0+ is mirrors of $40+.
|
|
123
|
+
fileOffset = copierOff + ((bank & 0x3F) * 0x10000) + bankAddr;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (fileOffset < 0 || fileOffset >= data.length) {
|
|
127
|
+
throw new Error(`${mapper}: CPU address $${cpuAddr.toString(16).padStart(6,"0")} → file offset 0x${fileOffset.toString(16)} outside ROM (${data.length} bytes)`);
|
|
128
|
+
}
|
|
129
|
+
const slice = data.slice(fileOffset, fileOffset + length);
|
|
130
|
+
return {
|
|
131
|
+
bytes: slice,
|
|
132
|
+
fileOffset,
|
|
133
|
+
cpu: "65816",
|
|
134
|
+
note: `${mapper}${copierOff ? " (512B copier header stripped)" : ""}, ${data.length >> 10} KB`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Walk a da65-format asm string and prepend `label:` to lines whose
|
|
140
|
+
* leading "$XXXX" address matches a symbol. Loose pattern match — works
|
|
141
|
+
* with da65's default `<addr> <bytes> <mnem>` columnar output.
|
|
142
|
+
*/
|
|
143
|
+
function annotateDisasmWithSymbols(asm, symbolMap) {
|
|
144
|
+
const lines = asm.split(/\r?\n/);
|
|
145
|
+
const out = [];
|
|
146
|
+
for (const line of lines) {
|
|
147
|
+
const m = line.match(/^([0-9A-Fa-f]{4,6}):?\s/);
|
|
148
|
+
if (m) {
|
|
149
|
+
const addr = parseInt(m[1], 16);
|
|
150
|
+
const syms = symbolMap.at(addr);
|
|
151
|
+
if (syms.length > 0) {
|
|
152
|
+
out.push(syms.map((s) => `; ${s.name}:`).join("\n"));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
out.push(line);
|
|
156
|
+
}
|
|
157
|
+
return out.join("\n");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Read N-byte little-endian word from a buffer. Used for vector tables.
|
|
162
|
+
*/
|
|
163
|
+
function readLEWord(data, offset, byteCount) {
|
|
164
|
+
let v = 0;
|
|
165
|
+
for (let i = 0; i < byteCount; i++) v |= data[offset + i] << (i * 8);
|
|
166
|
+
return v >>> 0;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Read the iNES vector table at PRG-end - 6 bytes. Returns { nmi, reset,
|
|
171
|
+
* irq } as CPU addresses. Returns null if the file isn't iNES.
|
|
172
|
+
*/
|
|
173
|
+
function nesVectors(data) {
|
|
174
|
+
if (data[0] !== 0x4e || data[1] !== 0x45 || data[2] !== 0x53 || data[3] !== 0x1a) return null;
|
|
175
|
+
const prgSize = data[4] * 16384;
|
|
176
|
+
const vecOff = 16 + prgSize - 6;
|
|
177
|
+
return {
|
|
178
|
+
nmi: readLEWord(data, vecOff, 2),
|
|
179
|
+
reset: readLEWord(data, vecOff + 2, 2),
|
|
180
|
+
irq: readLEWord(data, vecOff + 4, 2),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* SNES native + emulation vectors. The internal header at $7FE4 / $FFE4
|
|
186
|
+
* (LoROM / HiROM) holds the native vectors; $7FF4 / $FFF4 the emulation
|
|
187
|
+
* vectors. Picks the right base from the mapping byte at $15.
|
|
188
|
+
*/
|
|
189
|
+
function snesVectors(data) {
|
|
190
|
+
const copierOff = (data.length % 0x8000 === 0x200) ? 0x200 : 0;
|
|
191
|
+
const loMapper = data[copierOff + 0x7FC0 + 0x15];
|
|
192
|
+
const hiMapper = data[copierOff + 0xFFC0 + 0x15];
|
|
193
|
+
const isLo = !(hiMapper === 0x21 || hiMapper === 0x31);
|
|
194
|
+
const headerBase = copierOff + (isLo ? 0x7FC0 : 0xFFC0);
|
|
195
|
+
// Native vectors (cop, brk, abort, nmi, reset, irq) at header+$24..
|
|
196
|
+
return {
|
|
197
|
+
native_cop: readLEWord(data, headerBase + 0x24, 2),
|
|
198
|
+
native_brk: readLEWord(data, headerBase + 0x26, 2),
|
|
199
|
+
native_abort: readLEWord(data, headerBase + 0x28, 2),
|
|
200
|
+
native_nmi: readLEWord(data, headerBase + 0x2A, 2),
|
|
201
|
+
native_reset: readLEWord(data, headerBase + 0x2C, 2),
|
|
202
|
+
native_irq: readLEWord(data, headerBase + 0x2E, 2),
|
|
203
|
+
emu_cop: readLEWord(data, headerBase + 0x34, 2),
|
|
204
|
+
emu_abort: readLEWord(data, headerBase + 0x38, 2),
|
|
205
|
+
emu_nmi: readLEWord(data, headerBase + 0x3A, 2),
|
|
206
|
+
emu_reset: readLEWord(data, headerBase + 0x3C, 2),
|
|
207
|
+
emu_irqbrk: readLEWord(data, headerBase + 0x3E, 2),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* da65 with `--comments 4` emits lines like:
|
|
213
|
+
* ` lda #$05 ; 8000 A9 05`
|
|
214
|
+
* with the CPU address in the trailing comment. Extract it.
|
|
215
|
+
*
|
|
216
|
+
* Returns the integer address, or null if the line has no address comment.
|
|
217
|
+
*/
|
|
218
|
+
function extractInstructionAddress(line) {
|
|
219
|
+
// The trailing comment has form `; <4-6 hex> <bytes...>`. Anchor on
|
|
220
|
+
// the *last* `;` in case the line has multiple.
|
|
221
|
+
const m = line.match(/;\s+([0-9A-Fa-f]{4,6})\s+(?:[0-9A-Fa-f]{2}\b)/);
|
|
222
|
+
return m ? parseInt(m[1], 16) : null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Annotate asm output with hardware register names. Matches operand patterns
|
|
227
|
+
* like `$NNNN` and `$XX:NNNN` in the source column and appends a register
|
|
228
|
+
* name to the trailing comment (or creates one).
|
|
229
|
+
*/
|
|
230
|
+
function annotateRegisters(asm, registers) {
|
|
231
|
+
if (!registers) return asm;
|
|
232
|
+
return asm.split(/\r?\n/).map((line) => {
|
|
233
|
+
if (line.startsWith(";")) return line;
|
|
234
|
+
// Split into source + existing-comment. Conservative — we only consider
|
|
235
|
+
// the FIRST `; ` as the comment boundary (da65 always emits one).
|
|
236
|
+
const sepIdx = line.indexOf(";");
|
|
237
|
+
const src = sepIdx >= 0 ? line.slice(0, sepIdx) : line;
|
|
238
|
+
let regName = null;
|
|
239
|
+
const m24 = src.match(/\$([0-9A-Fa-f]{2}):([0-9A-Fa-f]{4})/);
|
|
240
|
+
if (m24) {
|
|
241
|
+
const addr = (parseInt(m24[1], 16) << 16) | parseInt(m24[2], 16);
|
|
242
|
+
regName = registers[addr] ?? registers[addr & 0xFFFF] ?? null;
|
|
243
|
+
}
|
|
244
|
+
if (!regName) {
|
|
245
|
+
const m16 = src.match(/\$([0-9A-Fa-f]{3,4})\b/);
|
|
246
|
+
if (m16) {
|
|
247
|
+
regName = registers[parseInt(m16[1], 16)] ?? null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (!regName) return line;
|
|
251
|
+
if (line.includes(regName)) return line;
|
|
252
|
+
if (sepIdx >= 0) {
|
|
253
|
+
// Tail-append into the existing comment, after the byte-count column.
|
|
254
|
+
return line.replace(/\s*$/, " " + regName);
|
|
255
|
+
}
|
|
256
|
+
return line.replace(/\s*$/, " ; " + regName);
|
|
257
|
+
}).join("\n");
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Annotate asm output with file-offset comments. Given a CPU→file offset
|
|
262
|
+
* translator function `cpuToFile(addr)`, each line with a parseable
|
|
263
|
+
* trailing address comment gets `@0xNNNN` injected into it.
|
|
264
|
+
*/
|
|
265
|
+
function annotateFileOffsets(asm, cpuToFile, secondaryCpuToFile) {
|
|
266
|
+
return asm.split(/\r?\n/).map((line) => {
|
|
267
|
+
if (line.startsWith(";")) return line;
|
|
268
|
+
const addr = extractInstructionAddress(line);
|
|
269
|
+
if (addr == null) return line;
|
|
270
|
+
let off;
|
|
271
|
+
try { off = cpuToFile(addr); } catch { return line; }
|
|
272
|
+
if (off == null) return line;
|
|
273
|
+
let tag = "@0x" + off.toString(16).toUpperCase();
|
|
274
|
+
if (secondaryCpuToFile) {
|
|
275
|
+
let off2;
|
|
276
|
+
try { off2 = secondaryCpuToFile(addr); } catch { /* swallow */ }
|
|
277
|
+
if (off2 != null) {
|
|
278
|
+
tag += " (prg @0x" + off2.toString(16).toUpperCase() + ")";
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (line.includes(tag)) return line;
|
|
282
|
+
return line.replace(/\s*$/, " " + tag);
|
|
283
|
+
}).join("\n");
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Scan disassembled asm for the first end-of-routine instruction (rts, rti,
|
|
288
|
+
* rtl, or bare jmp at column 0). Returns the line index after it, or -1 if
|
|
289
|
+
* none found. Used by `untilReturn`.
|
|
290
|
+
*/
|
|
291
|
+
/**
|
|
292
|
+
* Inject vector-name labels into z80dasm output. The Z80 disassembler
|
|
293
|
+
* emits `LXXXX:` labels for every branch target it sees, but doesn't
|
|
294
|
+
* know which addresses are interrupt vectors. For each label whose
|
|
295
|
+
* address matches a known vector ($0000=reset, $0038=irq, $0066=nmi, etc.),
|
|
296
|
+
* emit an additional `<vec-name>:` comment line.
|
|
297
|
+
*/
|
|
298
|
+
function injectVectorLabels(asm, labels) {
|
|
299
|
+
const byAddr = new Map();
|
|
300
|
+
for (const l of labels) byAddr.set(l.addr, l.name);
|
|
301
|
+
const lines = asm.split(/\r?\n/);
|
|
302
|
+
const out = [];
|
|
303
|
+
for (const line of lines) {
|
|
304
|
+
// Match `LXXXX:` label lines (4 hex for Z80/SM83, 6 for m68k).
|
|
305
|
+
const m = line.match(/^L([0-9A-F]{4,6}):/);
|
|
306
|
+
if (m) {
|
|
307
|
+
const addr = parseInt(m[1], 16);
|
|
308
|
+
const name = byAddr.get(addr);
|
|
309
|
+
if (name) out.push(`${name}:`);
|
|
310
|
+
} else {
|
|
311
|
+
// Or match an instruction line whose trailing comment says ADDR is a vector.
|
|
312
|
+
const ma = line.match(/;\s+([0-9A-F]{4,6})\s+/);
|
|
313
|
+
if (ma) {
|
|
314
|
+
const addr = parseInt(ma[1], 16);
|
|
315
|
+
const name = byAddr.get(addr);
|
|
316
|
+
// Only insert the label if it wasn't already emitted as LXXXX.
|
|
317
|
+
if (name) {
|
|
318
|
+
// Don't double-insert if we just emitted the label above.
|
|
319
|
+
if (out.length > 0 && !out[out.length - 1].startsWith(name + ":")) {
|
|
320
|
+
out.push(`${name}:`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
out.push(line);
|
|
326
|
+
}
|
|
327
|
+
return out.join("\n");
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function findFirstReturnLine(asm, cpuFamily = "6502") {
|
|
331
|
+
const lines = asm.split(/\r?\n/);
|
|
332
|
+
for (let i = 0; i < lines.length; i++) {
|
|
333
|
+
const line = lines[i];
|
|
334
|
+
const trimmed = line.trim();
|
|
335
|
+
if (cpuFamily === "z80" || cpuFamily === "sm83") {
|
|
336
|
+
// SM83 differs from Z80 only by missing `retn` (no NMI-return alias).
|
|
337
|
+
// Bare ret, reti, jp <addr>, jp <label> all terminate. Conditional
|
|
338
|
+
// ret (`ret nz` etc) does NOT — routine continues past it.
|
|
339
|
+
if (/^ret\s*(;|$)/.test(trimmed)) return i + 1;
|
|
340
|
+
if (/^reti\b/.test(trimmed)) return i + 1;
|
|
341
|
+
if (cpuFamily === "z80" && /^retn\b/.test(trimmed)) return i + 1;
|
|
342
|
+
if (/^jp\s+\$[0-9A-Fa-f]/.test(trimmed)) return i + 1;
|
|
343
|
+
if (/^jp\s+L[0-9A-Fa-f]/.test(trimmed)) return i + 1;
|
|
344
|
+
// sm83-only: `jp hl` is an indirect jump-table dispatch; treat as
|
|
345
|
+
// routine-end since the decoder can't follow it.
|
|
346
|
+
if (cpuFamily === "sm83" && /^jp\s+hl\b/.test(trimmed)) return i + 1;
|
|
347
|
+
} else {
|
|
348
|
+
if (/^(rts|rti|rtl)\b/.test(trimmed)) return i + 1;
|
|
349
|
+
if (/^jmp\s+\$[0-9A-Fa-f]/.test(trimmed)) return i + 1;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return -1;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* SMS / Game Gear address mapping. The first 48 KB of the ROM is mapped
|
|
357
|
+
* 1:1 to the Z80's lower 48 KB ($0000-$BFFF). Higher banks are
|
|
358
|
+
* page-mapped via the sega mapper, but for v1 we treat the 16 KB at
|
|
359
|
+
* $8000-$BFFF as "bank 0" by default.
|
|
360
|
+
*/
|
|
361
|
+
export function mapSmsAddress(data, cpuAddr, length) {
|
|
362
|
+
// Slot 0: $0000-$3FFF maps to file 0..$3FFF (bank 0, fixed).
|
|
363
|
+
// Slot 1: $4000-$7FFF maps to file $4000..$7FFF (bank 1, fixed by default).
|
|
364
|
+
// Slot 2: $8000-$BFFF maps to file $8000..$BFFF (banked — default = bank 2).
|
|
365
|
+
if (cpuAddr < 0xC000) {
|
|
366
|
+
const fileOffset = cpuAddr;
|
|
367
|
+
if (fileOffset >= data.length) {
|
|
368
|
+
throw new Error(`CPU address $${cpuAddr.toString(16)} past end of SMS ROM (${data.length} bytes)`);
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
bytes: data.slice(fileOffset, fileOffset + length),
|
|
372
|
+
fileOffset,
|
|
373
|
+
cpu: "z80",
|
|
374
|
+
note: `SMS/GG sega mapper, slot ${cpuAddr < 0x4000 ? 0 : cpuAddr < 0x8000 ? 1 : 2} (default bank)`,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
throw new Error(
|
|
378
|
+
`CPU address $${cpuAddr.toString(16)} is in RAM ($C000-$FFFF), not ROM. ` +
|
|
379
|
+
`For SMS disasm, target $0000-$BFFF.`
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Game Boy / Game Boy Color address mapping.
|
|
385
|
+
* Slot 0: $0000-$3FFF = file 0..$3FFF (bank 0, fixed)
|
|
386
|
+
* Slot 1: $4000-$7FFF = file (bank * 0x4000)..(bank * 0x4000 + 0x3FFF)
|
|
387
|
+
* Default bank 1 — pass `bank` to disassembleRom for a different one.
|
|
388
|
+
* RAM ($8000+) and I/O are not in the ROM file.
|
|
389
|
+
*/
|
|
390
|
+
export function mapGbAddress(data, cpuAddr, length, bank = 1) {
|
|
391
|
+
if (cpuAddr < 0x4000) {
|
|
392
|
+
const fileOffset = cpuAddr;
|
|
393
|
+
if (fileOffset >= data.length) {
|
|
394
|
+
throw new Error(`CPU address $${cpuAddr.toString(16)} past end of GB ROM (${data.length} bytes)`);
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
bytes: data.slice(fileOffset, fileOffset + length),
|
|
398
|
+
fileOffset,
|
|
399
|
+
cpu: "sm83",
|
|
400
|
+
note: "GB mapper, slot 0 (bank 0, fixed)",
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
if (cpuAddr < 0x8000) {
|
|
404
|
+
const fileOffset = (bank * 0x4000) + (cpuAddr - 0x4000);
|
|
405
|
+
if (fileOffset >= data.length) {
|
|
406
|
+
throw new Error(
|
|
407
|
+
`CPU $${cpuAddr.toString(16)} (bank ${bank}, file 0x${fileOffset.toString(16)}) ` +
|
|
408
|
+
`past end of GB ROM (${data.length} bytes)`
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
bytes: data.slice(fileOffset, fileOffset + length),
|
|
413
|
+
fileOffset,
|
|
414
|
+
cpu: "sm83",
|
|
415
|
+
note: `GB mapper, slot 1 (bank ${bank})`,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
throw new Error(
|
|
419
|
+
`CPU address $${cpuAddr.toString(16)} is in VRAM/WRAM/HRAM, not ROM. ` +
|
|
420
|
+
`For GB disasm, target $0000-$7FFF.`
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Atari 2600 address mapping. 4 KB carts mirror through $F000-$FFFF (and
|
|
426
|
+
* $D000, $B000, etc. — the 2600 only decodes the low 13 bits of the
|
|
427
|
+
* address). 8 KB+ carts use bank-switching schemes (F8, F6, F4, etc.)
|
|
428
|
+
* that we don't fully model here — disassembling those needs the bank
|
|
429
|
+
* arg to slice into the right 4KB window.
|
|
430
|
+
*/
|
|
431
|
+
export function mapAtari2600Address(data, cpuAddr, length, bank = 0) {
|
|
432
|
+
// Strip mirrors: 2600 addresses are 13-bit. Anything in $1000-$1FFF
|
|
433
|
+
// (mirrored as $3000, $5000, ..., $F000) maps to ROM.
|
|
434
|
+
const stripped = cpuAddr & 0x1FFF;
|
|
435
|
+
if (stripped < 0x1000) {
|
|
436
|
+
throw new Error(
|
|
437
|
+
`CPU address $${cpuAddr.toString(16)} is in TIA/RIOT/RAM space, not ROM. ` +
|
|
438
|
+
`For 2600 disasm, target $1000-$1FFF (or any mirror: $3000, $5000, ..., $F000).`
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
const offsetInBank = stripped - 0x1000; // 0..0xFFF
|
|
442
|
+
// Default 4KB cart: single bank, file offset = offsetInBank.
|
|
443
|
+
// Larger carts: caller passes `bank` index.
|
|
444
|
+
const bankSize = Math.min(data.length, 0x1000);
|
|
445
|
+
const fileOffset = bank * bankSize + offsetInBank;
|
|
446
|
+
if (fileOffset >= data.length) {
|
|
447
|
+
throw new Error(
|
|
448
|
+
`CPU $${cpuAddr.toString(16)} (bank ${bank}, file 0x${fileOffset.toString(16)}) ` +
|
|
449
|
+
`past end of 2600 ROM (${data.length} bytes)`
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
return {
|
|
453
|
+
bytes: data.slice(fileOffset, fileOffset + length),
|
|
454
|
+
fileOffset,
|
|
455
|
+
cpu: "6502",
|
|
456
|
+
note: data.length <= 0x1000
|
|
457
|
+
? "2600 4KB cart (no bank-switching)"
|
|
458
|
+
: `2600 banked cart, bank ${bank} of ${Math.ceil(data.length / 0x1000)}`,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Genesis / Mega Drive address mapping. The cartridge ROM maps 1:1 into
|
|
464
|
+
* the 68000 address space starting at $000000 — flat, big-endian, no
|
|
465
|
+
* mapper for ROMs ≤ 4 MB (the common case). $000000-$0000FF is the vector
|
|
466
|
+
* table (SP at $000000, reset PC at $000004); cart code typically begins
|
|
467
|
+
* at the reset vector. We treat the CPU address as the file offset
|
|
468
|
+
* directly.
|
|
469
|
+
*/
|
|
470
|
+
export function mapGenesisAddress(data, cpuAddr, length) {
|
|
471
|
+
if (cpuAddr + length > data.length) {
|
|
472
|
+
throw new Error(
|
|
473
|
+
`Genesis: CPU address $${cpuAddr.toString(16)} + ${length} extends past ROM ` +
|
|
474
|
+
`(${data.length} bytes). ROM maps 1:1 from $000000; for >4MB carts with mappers, ` +
|
|
475
|
+
`slice the file manually.`
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
return {
|
|
479
|
+
bytes: data.slice(cpuAddr, cpuAddr + length),
|
|
480
|
+
fileOffset: cpuAddr,
|
|
481
|
+
cpu: "m68k",
|
|
482
|
+
note: "Genesis ROM maps 1:1 to 68000 $000000+ (flat, big-endian).",
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Atari 7800 address mapping. The cart has a 128-byte header at file
|
|
488
|
+
* offset 0 (skip it). ROM body is at file offset 128 and maps into the
|
|
489
|
+
* 6502 address space starting at varying high addresses depending on
|
|
490
|
+
* cart size:
|
|
491
|
+
* 16 KB: $C000-$FFFF
|
|
492
|
+
* 32 KB: $8000-$FFFF
|
|
493
|
+
* 48 KB: $4000-$FFFF (rare)
|
|
494
|
+
* 144 KB SuperGame: bank-switched at $8000-$BFFF + fixed at $C000
|
|
495
|
+
*/
|
|
496
|
+
export function mapAtari7800Address(data, cpuAddr, length, bank = 0) {
|
|
497
|
+
// Detect header. "ATARI7800" magic at offset 1.
|
|
498
|
+
const hasHeader =
|
|
499
|
+
data.length > 128 &&
|
|
500
|
+
String.fromCharCode(data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9])
|
|
501
|
+
=== "ATARI7800";
|
|
502
|
+
const headerSize = hasHeader ? 128 : 0;
|
|
503
|
+
const romSize = data.length - headerSize;
|
|
504
|
+
// Default behavior: figure out which file-offset corresponds to cpuAddr.
|
|
505
|
+
// For "fixed" carts (no banking), CPU $C000 maps to romStart + (romSize - 16KB)
|
|
506
|
+
// etc. The simplest, most-correct model: assume cart fills high address
|
|
507
|
+
// space ending at $FFFF.
|
|
508
|
+
const cartStartCpu = 0x10000 - romSize; // e.g. 32KB = $8000
|
|
509
|
+
if (cpuAddr < cartStartCpu) {
|
|
510
|
+
throw new Error(
|
|
511
|
+
`CPU address $${cpuAddr.toString(16)} is below cart ROM (cart starts at $${cartStartCpu.toString(16)}). ` +
|
|
512
|
+
`For 7800 disasm, target $${cartStartCpu.toString(16)}-$FFFF.`
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
const fileOffset = headerSize + (cpuAddr - cartStartCpu);
|
|
516
|
+
if (fileOffset >= data.length) {
|
|
517
|
+
throw new Error(`CPU $${cpuAddr.toString(16)} past end of 7800 ROM`);
|
|
518
|
+
}
|
|
519
|
+
return {
|
|
520
|
+
bytes: data.slice(fileOffset, fileOffset + length),
|
|
521
|
+
fileOffset,
|
|
522
|
+
cpu: "6502",
|
|
523
|
+
note: hasHeader
|
|
524
|
+
? `7800 ATARI7800 header detected (128B skipped); cart maps to $${cartStartCpu.toString(16).toUpperCase()}-$FFFF`
|
|
525
|
+
: `7800 headerless cart; cart maps to $${cartStartCpu.toString(16).toUpperCase()}-$FFFF`,
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Map a C64 CPU address to a file offset in a .prg image.
|
|
531
|
+
*
|
|
532
|
+
* .prg layout: 2-byte little-endian LOAD ADDRESS, then the program bytes.
|
|
533
|
+
* file[0..1] = load address (e.g. $0801 for BASIC start)
|
|
534
|
+
* file[2..] = program bytes loaded contiguously starting at that addr
|
|
535
|
+
*
|
|
536
|
+
* For .crt cart images we'd need to honor the C64 cart header (see CCS64
|
|
537
|
+
* docs); not implemented here — pass `bank` instead and call with the raw
|
|
538
|
+
* binary if you're hand-mapping.
|
|
539
|
+
*/
|
|
540
|
+
export function mapC64Address(data, cpuAddr, length, bank = 0) {
|
|
541
|
+
// Detect .prg by reading the load address and seeing if it makes sense.
|
|
542
|
+
// (Anything is a valid load addr in theory, so we just trust the first
|
|
543
|
+
// 2 bytes here.)
|
|
544
|
+
const loadAddr = data[0] | (data[1] << 8);
|
|
545
|
+
const fileOffset = 2 + (cpuAddr - loadAddr);
|
|
546
|
+
if (cpuAddr < loadAddr) {
|
|
547
|
+
throw new Error(
|
|
548
|
+
`CPU $${cpuAddr.toString(16)} is below the .prg load address $${loadAddr.toString(16)}. ` +
|
|
549
|
+
`This file loads at $${loadAddr.toString(16)} — start disasm there.`
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
if (fileOffset < 2 || fileOffset >= data.length) {
|
|
553
|
+
throw new Error(
|
|
554
|
+
`CPU $${cpuAddr.toString(16)} maps to file offset ${fileOffset}, outside this ${data.length}-byte .prg.`
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
return {
|
|
558
|
+
bytes: data.slice(fileOffset, fileOffset + length),
|
|
559
|
+
fileOffset,
|
|
560
|
+
cpu: "6502",
|
|
561
|
+
note: `c64 .prg load addr = $${loadAddr.toString(16).toUpperCase()}; first byte after header is at file offset 2`,
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
export function registerDisasmTools(server, z) {
|
|
566
|
+
server.tool(
|
|
567
|
+
"disassemble",
|
|
568
|
+
"Disassemble a chunk of bytes (provided as base64) using cc65's da65 disassembler. Defaults to 6502 / NES start address. " +
|
|
569
|
+
"Supports 6502, 65c02, 65sc02, 65816, huc6280. Pass `symbolsPath` (or `symbolsText`) to annotate the output with labels — " +
|
|
570
|
+
"auto-detects WLA .sym, cc65 .lbl, or pass `symbolsFormat` explicitly. Use this to read what an existing ROM does. " +
|
|
571
|
+
"DEFAULT writes the asm text to outputPath and returns {path, bytes}; pass inline:true to get the asm in the response " +
|
|
572
|
+
"(you must pass one or the other).",
|
|
573
|
+
{
|
|
574
|
+
base64: z.string().describe("Base64 of the bytes to disassemble."),
|
|
575
|
+
startAddress: z.number().int().min(0).max(0xffffff).default(0x8000).describe("Address of the first byte (e.g. 0x8000 for NES PRG)."),
|
|
576
|
+
cpu: z.enum(["6502", "65c02", "65sc02", "65816", "huc6280"]).default("6502"),
|
|
577
|
+
symbolsPath: z.string().optional().describe("Optional path to a symbol file (asar .sym, cc65 .lbl). Auto-detect format from extension."),
|
|
578
|
+
symbolsText: z.string().optional().describe("Optional inline symbol-file text. If both this and symbolsPath are given, symbolsPath wins."),
|
|
579
|
+
symbolsFormat: z.enum(["wla", "cc65-lbl"]).optional().describe("Explicit symbol-file format override (when filename and content are ambiguous)."),
|
|
580
|
+
outputPath: z.string().optional().describe("Absolute path to write the asm text to. Required unless inline:true."),
|
|
581
|
+
inline: z.boolean().default(false).describe("If true, return the asm text in the response instead of writing to disk. Default false — then outputPath is required."),
|
|
582
|
+
},
|
|
583
|
+
safeTool(async ({ base64, startAddress, cpu, symbolsPath, symbolsText, symbolsFormat, outputPath, inline }) => {
|
|
584
|
+
if (!inline && !outputPath) {
|
|
585
|
+
throw new Error("disassemble: pass outputPath (write the asm to disk, returns {path}) or inline:true (return the asm in the response).");
|
|
586
|
+
}
|
|
587
|
+
const { runDa65 } = await import("../../toolchains/cc65/da65.js");
|
|
588
|
+
const bytes = new Uint8Array(Buffer.from(base64, "base64"));
|
|
589
|
+
const r = await runDa65({ bytes, startAddress, cpu });
|
|
590
|
+
let asm = r.asm;
|
|
591
|
+
let symbolCount = 0;
|
|
592
|
+
if (symbolsPath || symbolsText) {
|
|
593
|
+
const text = symbolsPath ? await readFile(symbolsPath, "utf-8") : symbolsText;
|
|
594
|
+
const symbols = parseSymbols({ text, path: symbolsPath, format: symbolsFormat });
|
|
595
|
+
const map = buildSymbolMap(symbols);
|
|
596
|
+
asm = annotateDisasmWithSymbols(asm, map);
|
|
597
|
+
symbolCount = symbols.length;
|
|
598
|
+
}
|
|
599
|
+
const meta = {
|
|
600
|
+
exitCode: r.exitCode,
|
|
601
|
+
bytes: bytes.length,
|
|
602
|
+
startAddress,
|
|
603
|
+
cpu,
|
|
604
|
+
symbolCount,
|
|
605
|
+
};
|
|
606
|
+
if (inline) {
|
|
607
|
+
return jsonContent({ ...meta, asm });
|
|
608
|
+
}
|
|
609
|
+
const { path } = writeOutput(asm, { outputPath, what: "disassembly asm" });
|
|
610
|
+
return jsonContent({ ...meta, path, asmBytes: asm.length });
|
|
611
|
+
}),
|
|
612
|
+
);
|
|
613
|
+
|
|
614
|
+
server.tool(
|
|
615
|
+
"disassembleRom",
|
|
616
|
+
"Use this to read what an existing ROM file does: mapper-aware disassembly with agent-friendly " +
|
|
617
|
+
"annotations (auto-tagged reset/nmi/irq vectors, hardware register names on operands, and per-line " +
|
|
618
|
+
"`; @0xNNNN` file offsets ready for patchFile — NES reports both .nes and PRG offsets). Platform is " +
|
|
619
|
+
"sniffed from the extension (NES/SNES/SMS/GG/GB/GBC/Atari 2600/7800/C64/Genesis) or pass `platform`. " +
|
|
620
|
+
"Use `endAddress`/`untilReturn` to grab exactly one routine, `dataRanges` to mark non-code, and " +
|
|
621
|
+
"`outputPath` to write big disassemblies to disk instead of inline. (For raw bytes you already have, " +
|
|
622
|
+
"use `disassemble`.) See param hints for the rest.",
|
|
623
|
+
{
|
|
624
|
+
path: z.string().describe("Absolute path to a ROM file (.nes / .sfc / .smc)."),
|
|
625
|
+
platform: z.enum(["nes", "snes", "sms", "gg", "gb", "gbc", "atari2600", "atari7800", "c64", "genesis"]).optional().describe("Override platform detection. Omit to sniff from file extension."),
|
|
626
|
+
bank: z.number().int().min(0).max(255).optional().describe("GB/GBC only: which ROM bank to map at $4000-$7FFF when startAddress is in slot 1. Default bank 1."),
|
|
627
|
+
startAddress: z.number().int().min(0).max(0xffffff).default(0x8000).describe("CPU address to start at. NES: $8000-$FFFF. SNES: $008000-$FFFFFF (bank-prefixed)."),
|
|
628
|
+
length: z.number().int().min(1).max(65536).optional().describe("Bytes to disassemble. Default 256. Mutually exclusive with endAddress."),
|
|
629
|
+
endAddress: z.number().int().min(0).max(0xffffff).optional().describe("CPU end address (inclusive). Alternative to length — useful when disassembling 'from X to Y'."),
|
|
630
|
+
untilReturn: z.boolean().default(false).describe("Stop at the first rts/rti/rtl/bare-jmp encountered in the output. Use to grab exactly one routine after locating its entry via auto-tagged labels."),
|
|
631
|
+
mapper: z.enum(["lorom", "hirom"]).optional().describe("SNES only: override mapper detection (header-less homebrew defaults to lorom)."),
|
|
632
|
+
dataRanges: z.array(z.object({
|
|
633
|
+
start: z.number().int().min(0).max(0xffffff).describe("CPU address (start of data range)."),
|
|
634
|
+
length: z.number().int().min(1).describe("Length in bytes."),
|
|
635
|
+
})).optional().describe("Address ranges to treat as DATA (emitted as `.byte` tables instead of disassembled as code). Use for sprite/tile/lookup tables embedded in the code stream."),
|
|
636
|
+
autoLabelVectors: z.boolean().default(true).describe("Pre-seed reset/nmi/irq labels from the vector table. Hugely improves orientation in unknown ROMs."),
|
|
637
|
+
annotateRegisters: z.boolean().default(true).describe("Append `; PPUMASK` etc. to operands that hit a known hardware register."),
|
|
638
|
+
annotateFileOffsets: z.boolean().default(true).describe("Append `; @0xNNNN` to every disassembled line — direct file offset for patchFile."),
|
|
639
|
+
outputPath: z.string().optional().describe("Absolute path. If set, writes the raw asm to disk and returns `{outputPath, length, bytes}` instead of inline asm. Use for large disassemblies."),
|
|
640
|
+
},
|
|
641
|
+
safeTool(async (args) => {
|
|
642
|
+
const {
|
|
643
|
+
path: romPath, platform, mapper,
|
|
644
|
+
untilReturn, dataRanges,
|
|
645
|
+
autoLabelVectors,
|
|
646
|
+
outputPath,
|
|
647
|
+
} = args;
|
|
648
|
+
// `let` because Genesis re-points an unset startAddress to the reset vector.
|
|
649
|
+
let startAddress = args.startAddress;
|
|
650
|
+
const annotateRegistersFlag = args.annotateRegisters ?? true;
|
|
651
|
+
const annotateFileOffsetsFlag = args.annotateFileOffsets ?? true;
|
|
652
|
+
|
|
653
|
+
const { runDa65 } = await import("../../toolchains/cc65/da65.js");
|
|
654
|
+
const data = new Uint8Array(await readFile(romPath));
|
|
655
|
+
|
|
656
|
+
// Resolve platform.
|
|
657
|
+
const resolved = platform ?? (
|
|
658
|
+
/\.nes$/i.test(romPath) ? "nes" :
|
|
659
|
+
/\.(sfc|smc)$/i.test(romPath) ? "snes" :
|
|
660
|
+
/\.sms$/i.test(romPath) ? "sms" :
|
|
661
|
+
/\.gg$/i.test(romPath) ? "gg" :
|
|
662
|
+
/\.gb$/i.test(romPath) ? "gb" :
|
|
663
|
+
/\.gbc$/i.test(romPath) ? "gbc" :
|
|
664
|
+
/\.a26$/i.test(romPath) ? "atari2600" :
|
|
665
|
+
/\.a78$/i.test(romPath) ? "atari7800" :
|
|
666
|
+
/\.prg$/i.test(romPath) ? "c64" :
|
|
667
|
+
/\.(gen|md|bin)$/i.test(romPath) ? "genesis" :
|
|
668
|
+
null
|
|
669
|
+
);
|
|
670
|
+
if (!resolved) {
|
|
671
|
+
throw new Error(`could not detect platform from path '${romPath}'. Pass platform explicitly.`);
|
|
672
|
+
}
|
|
673
|
+
const cpuFamily = (resolved === "sms" || resolved === "gg") ? "z80"
|
|
674
|
+
: (resolved === "gb" || resolved === "gbc") ? "sm83"
|
|
675
|
+
: (resolved === "genesis") ? "m68k"
|
|
676
|
+
: "6502";
|
|
677
|
+
|
|
678
|
+
// Resolve length: endAddress wins over length; default 256.
|
|
679
|
+
let length;
|
|
680
|
+
if (args.endAddress != null) {
|
|
681
|
+
if (args.length != null) {
|
|
682
|
+
throw new Error("disassembleRom: pass either `length` OR `endAddress`, not both.");
|
|
683
|
+
}
|
|
684
|
+
length = args.endAddress - startAddress + 1;
|
|
685
|
+
if (length <= 0) throw new Error(`disassembleRom: endAddress ($${args.endAddress.toString(16)}) must be >= startAddress ($${startAddress.toString(16)}).`);
|
|
686
|
+
} else {
|
|
687
|
+
length = args.length ?? 256;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Genesis code lives in the low ROM; the default $8000 start (a
|
|
691
|
+
// 6502/Z80 convention) is meaningless for 68000. If the caller
|
|
692
|
+
// didn't override startAddress, begin at the reset vector ($000004
|
|
693
|
+
// holds the reset PC).
|
|
694
|
+
// Genesis code lives in low ROM; the $8000 schema default (a 6502/Z80
|
|
695
|
+
// convention) is meaningless on 68000. When the caller left it at the
|
|
696
|
+
// default, start at the reset vector ($000004 holds the reset PC).
|
|
697
|
+
if (resolved === "genesis" && startAddress === 0x8000 && args.endAddress === undefined) {
|
|
698
|
+
startAddress = (data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]) >>> 0;
|
|
699
|
+
if (startAddress >= data.length) startAddress = 0x200; // fallback
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
const mapped = resolved === "snes"
|
|
703
|
+
? mapSnesAddress(data, startAddress, length, mapper)
|
|
704
|
+
: resolved === "sms" || resolved === "gg"
|
|
705
|
+
? mapSmsAddress(data, startAddress, length)
|
|
706
|
+
: resolved === "gb" || resolved === "gbc"
|
|
707
|
+
? mapGbAddress(data, startAddress, length, args.bank)
|
|
708
|
+
: resolved === "atari2600"
|
|
709
|
+
? mapAtari2600Address(data, startAddress, length, args.bank ?? 0)
|
|
710
|
+
: resolved === "atari7800"
|
|
711
|
+
? mapAtari7800Address(data, startAddress, length, args.bank ?? 0)
|
|
712
|
+
: resolved === "c64"
|
|
713
|
+
? mapC64Address(data, startAddress, length, args.bank ?? 0)
|
|
714
|
+
: resolved === "genesis"
|
|
715
|
+
? mapGenesisAddress(data, startAddress, length)
|
|
716
|
+
: mapNesAddress(data, startAddress, length);
|
|
717
|
+
|
|
718
|
+
// Build vector labels + data ranges. For SMS, no vector table to
|
|
719
|
+
// auto-read (Z80 uses reset $0000 + interrupt vector based on IM
|
|
720
|
+
// mode). For NES/SNES we synthesize a da65 info file.
|
|
721
|
+
let info = null;
|
|
722
|
+
const labels = [];
|
|
723
|
+
if (autoLabelVectors && cpuFamily === "6502") {
|
|
724
|
+
let vecs = null;
|
|
725
|
+
if (resolved === "nes") vecs = nesVectors(data);
|
|
726
|
+
else if (resolved === "snes") vecs = snesVectors(data);
|
|
727
|
+
else if (resolved === "atari2600") {
|
|
728
|
+
// 2600 vectors at $FFFA-$FFFF (NMI/RESET/IRQ); all carts map them
|
|
729
|
+
// to top of 4KB bank. Read last 6 bytes of the file.
|
|
730
|
+
const off = data.length - 6;
|
|
731
|
+
vecs = {
|
|
732
|
+
nmi: data[off + 0] | (data[off + 1] << 8),
|
|
733
|
+
reset: data[off + 2] | (data[off + 3] << 8),
|
|
734
|
+
irq: data[off + 4] | (data[off + 5] << 8),
|
|
735
|
+
};
|
|
736
|
+
} else if (resolved === "atari7800") {
|
|
737
|
+
// 7800 vectors at $FFFA-$FFFF (NMI/RESET/IRQ).
|
|
738
|
+
const off = data.length - 6;
|
|
739
|
+
vecs = {
|
|
740
|
+
nmi: data[off + 0] | (data[off + 1] << 8),
|
|
741
|
+
reset: data[off + 2] | (data[off + 3] << 8),
|
|
742
|
+
irq: data[off + 4] | (data[off + 5] << 8),
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
if (vecs) {
|
|
746
|
+
for (const [name, addr] of Object.entries(vecs)) {
|
|
747
|
+
if (addr >= startAddress && addr <= startAddress + length - 1) {
|
|
748
|
+
labels.push({ name, addr });
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
if (autoLabelVectors && cpuFamily === "z80") {
|
|
754
|
+
// Z80 fixed vectors: reset = $0000, interrupt vectors at $0008
|
|
755
|
+
// ($28 = rst 8), $0010, $0018, $0020, $0028, $0030, $0038. NMI = $0066.
|
|
756
|
+
// SMS uses $38 (IM 1) for vblank, $66 (NMI) for the pause button.
|
|
757
|
+
const z80Vectors = {
|
|
758
|
+
reset: 0x0000,
|
|
759
|
+
rst08: 0x0008, rst10: 0x0010, rst18: 0x0018,
|
|
760
|
+
rst20: 0x0020, rst28: 0x0028, rst30: 0x0030,
|
|
761
|
+
irq: 0x0038, // SMS vblank handler when IM 1
|
|
762
|
+
nmi: 0x0066, // SMS pause button
|
|
763
|
+
};
|
|
764
|
+
for (const [name, addr] of Object.entries(z80Vectors)) {
|
|
765
|
+
if (addr >= startAddress && addr <= startAddress + length - 1) {
|
|
766
|
+
labels.push({ name, addr });
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
if (autoLabelVectors && cpuFamily === "sm83") {
|
|
771
|
+
// GB vectors: rst $00-$38, plus dedicated IRQ vectors:
|
|
772
|
+
// $0040 vblank IRQ
|
|
773
|
+
// $0048 lcd-stat IRQ
|
|
774
|
+
// $0050 timer IRQ
|
|
775
|
+
// $0058 serial IRQ
|
|
776
|
+
// $0060 joypad IRQ
|
|
777
|
+
// $0100 entry point (cart code starts here after Nintendo logo)
|
|
778
|
+
// $0104-$0133 logo bytes (NOT code — auto-skip if window includes them)
|
|
779
|
+
const gbVectors = {
|
|
780
|
+
reset: 0x0000,
|
|
781
|
+
rst08: 0x0008, rst10: 0x0010, rst18: 0x0018,
|
|
782
|
+
rst20: 0x0020, rst28: 0x0028, rst30: 0x0030, rst38: 0x0038,
|
|
783
|
+
vblank: 0x0040,
|
|
784
|
+
lcd_stat: 0x0048,
|
|
785
|
+
timer: 0x0050,
|
|
786
|
+
serial: 0x0058,
|
|
787
|
+
joypad: 0x0060,
|
|
788
|
+
entry: 0x0100,
|
|
789
|
+
};
|
|
790
|
+
for (const [name, addr] of Object.entries(gbVectors)) {
|
|
791
|
+
if (addr >= startAddress && addr <= startAddress + length - 1) {
|
|
792
|
+
labels.push({ name, addr });
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
if (autoLabelVectors && cpuFamily === "m68k") {
|
|
797
|
+
// Genesis 68000 vector table at $000000-$0000FF. The useful ones:
|
|
798
|
+
// $000000 initial SP, $000004 reset PC, $000060 HBL, $000070 VBL.
|
|
799
|
+
// (The full table is 64 long-word vectors; these are the ones game
|
|
800
|
+
// code reaches.) Read the targets from the ROM image and label any
|
|
801
|
+
// that fall inside the disassembly window.
|
|
802
|
+
const vec = (off) => (data[off] << 24 | data[off + 1] << 16 | data[off + 2] << 8 | data[off + 3]) >>> 0;
|
|
803
|
+
const genVectors = {
|
|
804
|
+
reset: vec(0x04),
|
|
805
|
+
hbl: vec(0x70), // level-4 autovector (H-blank)
|
|
806
|
+
vbl: vec(0x78), // level-6 autovector (V-blank)
|
|
807
|
+
};
|
|
808
|
+
for (const [name, t] of Object.entries(genVectors)) {
|
|
809
|
+
if (t >= startAddress && t <= startAddress + length - 1) labels.push({ name, addr: t });
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
const dataRangesInWindow = (dataRanges ?? []).filter((r) => {
|
|
813
|
+
return r.start + r.length - 1 >= startAddress && r.start <= startAddress + length - 1;
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
let asm;
|
|
817
|
+
let exitCode = 0;
|
|
818
|
+
if (cpuFamily === "m68k") {
|
|
819
|
+
const { runM68kdasm } = await import("../../toolchains/m68kdasm.js");
|
|
820
|
+
const r = runM68kdasm({ bytes: mapped.bytes, startAddress });
|
|
821
|
+
asm = r.asm;
|
|
822
|
+
exitCode = r.exitCode;
|
|
823
|
+
if (labels.length > 0) asm = injectVectorLabels(asm, labels);
|
|
824
|
+
} else if (cpuFamily === "z80") {
|
|
825
|
+
const { runZ80dasm } = await import("../../toolchains/z80dasm.js");
|
|
826
|
+
const r = runZ80dasm({ bytes: mapped.bytes, startAddress });
|
|
827
|
+
asm = r.asm;
|
|
828
|
+
exitCode = r.exitCode;
|
|
829
|
+
if (labels.length > 0) {
|
|
830
|
+
asm = injectVectorLabels(asm, labels);
|
|
831
|
+
}
|
|
832
|
+
} else if (cpuFamily === "sm83") {
|
|
833
|
+
const { runSm83dasm } = await import("../../toolchains/sm83dasm.js");
|
|
834
|
+
const r = runSm83dasm({ bytes: mapped.bytes, startAddress });
|
|
835
|
+
asm = r.asm;
|
|
836
|
+
exitCode = r.exitCode;
|
|
837
|
+
if (labels.length > 0) {
|
|
838
|
+
asm = injectVectorLabels(asm, labels);
|
|
839
|
+
}
|
|
840
|
+
} else {
|
|
841
|
+
if (labels.length > 0 || dataRangesInWindow.length > 0 || mapped.cpu !== "6502") {
|
|
842
|
+
info = buildInfoFile({
|
|
843
|
+
startAddress, length,
|
|
844
|
+
cpu: mapped.cpu,
|
|
845
|
+
labels,
|
|
846
|
+
dataRanges: dataRangesInWindow,
|
|
847
|
+
});
|
|
848
|
+
}
|
|
849
|
+
const needAddressColumn = annotateRegistersFlag || annotateFileOffsetsFlag;
|
|
850
|
+
const r = await runDa65({
|
|
851
|
+
bytes: mapped.bytes, startAddress, cpu: mapped.cpu, info,
|
|
852
|
+
options: needAddressColumn ? ["--comments", "4"] : [],
|
|
853
|
+
});
|
|
854
|
+
asm = r.asm;
|
|
855
|
+
exitCode = r.exitCode;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// File-offset annotation: per-line cpu→file translator.
|
|
859
|
+
if (annotateFileOffsetsFlag) {
|
|
860
|
+
const cpuToFile = (cpuAddr) => {
|
|
861
|
+
try {
|
|
862
|
+
if (resolved === "snes") return mapSnesAddress(data, cpuAddr, 1, mapper).fileOffset;
|
|
863
|
+
if (resolved === "sms" || resolved === "gg") return mapSmsAddress(data, cpuAddr, 1).fileOffset;
|
|
864
|
+
if (resolved === "gb" || resolved === "gbc") return mapGbAddress(data, cpuAddr, 1, args.bank).fileOffset;
|
|
865
|
+
if (resolved === "atari2600") return mapAtari2600Address(data, cpuAddr, 1, args.bank ?? 0).fileOffset;
|
|
866
|
+
if (resolved === "atari7800") return mapAtari7800Address(data, cpuAddr, 1, args.bank ?? 0).fileOffset;
|
|
867
|
+
if (resolved === "c64") return mapC64Address(data, cpuAddr, 1, args.bank ?? 0).fileOffset;
|
|
868
|
+
if (resolved === "genesis") return mapGenesisAddress(data, cpuAddr, 1).fileOffset;
|
|
869
|
+
return mapNesAddress(data, cpuAddr, 1).fileOffset;
|
|
870
|
+
} catch {
|
|
871
|
+
return null;
|
|
872
|
+
}
|
|
873
|
+
};
|
|
874
|
+
// Secondary translator for NES — also report the header-stripped
|
|
875
|
+
// PRG offset, since patchFile against `prg.bin` (from extractCart)
|
|
876
|
+
// needs the header-less frame.
|
|
877
|
+
let secondaryCpuToFile;
|
|
878
|
+
if (resolved === "nes") {
|
|
879
|
+
secondaryCpuToFile = (cpuAddr) => {
|
|
880
|
+
try {
|
|
881
|
+
const off = mapNesAddress(data, cpuAddr, 1).fileOffset;
|
|
882
|
+
if (off == null) return null;
|
|
883
|
+
return off - 16; // strip iNES header
|
|
884
|
+
} catch {
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
}
|
|
889
|
+
asm = annotateFileOffsets(asm, cpuToFile, secondaryCpuToFile);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
if (annotateRegistersFlag) {
|
|
893
|
+
const regs = registersForPlatform(resolved);
|
|
894
|
+
asm = annotateRegisters(asm, regs);
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
// Truncate at first return (after annotations so we get the same line
|
|
898
|
+
// count we wrote out).
|
|
899
|
+
let truncatedAtReturn = false;
|
|
900
|
+
if (untilReturn) {
|
|
901
|
+
const cutAt = findFirstReturnLine(asm, cpuFamily);
|
|
902
|
+
if (cutAt > 0) {
|
|
903
|
+
asm = asm.split(/\r?\n/).slice(0, cutAt).join("\n") + "\n";
|
|
904
|
+
truncatedAtReturn = true;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
const baseResult = {
|
|
909
|
+
exitCode,
|
|
910
|
+
path: romPath,
|
|
911
|
+
platform: resolved,
|
|
912
|
+
startAddress,
|
|
913
|
+
length: mapped.bytes.length,
|
|
914
|
+
fileOffset: mapped.fileOffset,
|
|
915
|
+
cpu: mapped.cpu,
|
|
916
|
+
note: mapped.note,
|
|
917
|
+
labels: labels.length > 0 ? labels.map((l) => ({ name: l.name, addr: "$" + l.addr.toString(16).toUpperCase() })) : undefined,
|
|
918
|
+
dataRanges: dataRangesInWindow.length > 0 ? dataRangesInWindow : undefined,
|
|
919
|
+
truncatedAtReturn: truncatedAtReturn || undefined,
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
if (outputPath) {
|
|
923
|
+
await writeFile(outputPath, asm);
|
|
924
|
+
return jsonContent({
|
|
925
|
+
...baseResult,
|
|
926
|
+
outputPath,
|
|
927
|
+
asmBytes: asm.length,
|
|
928
|
+
asmLines: asm.split(/\r?\n/).length - 1,
|
|
929
|
+
hint: `${asm.length} bytes of asm written to ${outputPath}. Read it directly with your file tools.`,
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
return jsonContent({ ...baseResult, asm });
|
|
934
|
+
}),
|
|
935
|
+
);
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
/**
|
|
939
|
+
* Synthesize a da65 info file with vector labels + data ranges in addition
|
|
940
|
+
* to non-overlapping Code RANGEs so the whole window is decoded as code
|
|
941
|
+
* except where the agent marked data.
|
|
942
|
+
*
|
|
943
|
+
* da65 errors with "Duplicate style for address ..." if any byte is covered
|
|
944
|
+
* by two RANGEs — so we partition [startAddress, endAddress] into Code
|
|
945
|
+
* gaps around the data ranges, rather than declaring one big Code RANGE
|
|
946
|
+
* with data RANGEs on top.
|
|
947
|
+
*/
|
|
948
|
+
function buildInfoFile({ startAddress, length, cpu, labels, dataRanges }) {
|
|
949
|
+
const lo = (n) => "$" + (n & 0xFFFF).toString(16).toUpperCase();
|
|
950
|
+
const endAddress = startAddress + length - 1;
|
|
951
|
+
const lines = [];
|
|
952
|
+
|
|
953
|
+
// Sort + clip data ranges to window.
|
|
954
|
+
const drs = dataRanges
|
|
955
|
+
.map((r) => ({ start: Math.max(r.start, startAddress), end: Math.min(r.start + r.length - 1, endAddress) }))
|
|
956
|
+
.filter((r) => r.start <= r.end)
|
|
957
|
+
.sort((a, b) => a.start - b.start);
|
|
958
|
+
|
|
959
|
+
// Emit alternating Code / ByteTable ranges.
|
|
960
|
+
const isHighCpu = cpu === "65816";
|
|
961
|
+
const codeRange = (s, e) => isHighCpu
|
|
962
|
+
? `RANGE { START ${lo(s)}; END ${lo(e)}; TYPE Code; ADDRMODE "MX"; };`
|
|
963
|
+
: `RANGE { START ${lo(s)}; END ${lo(e)}; TYPE Code; };`;
|
|
964
|
+
const dataRange = (s, e) =>
|
|
965
|
+
`RANGE { START ${lo(s)}; END ${lo(e)}; TYPE ByteTable; };`;
|
|
966
|
+
|
|
967
|
+
let cursor = startAddress;
|
|
968
|
+
for (const dr of drs) {
|
|
969
|
+
if (cursor < dr.start) lines.push(codeRange(cursor, dr.start - 1));
|
|
970
|
+
lines.push(dataRange(dr.start, dr.end));
|
|
971
|
+
cursor = dr.end + 1;
|
|
972
|
+
}
|
|
973
|
+
if (cursor <= endAddress) lines.push(codeRange(cursor, endAddress));
|
|
974
|
+
|
|
975
|
+
for (const lab of labels) {
|
|
976
|
+
if (lab.addr > 0xFFFF) continue;
|
|
977
|
+
lines.push(`LABEL { NAME "${lab.name}"; ADDR ${lo(lab.addr)}; };`);
|
|
978
|
+
}
|
|
979
|
+
return lines.join("\n") + "\n";
|
|
980
|
+
}
|