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,279 @@
|
|
|
1
|
+
// Per-platform meta-sprite adapters. Each builds the uniform adapter the
|
|
2
|
+
// generic core (metasprite-core.js) consumes, from a live host (capture) or
|
|
3
|
+
// from saved bytes (re-render). See metasprite-core.js header for the shape.
|
|
4
|
+
//
|
|
5
|
+
// The two platform-specific axes that matter:
|
|
6
|
+
// - tile bit-depth + byte layout (for encode/decode of tiles.bin)
|
|
7
|
+
// - multi-cell tile order: Genesis is COLUMN-MAJOR (tile++ goes down a
|
|
8
|
+
// column); SNES large OBJ + NES 8x16 + SMS-stacked are their own orders;
|
|
9
|
+
// everything else is single-cell (8x8) so order is trivial.
|
|
10
|
+
|
|
11
|
+
// ---------- cell-order helpers ----------
|
|
12
|
+
// columnMajor: cell (col,row) → tile offset = col*hTiles + row (Genesis)
|
|
13
|
+
function colMajorOrder(w, h) { const o = []; for (let c = 0; c < w; c++) for (let r = 0; r < h; r++) o.push(c * h + r); return o; }
|
|
14
|
+
function colMajorPos(w, h) { const p = []; for (let c = 0; c < w; c++) for (let r = 0; r < h; r++) p.push({ col: c, row: r }); return p; }
|
|
15
|
+
// rowMajor: tile offset = row*wTiles + col
|
|
16
|
+
function rowMajorOrder(w, h) { const o = []; for (let r = 0; r < h; r++) for (let c = 0; c < w; c++) o.push(r * w + c); return o; }
|
|
17
|
+
function rowMajorPos(w, h) { const p = []; for (let r = 0; r < h; r++) for (let c = 0; c < w; c++) p.push({ col: c, row: r }); return p; }
|
|
18
|
+
|
|
19
|
+
// ---------- generic tile encoders (export 8x8 index grids → native bytes) ----------
|
|
20
|
+
function encode2bppPlanar(grids) { // NES: plane0 (8 bytes) then plane1 (8 bytes)
|
|
21
|
+
const out = new Uint8Array(grids.length * 16);
|
|
22
|
+
grids.forEach((g, t) => {
|
|
23
|
+
for (let y = 0; y < 8; y++) {
|
|
24
|
+
let p0 = 0, p1 = 0;
|
|
25
|
+
for (let x = 0; x < 8; x++) { const v = g[y][x]; if (v & 1) p0 |= 1 << (7 - x); if (v & 2) p1 |= 1 << (7 - x); }
|
|
26
|
+
out[t * 16 + y] = p0; out[t * 16 + 8 + y] = p1;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
function encode2bppInterleaved(grids) { // GB: per row [lo,hi]
|
|
32
|
+
const out = new Uint8Array(grids.length * 16);
|
|
33
|
+
grids.forEach((g, t) => {
|
|
34
|
+
for (let y = 0; y < 8; y++) {
|
|
35
|
+
let lo = 0, hi = 0;
|
|
36
|
+
for (let x = 0; x < 8; x++) { const v = g[y][x]; if (v & 1) lo |= 1 << (7 - x); if (v & 2) hi |= 1 << (7 - x); }
|
|
37
|
+
out[t * 16 + y * 2] = lo; out[t * 16 + y * 2 + 1] = hi;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
function encode4bppGenesis(grids) { // packed: high nibble = left pixel
|
|
43
|
+
const out = new Uint8Array(grids.length * 32);
|
|
44
|
+
grids.forEach((g, t) => {
|
|
45
|
+
for (let y = 0; y < 8; y++) for (let half = 0; half < 4; half++)
|
|
46
|
+
out[t * 32 + y * 4 + half] = ((g[y][half * 2] & 0xF) << 4) | (g[y][half * 2 + 1] & 0xF);
|
|
47
|
+
});
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
function encode4bppSms(grids) { // interleaved per row [p0,p1,p2,p3]
|
|
51
|
+
const out = new Uint8Array(grids.length * 32);
|
|
52
|
+
grids.forEach((g, t) => {
|
|
53
|
+
for (let y = 0; y < 8; y++) {
|
|
54
|
+
let p0 = 0, p1 = 0, p2 = 0, p3 = 0;
|
|
55
|
+
for (let x = 0; x < 8; x++) { const v = g[y][x], b = 7 - x; if (v & 1) p0 |= 1 << b; if (v & 2) p1 |= 1 << b; if (v & 4) p2 |= 1 << b; if (v & 8) p3 |= 1 << b; }
|
|
56
|
+
out[t * 32 + y * 4] = p0; out[t * 32 + y * 4 + 1] = p1; out[t * 32 + y * 4 + 2] = p2; out[t * 32 + y * 4 + 3] = p3;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
function encode4bppSnes(grids) { // planar-pairs: bytes 0-15 planes0&1, 16-31 planes2&3
|
|
62
|
+
const out = new Uint8Array(grids.length * 32);
|
|
63
|
+
grids.forEach((g, t) => {
|
|
64
|
+
for (let y = 0; y < 8; y++) {
|
|
65
|
+
let p0 = 0, p1 = 0, p2 = 0, p3 = 0;
|
|
66
|
+
for (let x = 0; x < 8; x++) { const v = g[y][x], b = 7 - x; if (v & 1) p0 |= 1 << b; if (v & 2) p1 |= 1 << b; if (v & 4) p2 |= 1 << b; if (v & 8) p3 |= 1 << b; }
|
|
67
|
+
out[t * 32 + y * 2] = p0; out[t * 32 + y * 2 + 1] = p1;
|
|
68
|
+
out[t * 32 + 16 + y * 2] = p2; out[t * 32 + 16 + y * 2 + 1] = p3;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// =====================================================================
|
|
75
|
+
// GENESIS
|
|
76
|
+
// =====================================================================
|
|
77
|
+
export async function genesisAdapter(host) {
|
|
78
|
+
const { decode4bppTile, decodeGenesisSubpalette } = await import("../genesis/vdp.js");
|
|
79
|
+
const { decodeGenesisSprites } = await import("../../host/gpgx-state.js");
|
|
80
|
+
const vram = host.readMemory("video_ram", 0, 0x10000);
|
|
81
|
+
const cram = host.readMemory("genesis_cram", 0, 128);
|
|
82
|
+
const regs = host.readMemory("genesis_vdp_regs", 0, 32);
|
|
83
|
+
const raw = decodeGenesisSprites(vram, regs);
|
|
84
|
+
return {
|
|
85
|
+
platform: "genesis", bpp: 4, screenW: 320, screenH: 224, tileColumnMajor: true,
|
|
86
|
+
sprites: raw.map((s) => ({ slot: s.slot, x: s.x, y: s.y, wTiles: s.size.w / 8, hTiles: s.size.h / 8, tile: s.tile, palette: s.palette, flipH: s.flipH, flipV: s.flipV, priority: s.priority, visible: s.visible })),
|
|
87
|
+
cellTileOrder: colMajorOrder, cellGridPositions: colMajorPos,
|
|
88
|
+
getTilePixels: (idx) => decode4bppTile(vram.subarray((idx & 0x7FF) * 32, (idx & 0x7FF) * 32 + 32)),
|
|
89
|
+
getPaletteRgb: (p) => decodeGenesisSubpalette(cram, p),
|
|
90
|
+
exportPalette: () => ({ bytes: Uint8Array.from(cram), json: paletteLinesJson(cram, 4, 16, (i) => decodeGenesisSubpalette(cram, i)) }),
|
|
91
|
+
encodeTiles: encode4bppGenesis,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// =====================================================================
|
|
96
|
+
// SNES — large OBJ are row-major in a wTiles×hTiles grid; tile index is
|
|
97
|
+
// +1 across, +0x10 down (16-wide OBJ name table). We export contiguously.
|
|
98
|
+
// =====================================================================
|
|
99
|
+
export async function snesAdapter(host) {
|
|
100
|
+
const { decodeOAM, decodeSnesTile, decodeCGRAM, decodePpuRegs, ppuRegsPopulated } =
|
|
101
|
+
await import("../snes/ppu.js");
|
|
102
|
+
const vram = host.readMemory("video_ram", 0, 0x10000);
|
|
103
|
+
const cgram = host.readMemory("snes_cgram", 0, 512);
|
|
104
|
+
const oam = host.readMemory("snes_oam", 0, 544);
|
|
105
|
+
const fillram = host.readMemory("snes_fillram", 0, 0x8000);
|
|
106
|
+
const colors = decodeCGRAM(cgram); // 256 entries
|
|
107
|
+
// Live OBSEL → correct OBJ size pair so wTiles/hTiles are right (a 16×16
|
|
108
|
+
// OBJ must capture as 2×2 tiles, not 1×1).
|
|
109
|
+
const ppu = ppuRegsPopulated(fillram) ? decodePpuRegs(fillram) : null;
|
|
110
|
+
const raw = decodeOAM(oam, ppu ? {
|
|
111
|
+
smallSize: ppu.objSize.small, largeSize: ppu.objSize.large,
|
|
112
|
+
objNameBaseByte: ppu.objNameBaseByte, objGapByte: ppu.objGapByte,
|
|
113
|
+
} : {});
|
|
114
|
+
// SNES OBJ palettes are CGRAM 128-255, 16 colors each (8 lines). palette
|
|
115
|
+
// field is 0-7 → base = 128 + p*16.
|
|
116
|
+
const palRgb = (p) => { const base = 128 + (p & 7) * 16; return colors.slice(base, base + 16).map((c) => [c.r, c.g, c.b]); };
|
|
117
|
+
// Large-OBJ tile layout: within a wTiles×hTiles sprite, tile index goes
|
|
118
|
+
// +1 per column and +0x10 per row (OBJ char table is 16 tiles wide).
|
|
119
|
+
const orderFn = (w, h) => { const o = []; for (let r = 0; r < h; r++) for (let c = 0; c < w; c++) o.push(r * 0x10 + c); return o; };
|
|
120
|
+
return {
|
|
121
|
+
platform: "snes", bpp: 4, screenW: 256, screenH: 224, tileColumnMajor: false,
|
|
122
|
+
sprites: raw.map((s) => ({ slot: s.slot, x: s.x, y: s.y, wTiles: s.size.w / 8, hTiles: s.size.h / 8, tile: s.tile, palette: s.palette, flipH: s.flipH, flipV: s.flipV, priority: s.priority, visible: s.visible })),
|
|
123
|
+
cellTileOrder: orderFn, cellGridPositions: rowMajorPos,
|
|
124
|
+
getTilePixels: (idx) => { const off = ((idx & 0x1FF) * 32) & 0xFFFF; return decodeSnesTile(vram.subarray(off, off + 32), 4); },
|
|
125
|
+
getPaletteRgb: palRgb,
|
|
126
|
+
exportPalette: () => ({ bytes: Uint8Array.from(cgram), json: paletteLinesJson(cgram, 8, 16, (i) => palRgb(i), 128) }),
|
|
127
|
+
encodeTiles: encode4bppSnes,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// =====================================================================
|
|
132
|
+
// NES — 8x8 (1 tile) or 8x16 (2 tiles stacked, top then bottom).
|
|
133
|
+
// =====================================================================
|
|
134
|
+
export async function nesAdapter(host) {
|
|
135
|
+
const { decodeTile } = await import("../nes/ppu.js");
|
|
136
|
+
const oam = host.readMemory("nes_oam", 0, 256);
|
|
137
|
+
const chr = host.readMemory("nes_chr", 0, 0x2000); // 8KB pattern space
|
|
138
|
+
const palBytes = host.readMemory("nes_palette", 0, 32);
|
|
139
|
+
const ppu = host.readMemory("nes_ppu_regs", 0, 4);
|
|
140
|
+
const spr8x16 = !!(ppu[0] & 0x20);
|
|
141
|
+
// NES sprite palettes are entries 16..31 (4 lines of 4). palette field 0-3.
|
|
142
|
+
const NES_RGB = nesMasterRgb();
|
|
143
|
+
const palRgb = (p) => { const out = [[0, 0, 0]]; for (let i = 1; i < 4; i++) out.push(NES_RGB[palBytes[16 + p * 4 + i] & 0x3F]); return out; };
|
|
144
|
+
const sprites = [];
|
|
145
|
+
for (let i = 0; i < 64; i++) {
|
|
146
|
+
const y = oam[i * 4], tile = oam[i * 4 + 1], attr = oam[i * 4 + 2], x = oam[i * 4 + 3];
|
|
147
|
+
sprites.push({
|
|
148
|
+
slot: i, x, y, wTiles: 1, hTiles: spr8x16 ? 2 : 1,
|
|
149
|
+
tile: spr8x16 ? (tile & 0xFE) : tile, // 8x16: bit0 selects pattern table, even tile is top
|
|
150
|
+
palette: attr & 3, flipH: !!(attr & 0x40), flipV: !!(attr & 0x80), priority: (attr >> 5) & 1,
|
|
151
|
+
visible: y < 0xEF,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
platform: "nes", bpp: 2, screenW: 256, screenH: 240, tileColumnMajor: false,
|
|
156
|
+
sprites,
|
|
157
|
+
cellTileOrder: (w, h) => rowMajorOrder(w, h), // 8x16 → [0,1] = top,bottom
|
|
158
|
+
cellGridPositions: rowMajorPos,
|
|
159
|
+
getTilePixels: (idx) => flatToGrid(decodeTile(chr.subarray((idx & 0x1FF) * 16, (idx & 0x1FF) * 16 + 16))),
|
|
160
|
+
getPaletteRgb: palRgb,
|
|
161
|
+
exportPalette: () => ({ bytes: Uint8Array.from(palBytes), json: { "sprite0": palRgb(0).map(rgbHex), "sprite1": palRgb(1).map(rgbHex), "sprite2": palRgb(2).map(rgbHex), "sprite3": palRgb(3).map(rgbHex) } }),
|
|
162
|
+
encodeTiles: encode2bppPlanar,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// =====================================================================
|
|
167
|
+
// GB / GBC — 8x8 or 8x16 (top tile = idx&0xFE, bottom = idx|1).
|
|
168
|
+
// =====================================================================
|
|
169
|
+
export async function gbAdapter(host, platform) {
|
|
170
|
+
const { decodeGbTile } = await import("../gb/ppu.js");
|
|
171
|
+
const oam = host.readMemory("gb_oam", 0, 0xA0);
|
|
172
|
+
const vram = host.readMemory("gb_vram", 0, 0x2000);
|
|
173
|
+
const io = host.readMemory("gb_io", 0, 0x80);
|
|
174
|
+
const obj8x16 = !!(io[0x40] & 0x04);
|
|
175
|
+
// DMG OBJ palettes OBP0 ($FF48) / OBP1 ($FF49): 4 shades. CGB has OBJ
|
|
176
|
+
// palette RAM but we keep it simple: DMG grayscale by palette bits.
|
|
177
|
+
const DMG = [[224,248,208],[136,192,112],[52,104,86],[8,24,32]];
|
|
178
|
+
const obp = [io[0x48], io[0x49]];
|
|
179
|
+
const palRgb = (p) => { const reg = obp[p & 1]; const out = []; for (let i = 0; i < 4; i++) out.push(DMG[(reg >> (i * 2)) & 3]); return out; };
|
|
180
|
+
const sprites = [];
|
|
181
|
+
for (let i = 0; i < 40; i++) {
|
|
182
|
+
const y = oam[i * 4] - 16, x = oam[i * 4 + 1] - 8, t = oam[i * 4 + 2], a = oam[i * 4 + 3];
|
|
183
|
+
sprites.push({
|
|
184
|
+
slot: i, x, y, wTiles: 1, hTiles: obj8x16 ? 2 : 1,
|
|
185
|
+
tile: obj8x16 ? (t & 0xFE) : t,
|
|
186
|
+
palette: (a >> 4) & 1, flipH: !!(a & 0x20), flipV: !!(a & 0x40), priority: (a >> 7) & 1,
|
|
187
|
+
visible: oam[i * 4] !== 0 && oam[i * 4] < 160,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
platform, bpp: 2, screenW: 160, screenH: 144, tileColumnMajor: false,
|
|
192
|
+
sprites,
|
|
193
|
+
cellTileOrder: rowMajorOrder, cellGridPositions: rowMajorPos,
|
|
194
|
+
getTilePixels: (idx) => flatToGrid(decodeGbTile(vram, (idx & 0xFF) * 16)),
|
|
195
|
+
getPaletteRgb: palRgb,
|
|
196
|
+
exportPalette: () => ({ bytes: Uint8Array.from([obp[0], obp[1]]), json: { "obp0": palRgb(0).map(rgbHex), "obp1": palRgb(1).map(rgbHex) } }),
|
|
197
|
+
encodeTiles: encode2bppInterleaved,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// =====================================================================
|
|
202
|
+
// SMS / GG — 8x8 sprites (8x16 stacked when reg1 bit1 set). One sprite
|
|
203
|
+
// palette line (CRAM entries 16-31). Tile data base from VDP reg 6.
|
|
204
|
+
// =====================================================================
|
|
205
|
+
export async function smsAdapter(host, platform) {
|
|
206
|
+
const { decodeSmsTile, decodeSmsVdpRegs, decodeSmsCram, decodeGgCram, snapshotPalette } = await import("../sms/vdp.js");
|
|
207
|
+
const vramRegion = platform === "gg" ? "gg_vram" : "sms_vram";
|
|
208
|
+
const vram = host.readMemory(vramRegion, 0, 0x4000);
|
|
209
|
+
const regs = host.readMemory("sms_vdp_regs", 0, 16);
|
|
210
|
+
const dec = decodeSmsVdpRegs(regs);
|
|
211
|
+
const { colors } = snapshotPalette(host, platform); // 32 entries
|
|
212
|
+
const sprPal = colors.slice(16, 32).map((c) => [c.r, c.g, c.b]);
|
|
213
|
+
const palRgb = () => sprPal;
|
|
214
|
+
const big = dec.mode2.spriteSize8x16;
|
|
215
|
+
const base = dec.spriteTileDataBaseDec;
|
|
216
|
+
const sat = vram.slice(dec.spriteAttrTableBaseDec, dec.spriteAttrTableBaseDec + 256);
|
|
217
|
+
const sprites = [];
|
|
218
|
+
for (let i = 0; i < 64; i++) {
|
|
219
|
+
const y = sat[i];
|
|
220
|
+
if (y === 0xD0) break; // terminator
|
|
221
|
+
const x = sat[0x80 + i * 2], tile = sat[0x80 + i * 2 + 1];
|
|
222
|
+
sprites.push({
|
|
223
|
+
slot: i, x, y: (y + 1) & 0xFF, wTiles: 1, hTiles: big ? 2 : 1,
|
|
224
|
+
tile: big ? (tile & 0xFE) : tile, palette: 0, flipH: false, flipV: false, priority: 0,
|
|
225
|
+
visible: true,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
platform, bpp: 4, screenW: platform === "gg" ? 160 : 256, screenH: platform === "gg" ? 144 : 192, tileColumnMajor: false,
|
|
230
|
+
sprites,
|
|
231
|
+
cellTileOrder: rowMajorOrder, cellGridPositions: rowMajorPos,
|
|
232
|
+
getTilePixels: (idx) => { const out = decodeSmsTile(vram, base + (idx & 0x1FF) * 32); const g = []; for (let y = 0; y < 8; y++) g.push(Array.from(out.slice(y * 8, y * 8 + 8))); return g; },
|
|
233
|
+
getPaletteRgb: palRgb,
|
|
234
|
+
exportPalette: () => { const cram = host.readMemory(platform === "gg" ? "gg_cram" : "sms_cram", 0, platform === "gg" ? 64 : 32); return { bytes: Uint8Array.from(cram), json: { "sprite": sprPal.map(rgbHex) } }; },
|
|
235
|
+
encodeTiles: encode4bppSms,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ---------- shared helpers ----------
|
|
240
|
+
// Some platform tile decoders return a flat Uint8Array(64); the core wants
|
|
241
|
+
// an 8x8 nested array of indices.
|
|
242
|
+
function flatToGrid(flat) { const g = []; for (let y = 0; y < 8; y++) { const row = []; for (let x = 0; x < 8; x++) row.push(flat[y * 8 + x]); g.push(row); } return g; }
|
|
243
|
+
function rgbHex(rgb) { return "#" + [rgb[0], rgb[1], rgb[2]].map((v) => (v & 0xFF).toString(16).padStart(2, "0")).join(""); }
|
|
244
|
+
function paletteLinesJson(cram, lines, perLine, lineRgbFn) {
|
|
245
|
+
const json = {};
|
|
246
|
+
for (let i = 0; i < lines; i++) json[String(i)] = lineRgbFn(i).map(rgbHex);
|
|
247
|
+
return json;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// NES 2C02 master palette (sample — matches sprite-pipeline's NES_MASTER).
|
|
251
|
+
function nesMasterRgb() {
|
|
252
|
+
// 64-entry approximation; index by the palette byte & 0x3F.
|
|
253
|
+
const P = [
|
|
254
|
+
[0x60,0x60,0x60],[0x00,0x20,0x80],[0x00,0x00,0xA0],[0x40,0x00,0x90],[0x80,0x00,0x60],[0xA0,0x00,0x30],[0xA0,0x00,0x00],[0x80,0x20,0x00],
|
|
255
|
+
[0x60,0x40,0x00],[0x20,0x60,0x00],[0x00,0x80,0x00],[0x00,0x60,0x30],[0x00,0x40,0x60],[0,0,0],[0,0,0],[0,0,0],
|
|
256
|
+
[0xA0,0xA0,0xA0],[0x00,0x60,0xC0],[0x20,0x40,0xE0],[0x80,0x00,0xF0],[0xC0,0x00,0xC0],[0xE0,0x00,0x60],[0xF0,0x20,0x00],[0xC0,0x60,0x00],
|
|
257
|
+
[0x80,0x80,0x00],[0x40,0xA0,0x00],[0x00,0xC0,0x00],[0x20,0xA0,0x60],[0x00,0x80,0xA0],[0,0,0],[0,0,0],[0,0,0],
|
|
258
|
+
[0xF0,0xF0,0xF0],[0x60,0xA0,0xF0],[0x80,0x80,0xF0],[0xC0,0x60,0xF0],[0xF0,0x40,0xF0],[0xF0,0x60,0xA0],[0xF0,0x80,0x60],[0xE0,0xA0,0x40],
|
|
259
|
+
[0xC0,0xC0,0x20],[0x80,0xE0,0x40],[0x40,0xE0,0x80],[0x40,0xE0,0xC0],[0x00,0xE0,0xE0],[0x60,0x60,0x60],[0,0,0],[0,0,0],
|
|
260
|
+
[0xF0,0xF0,0xF0],[0xA0,0xD0,0xF0],[0xC0,0xC0,0xF0],[0xE0,0xC0,0xF0],[0xF0,0xC0,0xF0],[0xF0,0xC0,0xE0],[0xF0,0xC0,0xC0],[0xF0,0xD0,0xA0],
|
|
261
|
+
[0xE0,0xE0,0x80],[0xC0,0xE0,0x80],[0xA0,0xF0,0xA0],[0xA0,0xF0,0xC0],[0xA0,0xF0,0xE0],[0xA0,0xA0,0xA0],[0,0,0],[0,0,0],
|
|
262
|
+
];
|
|
263
|
+
return P;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** Build the right adapter for a platform from a live host. */
|
|
267
|
+
export async function buildAdapter(host, platform) {
|
|
268
|
+
switch (platform) {
|
|
269
|
+
case "genesis": return genesisAdapter(host);
|
|
270
|
+
case "snes": return snesAdapter(host);
|
|
271
|
+
case "nes": return nesAdapter(host);
|
|
272
|
+
case "gb": case "gbc": return gbAdapter(host, platform);
|
|
273
|
+
case "sms": case "gg": return smsAdapter(host, platform);
|
|
274
|
+
case "c64":
|
|
275
|
+
throw new Error("captureMetaSprite[c64]: the C64 has 8 hardware MOBs (24×21px bitmaps, not 8x8 tiles) — they don't fit the tile-based meta-sprite model. Use inspectSprites + the sprite data pointers, and author MOB bitmaps directly.");
|
|
276
|
+
default:
|
|
277
|
+
throw new Error(`captureMetaSprite: no meta-sprite adapter for platform '${platform}'. Supported: genesis, snes, nes, gb, gbc, sms, gg.`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// Platform-aware C codegen for captured meta-sprites. Emits the tile/
|
|
2
|
+
// palette/piece arrays plus a draw helper idiomatic to each platform's
|
|
3
|
+
// sprite hardware. No platform name in the public API — the layout's
|
|
4
|
+
// `platform` field selects the right emitter.
|
|
5
|
+
|
|
6
|
+
function ident(s) { return (s || "metasprite").replace(/[^A-Za-z0-9_]/g, "_"); }
|
|
7
|
+
|
|
8
|
+
function tilesU8Array(name, tiles) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
for (let i = 0; i < tiles.length; i += 16) {
|
|
11
|
+
lines.push(" " + Array.from(tiles.slice(i, i + 16), (b) => "0x" + b.toString(16).toUpperCase().padStart(2, "0")).join(", ") + ",");
|
|
12
|
+
}
|
|
13
|
+
return `const unsigned char ${name}_tiles[${tiles.length}] = {\n${lines.join("\n")}\n};`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Emit C for a captured meta-sprite. Dispatches on layout.platform.
|
|
18
|
+
* @param {object} args { layout, tiles, palette, varName? }
|
|
19
|
+
* @returns {string}
|
|
20
|
+
*/
|
|
21
|
+
export function emitMetaSpriteCode({ layout, tiles, palette, varName }) {
|
|
22
|
+
const v = ident(varName || layout.name);
|
|
23
|
+
switch (layout.platform) {
|
|
24
|
+
case "genesis": return emitGenesis(v, layout, tiles, palette);
|
|
25
|
+
case "snes": return emitSnes(v, layout, tiles, palette);
|
|
26
|
+
case "nes": return emitNes(v, layout, tiles, palette);
|
|
27
|
+
case "gb": case "gbc": return emitGb(v, layout, tiles, palette);
|
|
28
|
+
case "sms": case "gg": return emitSms(v, layout, tiles, palette, layout.platform);
|
|
29
|
+
default: return emitGeneric(v, layout, tiles, palette);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ---- Genesis (SGDK) ----
|
|
34
|
+
function emitGenesis(v, layout, tiles, palette) {
|
|
35
|
+
const u32s = [];
|
|
36
|
+
for (let i = 0; i < tiles.length; i += 4)
|
|
37
|
+
u32s.push("0x" + (((tiles[i] << 24) | (tiles[i + 1] << 16) | (tiles[i + 2] << 8) | tiles[i + 3]) >>> 0).toString(16).toUpperCase().padStart(8, "0"));
|
|
38
|
+
const usedLines = Object.keys(layout.palettes).map(Number).filter((n) => !isNaN(n)).sort();
|
|
39
|
+
const firstLine = usedLines[0] ?? 0;
|
|
40
|
+
const palWords = [];
|
|
41
|
+
for (let i = 0; i < 16; i++) { const off = (firstLine * 16 + i) * 2; palWords.push("0x" + (((palette[off] << 8) | palette[off + 1]) & 0xFFFF).toString(16).toUpperCase().padStart(4, "0")); }
|
|
42
|
+
const pieces = layout.pieces.map((p) => {
|
|
43
|
+
const attr = ((p.priority ? 1 : 0) << 15) | ((p.palette & 3) << 13) | ((p.flipV ? 1 : 0) << 12) | ((p.flipH ? 1 : 0) << 11);
|
|
44
|
+
const size = (((p.wTiles - 1) & 3) << 2) | ((p.hTiles - 1) & 3);
|
|
45
|
+
return ` { ${p.x}, ${p.y}, 0x${size.toString(16)}, ${p.tileOffset}, 0x${attr.toString(16).toUpperCase().padStart(4, "0")} }, // slot ${p.slot} ${p.wTiles}x${p.hTiles}`;
|
|
46
|
+
}).join("\n");
|
|
47
|
+
const wrap = (a, n) => { const o = []; for (let i = 0; i < a.length; i += n) o.push(" " + a.slice(i, i + n).join(", ") + ","); return o.join("\n"); };
|
|
48
|
+
return `// ${v} — Genesis meta-sprite (romdev). ${layout.tileCount} tiles, ${layout.bounds.w}x${layout.bounds.h}px.
|
|
49
|
+
#ifndef ${v.toUpperCase()}_H
|
|
50
|
+
#define ${v.toUpperCase()}_H
|
|
51
|
+
#include <genesis.h>
|
|
52
|
+
typedef struct { s16 x; s16 y; u8 size; u16 tileOffset; u16 attr; } MetaSpritePiece;
|
|
53
|
+
const u32 ${v}_tiles[${u32s.length}] = {
|
|
54
|
+
${wrap(u32s, 8)}
|
|
55
|
+
};
|
|
56
|
+
const u16 ${v}_palette[16] = {
|
|
57
|
+
${wrap(palWords, 8)}
|
|
58
|
+
};
|
|
59
|
+
const MetaSpritePiece ${v}_pieces[${layout.pieces.length}] = {
|
|
60
|
+
${pieces}
|
|
61
|
+
};
|
|
62
|
+
const u16 ${v}_piece_count = ${layout.pieces.length};
|
|
63
|
+
static u16 ${v}_draw(u16 firstSlot, s16 x, s16 y, u16 baseTile) {
|
|
64
|
+
u16 slot = firstSlot;
|
|
65
|
+
for (u16 i = 0; i < ${v}_piece_count; i++) {
|
|
66
|
+
const MetaSpritePiece *p = &${v}_pieces[i];
|
|
67
|
+
VDP_setSprite(slot, x + p->x, y + p->y, p->size, p->attr | (baseTile + p->tileOffset), slot + 1);
|
|
68
|
+
slot++;
|
|
69
|
+
}
|
|
70
|
+
if (slot > firstSlot) VDP_setSpriteLink(slot - 1, 0);
|
|
71
|
+
return slot;
|
|
72
|
+
}
|
|
73
|
+
#endif
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---- SNES (PVSnesLib oamSet-style) ----
|
|
78
|
+
function emitSnes(v, layout, tiles, palette) {
|
|
79
|
+
const pieces = layout.pieces.map((p) => {
|
|
80
|
+
// PVSnesLib oamSet: size 0=8x8/16x16 small/large per OBSEL — we expose
|
|
81
|
+
// wPx/hPx and let the user pick the OBSEL pair; flip bits in attr.
|
|
82
|
+
return ` { ${p.x}, ${p.y}, ${p.wPx}, ${p.hPx}, ${p.tileOffset}, ${p.palette}, ${p.priority ? 1 : 0}, ${p.flipH ? 1 : 0}, ${p.flipV ? 1 : 0} }, // slot ${p.slot}`;
|
|
83
|
+
}).join("\n");
|
|
84
|
+
return `// ${v} — SNES meta-sprite (romdev). ${layout.tileCount} 4bpp tiles, ${layout.bounds.w}x${layout.bounds.h}px.
|
|
85
|
+
// Upload ${v}_tiles to OBJ VRAM, ${v}_palette to a CGRAM OBJ line, then draw.
|
|
86
|
+
#ifndef ${v.toUpperCase()}_H
|
|
87
|
+
#define ${v.toUpperCase()}_H
|
|
88
|
+
#include <snes.h>
|
|
89
|
+
typedef struct { short x; short y; unsigned char w; unsigned char h; unsigned short tileOffset; unsigned char palette; unsigned char priority; unsigned char flipH; unsigned char flipV; } MetaSpritePiece;
|
|
90
|
+
${tilesU8Array(v, tiles)}
|
|
91
|
+
const MetaSpritePiece ${v}_pieces[${layout.pieces.length}] = {
|
|
92
|
+
${pieces}
|
|
93
|
+
};
|
|
94
|
+
const unsigned short ${v}_piece_count = ${layout.pieces.length};
|
|
95
|
+
// Draw with PVSnesLib: for each piece, oamSet(oamId, x+px, y+py, prio, flipH, flipV, baseTile+tileOffset, palette);
|
|
96
|
+
// then oamSetEx for size. baseTile = OBJ VRAM tile index where you uploaded ${v}_tiles.
|
|
97
|
+
#endif
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ---- NES (shadow-OAM bytes) ----
|
|
102
|
+
function emitNes(v, layout, tiles, palette) {
|
|
103
|
+
// NES draw = write 4 OAM bytes per cell (y, tile, attr, x). We emit pieces
|
|
104
|
+
// as (x,y,tile,attr) so the user copies them into shadow OAM at their base.
|
|
105
|
+
const cells = [];
|
|
106
|
+
for (const p of layout.pieces) {
|
|
107
|
+
for (let r = 0; r < p.hTiles; r++) for (let c = 0; c < p.wTiles; c++) {
|
|
108
|
+
const attr = (p.palette & 3) | (p.priority ? 0x20 : 0) | (p.flipH ? 0x40 : 0) | (p.flipV ? 0x80 : 0);
|
|
109
|
+
cells.push(` { ${p.x + c * 8}, ${p.y + r * 8}, ${p.tileOffset + r * p.wTiles + c}, 0x${attr.toString(16).padStart(2, "0")} },`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return `// ${v} — NES meta-sprite (romdev). ${layout.tileCount} 2bpp CHR tiles.
|
|
113
|
+
// Inject ${v}_chr into CHR (or CHR-RAM); copy ${v}_cells into shadow OAM at runtime.
|
|
114
|
+
#ifndef ${v.toUpperCase()}_H
|
|
115
|
+
#define ${v.toUpperCase()}_H
|
|
116
|
+
typedef struct { signed char dx; signed char dy; unsigned char tile; unsigned char attr; } MetaSpriteCell;
|
|
117
|
+
const unsigned char ${v}_chr[${tiles.length}] = {
|
|
118
|
+
${chunk(tiles)}
|
|
119
|
+
};
|
|
120
|
+
const MetaSpriteCell ${v}_cells[${cells.length}] = {
|
|
121
|
+
${cells.join("\n")}
|
|
122
|
+
};
|
|
123
|
+
const unsigned char ${v}_cell_count = ${cells.length};
|
|
124
|
+
// draw: for each cell i, shadow_oam[base+i*4+0]=y+dy; +1=baseTile+tile; +2=attr; +3=x+dx;
|
|
125
|
+
#endif
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ---- GB/GBC (shadow-OAM bytes) ----
|
|
130
|
+
function emitGb(v, layout, tiles, palette) {
|
|
131
|
+
const cells = [];
|
|
132
|
+
for (const p of layout.pieces) {
|
|
133
|
+
for (let r = 0; r < p.hTiles; r++) {
|
|
134
|
+
const attr = ((p.palette & 1) << 4) | (p.flipH ? 0x20 : 0) | (p.flipV ? 0x40 : 0) | (p.priority ? 0x80 : 0);
|
|
135
|
+
cells.push(` { ${p.x}, ${p.y + r * 8}, ${p.tileOffset + r}, 0x${attr.toString(16).padStart(2, "0")} },`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return `// ${v} — GB/GBC meta-sprite (romdev). ${layout.tileCount} 2bpp tiles.
|
|
139
|
+
// Copy ${v}_tiles to VRAM $8000+; copy ${v}_cells into shadow OAM ($C000-ish) then DMA.
|
|
140
|
+
#ifndef ${v.toUpperCase()}_H
|
|
141
|
+
#define ${v.toUpperCase()}_H
|
|
142
|
+
typedef struct { signed char dx; signed char dy; unsigned char tile; unsigned char attr; } MetaSpriteCell;
|
|
143
|
+
const unsigned char ${v}_tiles[${tiles.length}] = {
|
|
144
|
+
${chunk(tiles)}
|
|
145
|
+
};
|
|
146
|
+
const MetaSpriteCell ${v}_cells[${cells.length}] = {
|
|
147
|
+
${cells.join("\n")}
|
|
148
|
+
};
|
|
149
|
+
const unsigned char ${v}_cell_count = ${cells.length};
|
|
150
|
+
// draw: oam[base+i*4]=y+16+dy; +1=x+8+dx; +2=baseTile+tile; +3=attr;
|
|
151
|
+
#endif
|
|
152
|
+
`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ---- SMS/GG (SAT writes) ----
|
|
156
|
+
function emitSms(v, layout, tiles, palette, platform) {
|
|
157
|
+
const cells = [];
|
|
158
|
+
for (const p of layout.pieces) {
|
|
159
|
+
for (let r = 0; r < p.hTiles; r++) cells.push(` { ${p.x}, ${p.y + r * 8}, ${p.tileOffset + r} },`);
|
|
160
|
+
}
|
|
161
|
+
return `// ${v} — ${platform.toUpperCase()} meta-sprite (romdev). ${layout.tileCount} 4bpp tiles.
|
|
162
|
+
// Upload ${v}_tiles to sprite tile data base; write ${v}_cells into the SAT.
|
|
163
|
+
#ifndef ${v.toUpperCase()}_H
|
|
164
|
+
#define ${v.toUpperCase()}_H
|
|
165
|
+
typedef struct { signed char dx; signed char dy; unsigned char tile; } MetaSpriteCell;
|
|
166
|
+
const unsigned char ${v}_tiles[${tiles.length}] = {
|
|
167
|
+
${chunk(tiles)}
|
|
168
|
+
};
|
|
169
|
+
const MetaSpriteCell ${v}_cells[${cells.length}] = {
|
|
170
|
+
${cells.join("\n")}
|
|
171
|
+
};
|
|
172
|
+
const unsigned char ${v}_cell_count = ${cells.length};
|
|
173
|
+
// draw: SAT Y table[base+i]=y+dy; X/tile table[base+i*2]=x+dx, [+1]=baseTile+tile;
|
|
174
|
+
#endif
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function emitGeneric(v, layout, tiles) {
|
|
179
|
+
return `// ${v} — meta-sprite (romdev), platform ${layout.platform}.
|
|
180
|
+
const unsigned char ${v}_tiles[${tiles.length}] = {
|
|
181
|
+
${chunk(tiles)}
|
|
182
|
+
};
|
|
183
|
+
// pieces: ${JSON.stringify(layout.pieces)}
|
|
184
|
+
`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function chunk(bytes) {
|
|
188
|
+
const lines = [];
|
|
189
|
+
for (let i = 0; i < bytes.length; i += 16)
|
|
190
|
+
lines.push(" " + Array.from(bytes.slice(i, i + 16), (b) => "0x" + b.toString(16).toUpperCase().padStart(2, "0")).join(", ") + ",");
|
|
191
|
+
return lines.join("\n");
|
|
192
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// Platform-agnostic meta-sprite capture.
|
|
2
|
+
//
|
|
3
|
+
// A meta-sprite is the live composition of a character's hardware sprites
|
|
4
|
+
// (OAM/SAT entries) lifted into a reusable asset: exported tiles + a layout
|
|
5
|
+
// describing each piece's position/size/palette/flips, plus a preview
|
|
6
|
+
// re-rendered FROM the exported data (never a screenshot crop).
|
|
7
|
+
//
|
|
8
|
+
// Each platform supplies an ADAPTER with a uniform interface, so the
|
|
9
|
+
// select / copy-tiles / normalize / render logic below is written once:
|
|
10
|
+
//
|
|
11
|
+
// adapter = {
|
|
12
|
+
// platform, // "genesis" | "snes" | ...
|
|
13
|
+
// bpp, // 2 | 4 (for tiles)
|
|
14
|
+
// screenW, screenH, // visible bounds (for default select)
|
|
15
|
+
// sprites, // [{slot,x,y,wTiles,hTiles,tile,palette,flipH,flipV,priority}]
|
|
16
|
+
// cellTileOrder(wTiles,hTiles), // → [tileIndexOffset, ...] in HARDWARE order
|
|
17
|
+
// getTilePixels(tileIndex), // → 8x8 array of palette indices (0=transparent)
|
|
18
|
+
// getPaletteRgb(palette), // → [[r,g,b], ...] for that sprite's palette line
|
|
19
|
+
// exportPalette(), // → { bytes:Uint8Array, json:{line:[hex...]}, lines:[..] }
|
|
20
|
+
// tileColumnMajor, // bool — true if cell order increments down columns (Genesis)
|
|
21
|
+
// }
|
|
22
|
+
|
|
23
|
+
import { PNG } from "pngjs";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Capture a meta-sprite using a platform adapter.
|
|
27
|
+
* @param {object} adapter see header
|
|
28
|
+
* @param {object} opts { rect?, slots?, includePartials?, name? }
|
|
29
|
+
*/
|
|
30
|
+
export function captureFromAdapter(adapter, opts = {}) {
|
|
31
|
+
const name = opts.name || "metasprite";
|
|
32
|
+
const includePartials = opts.includePartials !== false;
|
|
33
|
+
const all = adapter.sprites;
|
|
34
|
+
|
|
35
|
+
let selected;
|
|
36
|
+
if (Array.isArray(opts.slots) && opts.slots.length) {
|
|
37
|
+
const want = new Set(opts.slots);
|
|
38
|
+
selected = all.filter((s) => want.has(s.slot));
|
|
39
|
+
} else if (opts.rect) {
|
|
40
|
+
const { x, y, w, h } = opts.rect;
|
|
41
|
+
const rx2 = x + w, ry2 = y + h;
|
|
42
|
+
selected = all.filter((s) => {
|
|
43
|
+
const sx2 = s.x + s.wTiles * 8, sy2 = s.y + s.hTiles * 8;
|
|
44
|
+
const hit = s.x < rx2 && sx2 > x && s.y < ry2 && sy2 > y;
|
|
45
|
+
if (!hit) return false;
|
|
46
|
+
if (includePartials) return true;
|
|
47
|
+
return s.x >= x && s.y >= y && sx2 <= rx2 && sy2 <= ry2;
|
|
48
|
+
});
|
|
49
|
+
} else {
|
|
50
|
+
selected = all.filter((s) => s.visible);
|
|
51
|
+
}
|
|
52
|
+
if (selected.length === 0) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`captureMetaSprite[${adapter.platform}]: no sprite entries matched. ` +
|
|
55
|
+
`Pass slots:[...] (from inspectSprites/groupVisibleSprites) or a rect that overlaps a sprite, ` +
|
|
56
|
+
`and step to a frame where the character is on screen.`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const originX = Math.min(...selected.map((s) => s.x));
|
|
61
|
+
const originY = Math.min(...selected.map((s) => s.y));
|
|
62
|
+
let boundW = 0, boundH = 0;
|
|
63
|
+
|
|
64
|
+
// Copy + dedup tiles by their decoded 8x8 pixel grid (platform-agnostic key).
|
|
65
|
+
const tileByKey = new Map();
|
|
66
|
+
/** @type {number[][][]} */ const exportTiles = []; // each is an 8x8 index grid
|
|
67
|
+
const palettesUsed = new Set();
|
|
68
|
+
const pieces = [];
|
|
69
|
+
|
|
70
|
+
const copyTile = (tileIndex) => {
|
|
71
|
+
const grid = adapter.getTilePixels(tileIndex);
|
|
72
|
+
let key = "";
|
|
73
|
+
for (let r = 0; r < 8; r++) for (let c = 0; c < 8; c++) key += grid[r][c].toString(16);
|
|
74
|
+
let exp = tileByKey.get(key);
|
|
75
|
+
if (exp === undefined) { exp = exportTiles.length; tileByKey.set(key, exp); exportTiles.push(grid); }
|
|
76
|
+
return exp;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
for (const s of selected) {
|
|
80
|
+
palettesUsed.add(s.palette);
|
|
81
|
+
const order = adapter.cellTileOrder(s.wTiles, s.hTiles); // tile-index offsets, hardware order
|
|
82
|
+
let firstExp = -1;
|
|
83
|
+
for (const off of order) {
|
|
84
|
+
const exp = copyTile(s.tile + off);
|
|
85
|
+
if (firstExp === -1) firstExp = exp;
|
|
86
|
+
}
|
|
87
|
+
const px = s.x - originX, py = s.y - originY;
|
|
88
|
+
boundW = Math.max(boundW, px + s.wTiles * 8);
|
|
89
|
+
boundH = Math.max(boundH, py + s.hTiles * 8);
|
|
90
|
+
pieces.push({
|
|
91
|
+
slot: s.slot, x: px, y: py,
|
|
92
|
+
wTiles: s.wTiles, hTiles: s.hTiles,
|
|
93
|
+
wPx: s.wTiles * 8, hPx: s.hTiles * 8,
|
|
94
|
+
sourceTile: s.tile, tileOffset: firstExp,
|
|
95
|
+
palette: s.palette,
|
|
96
|
+
priority: !!s.priority, flipH: !!s.flipH, flipV: !!s.flipV,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const pal = adapter.exportPalette();
|
|
101
|
+
const layout = {
|
|
102
|
+
platform: adapter.platform,
|
|
103
|
+
name,
|
|
104
|
+
bpp: adapter.bpp,
|
|
105
|
+
tileColumnMajor: !!adapter.tileColumnMajor,
|
|
106
|
+
origin: { x: originX, y: originY },
|
|
107
|
+
bounds: { w: boundW, h: boundH },
|
|
108
|
+
tileCount: exportTiles.length,
|
|
109
|
+
palettes: pal.json,
|
|
110
|
+
pieces,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Flatten exported tile pixel-grids into native bytes via the adapter.
|
|
114
|
+
const tiles = adapter.encodeTiles(exportTiles);
|
|
115
|
+
|
|
116
|
+
const previewPng = renderFromExported({ exportTiles, adapter, layout });
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
layout, tiles, palette: pal.bytes, paletteJson: pal.json, previewPng,
|
|
120
|
+
note: `${pieces.length} piece(s), ${exportTiles.length} unique tiles, ${boundW}×${boundH}px, ${adapter.bpp}bpp. ` +
|
|
121
|
+
`Tile order ${adapter.tileColumnMajor ? "column-major (hardware)" : "row-major"} preserved. ` +
|
|
122
|
+
`Palette line(s) used: ${[...palettesUsed].sort((a,b)=>a-b).join(",")}.`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Render a meta-sprite to PNG from decoded export tiles + layout. */
|
|
127
|
+
function renderFromExported({ exportTiles, adapter, layout }) {
|
|
128
|
+
const W = Math.max(8, layout.bounds.w), H = Math.max(8, layout.bounds.h);
|
|
129
|
+
const png = new PNG({ width: W, height: H });
|
|
130
|
+
for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
|
|
131
|
+
const o = (y * W + x) * 4, c = ((x >> 3) + (y >> 3)) & 1 ? 0x60 : 0x40;
|
|
132
|
+
png.data[o] = c; png.data[o + 1] = c; png.data[o + 2] = c; png.data[o + 3] = 0xFF;
|
|
133
|
+
}
|
|
134
|
+
const palCache = {};
|
|
135
|
+
const palOf = (p) => (palCache[p] ??= adapter.getPaletteRgb(p));
|
|
136
|
+
for (const piece of layout.pieces) {
|
|
137
|
+
const rgbPal = palOf(piece.palette);
|
|
138
|
+
const order = adapter.cellTileOrder(piece.wTiles, piece.hTiles);
|
|
139
|
+
// Map each hardware cell index to its (col,row) grid position.
|
|
140
|
+
const cellPos = adapter.cellGridPositions(piece.wTiles, piece.hTiles);
|
|
141
|
+
for (let i = 0; i < order.length; i++) {
|
|
142
|
+
const expTile = piece.tileOffset + i;
|
|
143
|
+
if (expTile >= exportTiles.length) continue;
|
|
144
|
+
const grid = exportTiles[expTile];
|
|
145
|
+
let { col, row } = cellPos[i];
|
|
146
|
+
if (piece.flipH) col = piece.wTiles - 1 - col;
|
|
147
|
+
if (piece.flipV) row = piece.hTiles - 1 - row;
|
|
148
|
+
for (let ty = 0; ty < 8; ty++) for (let tx = 0; tx < 8; tx++) {
|
|
149
|
+
const sx = piece.flipH ? 7 - tx : tx, sy = piece.flipV ? 7 - ty : ty;
|
|
150
|
+
const ci = grid[sy][sx];
|
|
151
|
+
if (ci === 0) continue;
|
|
152
|
+
const [r, g, b] = rgbPal[ci] || [0, 0, 0];
|
|
153
|
+
const px = piece.x + col * 8 + tx, py = piece.y + row * 8 + ty;
|
|
154
|
+
if (px < 0 || py < 0 || px >= W || py >= H) continue;
|
|
155
|
+
const o = (py * W + px) * 4;
|
|
156
|
+
png.data[o] = r; png.data[o + 1] = g; png.data[o + 2] = b; png.data[o + 3] = 0xFF;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return PNG.sync.write(png);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Re-render from already-saved files (tiles.bin + palette + layout). The
|
|
165
|
+
* adapter here is a "decode-only" one built from the layout's bpp + saved
|
|
166
|
+
* bytes (no live host needed).
|
|
167
|
+
*/
|
|
168
|
+
export function renderSavedMetaSprite({ adapter, layout, exportTiles }) {
|
|
169
|
+
return renderFromExported({ exportTiles, adapter, layout });
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Generic spatial clustering of on-screen sprites into objects.
|
|
174
|
+
* @param {Array} sprites uniform sprite list (with x,y,wTiles,hTiles,slot)
|
|
175
|
+
* @param {object} opts { rect?, gap?=8 }
|
|
176
|
+
*/
|
|
177
|
+
export function clusterSprites(sprites, opts = {}) {
|
|
178
|
+
const gap = opts.gap ?? 8;
|
|
179
|
+
let list = sprites.filter((s) => s.visible);
|
|
180
|
+
if (opts.rect) {
|
|
181
|
+
const { x, y, w, h } = opts.rect, rx2 = x + w, ry2 = y + h;
|
|
182
|
+
list = list.filter((s) => s.x < rx2 && s.x + s.wTiles * 8 > x && s.y < ry2 && s.y + s.hTiles * 8 > y);
|
|
183
|
+
}
|
|
184
|
+
const parent = list.map((_, i) => i);
|
|
185
|
+
const find = (a) => { while (parent[a] !== a) a = parent[a] = parent[parent[a]]; return a; };
|
|
186
|
+
const near = (a, b) => {
|
|
187
|
+
const aw = a.wTiles * 8, ah = a.hTiles * 8, bw = b.wTiles * 8, bh = b.hTiles * 8;
|
|
188
|
+
return a.x - gap < b.x + bw && a.x + aw + gap > b.x && a.y - gap < b.y + bh && a.y + ah + gap > b.y;
|
|
189
|
+
};
|
|
190
|
+
for (let i = 0; i < list.length; i++) for (let j = i + 1; j < list.length; j++)
|
|
191
|
+
if (near(list[i], list[j])) parent[find(i)] = find(j);
|
|
192
|
+
const byRoot = new Map();
|
|
193
|
+
list.forEach((s, i) => { const r = find(i); (byRoot.get(r) || byRoot.set(r, []).get(r)).push(s); });
|
|
194
|
+
const groups = [...byRoot.values()].map((grp) => {
|
|
195
|
+
const x = Math.min(...grp.map((s) => s.x)), y = Math.min(...grp.map((s) => s.y));
|
|
196
|
+
const x2 = Math.max(...grp.map((s) => s.x + s.wTiles * 8)), y2 = Math.max(...grp.map((s) => s.y + s.hTiles * 8));
|
|
197
|
+
return { slots: grp.map((s) => s.slot).sort((a, b) => a - b), bounds: { x, y, w: x2 - x, h: y2 - y }, spriteCount: grp.length };
|
|
198
|
+
});
|
|
199
|
+
groups.sort((a, b) => (b.bounds.w * b.bounds.h) - (a.bounds.w * a.bounds.h));
|
|
200
|
+
return { groups };
|
|
201
|
+
}
|