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,1915 @@
|
|
|
1
|
+
#include "config.h"
|
|
2
|
+
#include "types.h"
|
|
3
|
+
|
|
4
|
+
#include "map.h"
|
|
5
|
+
|
|
6
|
+
#include "sys.h"
|
|
7
|
+
#include "mapper.h"
|
|
8
|
+
#include "vdp_tile.h"
|
|
9
|
+
#include "memory.h"
|
|
10
|
+
#include "tools.h"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
//#define MAP_DEBUG
|
|
14
|
+
//#define MAP_PROFIL
|
|
15
|
+
|
|
16
|
+
// max screen width = 320 - (320 / 16) = 20
|
|
17
|
+
#define COLUMN_AHEAD (20 + 1)
|
|
18
|
+
// max screen heigth = 240 - (240 / 16) = 15
|
|
19
|
+
#define ROW_AHEAD (15 + 1)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
// forward
|
|
23
|
+
static void updateMap(Map *map, s16 xt, s16 yt);
|
|
24
|
+
static void setMapColumn(Map *map, u16 column, u16 x, u16 y);
|
|
25
|
+
static void setMapRow(Map *map, u16 row, u16 x, u16 y);
|
|
26
|
+
|
|
27
|
+
static void prepareMapDataColumn(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
28
|
+
static void prepareMapDataColumn_MTI8_BI8(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
29
|
+
static void prepareMapDataColumn_MTI8_BI16(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
30
|
+
static void prepareMapDataColumn_MTI16_BI8(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
31
|
+
static void prepareMapDataColumn_MTI16_BI16(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
32
|
+
static void prepareMapDataColumnEx_MTI8_BI8(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
33
|
+
static void prepareMapDataColumnEx_MTI8_BI16(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
34
|
+
static void prepareMapDataColumnEx_MTI16_BI8(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
35
|
+
static void prepareMapDataColumnEx_MTI16_BI16(Map* map, u16* bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height);
|
|
36
|
+
|
|
37
|
+
static void prepareMapDataRow(Map* map, u16* bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
38
|
+
static void prepareMapDataRow_MTI8_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
39
|
+
static void prepareMapDataRow_MTI8_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
40
|
+
static void prepareMapDataRow_MTI16_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
41
|
+
static void prepareMapDataRow_MTI16_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
42
|
+
static void prepareMapDataRowEx_MTI8_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
43
|
+
static void prepareMapDataRowEx_MTI8_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
44
|
+
static void prepareMapDataRowEx_MTI16_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
45
|
+
static void prepareMapDataRowEx_MTI16_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width);
|
|
46
|
+
|
|
47
|
+
static u16 getMetaTile_MTI8_BI8(Map* map, u16 x, u16 y);
|
|
48
|
+
static u16 getMetaTile_MTI8_BI16(Map* map, u16 x, u16 y);
|
|
49
|
+
static u16 getMetaTile_MTI16_BI8(Map* map, u16 x, u16 y);
|
|
50
|
+
static u16 getMetaTile_MTI16_BI16(Map* map, u16 x, u16 y);
|
|
51
|
+
|
|
52
|
+
static void getMetaTilemapRect_MTI8_BI8(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest);
|
|
53
|
+
static void getMetaTilemapRect_MTI8_BI16(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest);
|
|
54
|
+
static void getMetaTilemapRect_MTI16_BI8(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest);
|
|
55
|
+
static void getMetaTilemapRect_MTI16_BI16(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest);
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Map* NO_INLINE MAP_create(const MapDefinition* mapDef, VDPPlane plane, u16 baseTile)
|
|
59
|
+
{
|
|
60
|
+
Map* result = allocateMap(mapDef);
|
|
61
|
+
|
|
62
|
+
if (result == NULL) return result;
|
|
63
|
+
|
|
64
|
+
result->w = mapDef->w;
|
|
65
|
+
result->h = mapDef->h;
|
|
66
|
+
|
|
67
|
+
// wrapping: note that it works only if w and h are power of 2
|
|
68
|
+
result->wMask = getNextPow2(mapDef->w) - 1;
|
|
69
|
+
result->hMask = getNextPow2(mapDef->h) - 1;
|
|
70
|
+
|
|
71
|
+
u16 compression = mapDef->compression;
|
|
72
|
+
u16 comp;
|
|
73
|
+
|
|
74
|
+
// get metaTiles compression
|
|
75
|
+
comp = compression & 0xF;
|
|
76
|
+
// metaTiles are compressed ?
|
|
77
|
+
if (comp != COMPRESSION_NONE) unpack(comp, (u8*) FAR_SAFE(mapDef->metaTiles, mapDef->numMetaTile * 2 * 4), (u8*) result->metaTiles);
|
|
78
|
+
// init FAR pointer
|
|
79
|
+
else result->metaTiles = FAR_SAFE(mapDef->metaTiles, mapDef->numMetaTile * 2 * 4);
|
|
80
|
+
|
|
81
|
+
// get blocks data compression
|
|
82
|
+
comp = (compression >> 4) & 0xF;
|
|
83
|
+
// blocks data are compressed ?
|
|
84
|
+
if (comp != COMPRESSION_NONE) unpack(comp, (u8*) FAR_SAFE(mapDef->blocks, mapDef->numBlock * 64 * ((mapDef->numMetaTile > 256)?2:1)), (u8*) result->blocks);
|
|
85
|
+
// init FAR pointer
|
|
86
|
+
else result->blocks = FAR_SAFE(mapDef->blocks, mapDef->numBlock * 64 * ((mapDef->numMetaTile > 256)?2:1));
|
|
87
|
+
|
|
88
|
+
// get blocks indexes data compression
|
|
89
|
+
comp = (compression >> 8) & 0xF;
|
|
90
|
+
// blocks indexes data are compressed ?
|
|
91
|
+
if (comp != COMPRESSION_NONE) unpack(comp, (u8*) FAR_SAFE(mapDef->blockIndexes, mulu(mapDef->w, mapDef->hp) * ((mapDef->numBlock > 256)?2:1)), (u8*) result->blockIndexes);
|
|
92
|
+
// init FAR pointer
|
|
93
|
+
else result->blockIndexes = FAR_SAFE(mapDef->blockIndexes, mapDef->w * mapDef->hp * ((mapDef->numBlock > 256)?2:1));
|
|
94
|
+
|
|
95
|
+
// init FAR pointer
|
|
96
|
+
result->blockRowOffsets = FAR_SAFE(mapDef->blockRowOffsets, mapDef->h * 2);
|
|
97
|
+
|
|
98
|
+
// init base parameters
|
|
99
|
+
result->plane = plane;
|
|
100
|
+
// keep only base index and base palette
|
|
101
|
+
result->baseTile = baseTile & (TILE_INDEX_MASK | TILE_ATTR_PALETTE_MASK | TILE_ATTR_PRIORITY_MASK);
|
|
102
|
+
// init plane dimension
|
|
103
|
+
result->planeWidth = planeWidth;
|
|
104
|
+
result->planeHeight = planeHeight;
|
|
105
|
+
result->planeWidthMaskAdj = (planeWidth >> 1) - 1;
|
|
106
|
+
result->planeHeightMaskAdj = (planeHeight >> 1) - 1;
|
|
107
|
+
result->planeWidthSftAdj = planeWidthSft + 2;
|
|
108
|
+
// need full update on start
|
|
109
|
+
result->firstUpdate = TRUE;
|
|
110
|
+
|
|
111
|
+
// prepare function pointers
|
|
112
|
+
if (mapDef->numMetaTile > 256)
|
|
113
|
+
{
|
|
114
|
+
// 16 bit for metatile index
|
|
115
|
+
if (mapDef->numBlock > 256)
|
|
116
|
+
{
|
|
117
|
+
// 16 bit for block index
|
|
118
|
+
if (result->baseTile == 0)
|
|
119
|
+
{
|
|
120
|
+
// no base attribute
|
|
121
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumn_MTI16_BI16;
|
|
122
|
+
result->prepareMapDataRowCB = &prepareMapDataRow_MTI16_BI16;
|
|
123
|
+
}
|
|
124
|
+
else
|
|
125
|
+
{
|
|
126
|
+
// with base attribute
|
|
127
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumnEx_MTI16_BI16;
|
|
128
|
+
result->prepareMapDataRowCB = &prepareMapDataRowEx_MTI16_BI16;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
result->getMetaTileCB = &getMetaTile_MTI16_BI16;
|
|
132
|
+
result->getMetaTilemapRectCB = &getMetaTilemapRect_MTI16_BI16;
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
{
|
|
136
|
+
// 8 bit for block index
|
|
137
|
+
if (result->baseTile == 0)
|
|
138
|
+
{
|
|
139
|
+
// no base attribute
|
|
140
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumn_MTI16_BI8;
|
|
141
|
+
result->prepareMapDataRowCB = &prepareMapDataRow_MTI16_BI8;
|
|
142
|
+
}
|
|
143
|
+
else
|
|
144
|
+
{
|
|
145
|
+
// with base attribute
|
|
146
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumnEx_MTI16_BI8;
|
|
147
|
+
result->prepareMapDataRowCB = &prepareMapDataRowEx_MTI16_BI8;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
result->getMetaTileCB = &getMetaTile_MTI16_BI8;
|
|
151
|
+
result->getMetaTilemapRectCB = &getMetaTilemapRect_MTI16_BI8;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else
|
|
155
|
+
{
|
|
156
|
+
// 8 bit for metatile index
|
|
157
|
+
if (mapDef->numBlock > 256)
|
|
158
|
+
{
|
|
159
|
+
// 16 bit for block index
|
|
160
|
+
if (result->baseTile == 0)
|
|
161
|
+
{
|
|
162
|
+
// no base attribute
|
|
163
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumn_MTI8_BI16;
|
|
164
|
+
result->prepareMapDataRowCB = &prepareMapDataRow_MTI8_BI16;
|
|
165
|
+
}
|
|
166
|
+
else
|
|
167
|
+
{
|
|
168
|
+
// with base attribute
|
|
169
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumnEx_MTI8_BI16;
|
|
170
|
+
result->prepareMapDataRowCB = &prepareMapDataRowEx_MTI8_BI16;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
result->getMetaTileCB = &getMetaTile_MTI8_BI16;
|
|
174
|
+
result->getMetaTilemapRectCB = &getMetaTilemapRect_MTI8_BI16;
|
|
175
|
+
}
|
|
176
|
+
else
|
|
177
|
+
{
|
|
178
|
+
// 8 bit for block index
|
|
179
|
+
if (result->baseTile == 0)
|
|
180
|
+
{
|
|
181
|
+
// no base attribute
|
|
182
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumn_MTI8_BI8;
|
|
183
|
+
result->prepareMapDataRowCB = &prepareMapDataRow_MTI8_BI8;
|
|
184
|
+
}
|
|
185
|
+
else
|
|
186
|
+
{
|
|
187
|
+
// with base attribute
|
|
188
|
+
result->prepareMapDataColumnCB = &prepareMapDataColumnEx_MTI8_BI8;
|
|
189
|
+
result->prepareMapDataRowCB = &prepareMapDataRowEx_MTI8_BI8;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
result->getMetaTileCB = &getMetaTile_MTI8_BI8;
|
|
193
|
+
result->getMetaTilemapRectCB = &getMetaTilemapRect_MTI8_BI8;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// patch callback
|
|
198
|
+
result->mapDataPatchCB = NULL;
|
|
199
|
+
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
void MAP_release(Map* map)
|
|
204
|
+
{
|
|
205
|
+
MEM_free(map);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
NO_INLINE void MAP_scrollToEx(Map* map, u32 x, u32 y, bool forceRedraw)
|
|
210
|
+
{
|
|
211
|
+
bool redraw = forceRedraw || map->firstUpdate;
|
|
212
|
+
|
|
213
|
+
map->firstUpdate = FALSE;
|
|
214
|
+
|
|
215
|
+
if (redraw)
|
|
216
|
+
{
|
|
217
|
+
// force full map update using row updates
|
|
218
|
+
map->posX = x;
|
|
219
|
+
map->posY = y - 256;
|
|
220
|
+
map->lastXT = map->posX >> 4;
|
|
221
|
+
map->lastYT = map->posY >> 4;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// update map
|
|
225
|
+
updateMap(map, x >> 4, y >> 4);
|
|
226
|
+
|
|
227
|
+
// X scrolling changed ?
|
|
228
|
+
if (redraw || (map->posX != x))
|
|
229
|
+
{
|
|
230
|
+
u16 len;
|
|
231
|
+
|
|
232
|
+
switch(VDP_getHorizontalScrollingMode())
|
|
233
|
+
{
|
|
234
|
+
case HSCROLL_PLANE:
|
|
235
|
+
VDP_setHorizontalScrollVSync(map->plane, -x);
|
|
236
|
+
break;
|
|
237
|
+
|
|
238
|
+
case HSCROLL_TILE:
|
|
239
|
+
// important to set scroll for all tile
|
|
240
|
+
len = screenHeight / 8;
|
|
241
|
+
memsetU16(map->hScrollTable, -x, len);
|
|
242
|
+
VDP_setHorizontalScrollTile(map->plane, 0, (s16*) map->hScrollTable, len, DMA_QUEUE);
|
|
243
|
+
break;
|
|
244
|
+
|
|
245
|
+
case HSCROLL_LINE:
|
|
246
|
+
// important to set scroll for all line
|
|
247
|
+
len = screenHeight;
|
|
248
|
+
memsetU16(map->hScrollTable, -x, len);
|
|
249
|
+
VDP_setHorizontalScrollLine(map->plane, 0, (s16*) map->hScrollTable, len, DMA_QUEUE);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// store X position
|
|
254
|
+
map->posX = x;
|
|
255
|
+
}
|
|
256
|
+
// Y scrolling changed ?
|
|
257
|
+
if (redraw || (map->posY != y))
|
|
258
|
+
{
|
|
259
|
+
switch(VDP_getVerticalScrollingMode())
|
|
260
|
+
{
|
|
261
|
+
case VSCROLL_PLANE:
|
|
262
|
+
VDP_setVerticalScrollVSync(map->plane, y);
|
|
263
|
+
break;
|
|
264
|
+
|
|
265
|
+
case VSCROLL_COLUMN:
|
|
266
|
+
// important to set scroll for all column
|
|
267
|
+
memsetU16(map->vScrollTable, y, 20);
|
|
268
|
+
VDP_setVerticalScrollTile(map->plane, 0, (s16*) map->vScrollTable, 20, DMA_QUEUE);
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// store Y position
|
|
273
|
+
map->posY = y;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
void MAP_scrollTo(Map* map, u32 x, u32 y)
|
|
278
|
+
{
|
|
279
|
+
MAP_scrollToEx(map, x, y, FALSE);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
// xt, yt are in *meta* tile position
|
|
284
|
+
static void updateMap(Map* map, s16 xt, s16 yt)
|
|
285
|
+
{
|
|
286
|
+
s16 cxt = map->lastXT;
|
|
287
|
+
s16 cyt = map->lastYT;
|
|
288
|
+
s16 deltaX = xt - cxt;
|
|
289
|
+
s16 deltaY = yt - cyt;
|
|
290
|
+
|
|
291
|
+
// no update --> exit
|
|
292
|
+
if ((deltaX == 0) && (deltaY == 0)) return;
|
|
293
|
+
|
|
294
|
+
#ifdef MAP_DEBUG
|
|
295
|
+
KLog_S4("updateMap xt=", xt, " yt=", yt, " deltaX=", deltaX, " deltaY=", deltaY);
|
|
296
|
+
#endif
|
|
297
|
+
|
|
298
|
+
// clip to 16 metatiles row max (full screen update)
|
|
299
|
+
if (deltaY > ROW_AHEAD)
|
|
300
|
+
{
|
|
301
|
+
cyt += deltaY - ROW_AHEAD;
|
|
302
|
+
deltaY = ROW_AHEAD;
|
|
303
|
+
// as we have a full screen update, we don't need column update then
|
|
304
|
+
deltaX = 0;
|
|
305
|
+
}
|
|
306
|
+
// clip to 16 metatiles row max (full screen update)
|
|
307
|
+
else if (deltaY < -ROW_AHEAD)
|
|
308
|
+
{
|
|
309
|
+
cyt += deltaY + ROW_AHEAD;
|
|
310
|
+
deltaY = -ROW_AHEAD;
|
|
311
|
+
// as we have a full screen update, we don't need column update then
|
|
312
|
+
deltaX = 0;
|
|
313
|
+
}
|
|
314
|
+
// clip to 21 metatiles column max (full screen update)
|
|
315
|
+
else if (deltaX > COLUMN_AHEAD)
|
|
316
|
+
{
|
|
317
|
+
cxt += deltaX - COLUMN_AHEAD;
|
|
318
|
+
deltaX = COLUMN_AHEAD;
|
|
319
|
+
// as we have a full screen update, we don't need row update then
|
|
320
|
+
deltaY = 0;
|
|
321
|
+
}
|
|
322
|
+
// clip to 21 metatiles column max (full screen update)
|
|
323
|
+
else if (deltaX < -COLUMN_AHEAD)
|
|
324
|
+
{
|
|
325
|
+
cxt += deltaX + COLUMN_AHEAD;
|
|
326
|
+
deltaX = -COLUMN_AHEAD;
|
|
327
|
+
// as we have a full screen update, we don't need row update then
|
|
328
|
+
deltaY = 0;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (deltaX > 0)
|
|
332
|
+
{
|
|
333
|
+
// update on right
|
|
334
|
+
cxt += COLUMN_AHEAD;
|
|
335
|
+
|
|
336
|
+
// need to update map column on right
|
|
337
|
+
while(deltaX--)
|
|
338
|
+
{
|
|
339
|
+
setMapColumn(map, cxt & map->planeWidthMaskAdj, cxt, yt);
|
|
340
|
+
cxt++;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else
|
|
344
|
+
{
|
|
345
|
+
// need to update map column on left
|
|
346
|
+
while(deltaX++)
|
|
347
|
+
{
|
|
348
|
+
cxt--;
|
|
349
|
+
setMapColumn(map, cxt & map->planeWidthMaskAdj, cxt, yt);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (deltaY > 0)
|
|
354
|
+
{
|
|
355
|
+
// update on bottom
|
|
356
|
+
cyt += ROW_AHEAD;
|
|
357
|
+
|
|
358
|
+
// need to update map row on bottom
|
|
359
|
+
while(deltaY--)
|
|
360
|
+
{
|
|
361
|
+
setMapRow(map, cyt & map->planeHeightMaskAdj, xt, cyt);
|
|
362
|
+
cyt++;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else
|
|
366
|
+
{
|
|
367
|
+
// need to update map row on top
|
|
368
|
+
while(deltaY++)
|
|
369
|
+
{
|
|
370
|
+
cyt--;
|
|
371
|
+
setMapRow(map, cyt & map->planeHeightMaskAdj, xt, cyt);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
map->lastXT = xt;
|
|
376
|
+
map->lastYT = yt;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
static void setMapColumn(Map *map, u16 column, u16 x, u16 y)
|
|
380
|
+
{
|
|
381
|
+
#ifdef MAP_DEBUG
|
|
382
|
+
KLog_U3("setMapColumn column=", column, " x=", x, " y=", y);
|
|
383
|
+
#endif
|
|
384
|
+
|
|
385
|
+
#ifdef MAP_PROFIL
|
|
386
|
+
u16 start = GET_VCOUNTER;
|
|
387
|
+
#endif
|
|
388
|
+
|
|
389
|
+
const u16 ph = map->planeHeight;
|
|
390
|
+
|
|
391
|
+
// allocate temp buffer for tilemap
|
|
392
|
+
u16* buf = DMA_allocateTemp(ph * 2);
|
|
393
|
+
|
|
394
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
395
|
+
if (!buf)
|
|
396
|
+
{
|
|
397
|
+
KLog("MAP - setMapColumn(..) failed: DMA temporary buffer is full");
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
#endif
|
|
401
|
+
|
|
402
|
+
// VRAM destination address
|
|
403
|
+
const u16 vramAddr = ((map->plane == BG_A)?VDP_BG_A:VDP_BG_B) + (column * 4);
|
|
404
|
+
// get plane width * 2
|
|
405
|
+
const u16 pw2 = map->planeWidth * 2;
|
|
406
|
+
|
|
407
|
+
// queue DMA (first column)
|
|
408
|
+
DMA_queueDmaFast(DMA_VRAM, buf, vramAddr + 0, ph, pw2);
|
|
409
|
+
// queue DMA (second column)
|
|
410
|
+
DMA_queueDmaFast(DMA_VRAM, buf + ph, vramAddr + 2, ph, pw2);
|
|
411
|
+
|
|
412
|
+
#ifdef MAP_PROFIL
|
|
413
|
+
u16 end = GET_VCOUNTER;
|
|
414
|
+
KLog_S1("setMapColumn - DMA queue operations duration=", end - start);
|
|
415
|
+
#endif
|
|
416
|
+
|
|
417
|
+
// 16 metatile = 32 tiles = 256 pixels (full screen height + 16 pixels)
|
|
418
|
+
const u16 h = ROW_AHEAD;
|
|
419
|
+
// clip Y against plane size
|
|
420
|
+
const u16 yAdj = y & map->planeHeightMaskAdj;
|
|
421
|
+
// get plane height
|
|
422
|
+
const u16 ph2 = map->planeHeightMaskAdj + 1;
|
|
423
|
+
|
|
424
|
+
// larger than plane height ? --> need to split
|
|
425
|
+
if ((yAdj + h) > ph2)
|
|
426
|
+
{
|
|
427
|
+
const u16 h1 = ph2 - yAdj;
|
|
428
|
+
|
|
429
|
+
// prepare first part of column data
|
|
430
|
+
prepareMapDataColumn(map, buf + (yAdj * 2), buf + (yAdj * 2) + ph, x, y, h1);
|
|
431
|
+
// prepare second part of column data
|
|
432
|
+
prepareMapDataColumn(map, buf, buf + ph, x, y + h1, h - h1);
|
|
433
|
+
}
|
|
434
|
+
// no split needed
|
|
435
|
+
else prepareMapDataColumn(map, buf + (yAdj * 2), buf + (yAdj * 2) + ph, x, y, h);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
static void setMapRow(Map *map, u16 row, u16 x, u16 y)
|
|
439
|
+
{
|
|
440
|
+
#ifdef MAP_DEBUG
|
|
441
|
+
KLog_U3("setMapRow row=", row, " x=", x, " y=", y);
|
|
442
|
+
#endif
|
|
443
|
+
|
|
444
|
+
#ifdef MAP_PROFIL
|
|
445
|
+
u16 start = GET_VCOUNTER;
|
|
446
|
+
#endif
|
|
447
|
+
|
|
448
|
+
const u16 pw = map->planeWidth;
|
|
449
|
+
|
|
450
|
+
// allocate temp buffer for tilemap
|
|
451
|
+
u16* buf = DMA_allocateTemp(pw * 2);
|
|
452
|
+
|
|
453
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
454
|
+
if (!buf)
|
|
455
|
+
{
|
|
456
|
+
KLog("MAP - setMapRow(..) failed: DMA temporary buffer is full");
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
#endif
|
|
460
|
+
|
|
461
|
+
// VRAM destination address
|
|
462
|
+
const u16 vramAddr = ((map->plane == BG_A)?VDP_BG_A:VDP_BG_B) + (row << map->planeWidthSftAdj);
|
|
463
|
+
|
|
464
|
+
// queue DMA (first row)
|
|
465
|
+
DMA_queueDmaFast(DMA_VRAM, buf, vramAddr + (pw * 0), pw, 2);
|
|
466
|
+
// queue DMA (second row)
|
|
467
|
+
DMA_queueDmaFast(DMA_VRAM, buf + pw, vramAddr + (pw * 2), pw, 2);
|
|
468
|
+
|
|
469
|
+
#ifdef MAP_PROFIL
|
|
470
|
+
u16 end = GET_VCOUNTER;
|
|
471
|
+
KLog_S1("setMapRow - DMA queue operations duration=", end - start);
|
|
472
|
+
#endif
|
|
473
|
+
|
|
474
|
+
// 21 metatile = 42 tiles = 336 pixels (full screen width + 16 pixels)
|
|
475
|
+
u16 w = COLUMN_AHEAD;
|
|
476
|
+
// clip X against plane size
|
|
477
|
+
const u16 xAdj = x & map->planeWidthMaskAdj;
|
|
478
|
+
// get plane width (metatile)
|
|
479
|
+
const u16 pw2 = map->planeWidthMaskAdj + 1;
|
|
480
|
+
|
|
481
|
+
// larger than plane width ? --> need to split
|
|
482
|
+
if ((xAdj + w) > pw2)
|
|
483
|
+
{
|
|
484
|
+
const u16 w1 = pw2 - xAdj;
|
|
485
|
+
|
|
486
|
+
// prepare first part of row data
|
|
487
|
+
prepareMapDataRow(map, buf + (xAdj * 2), buf + (xAdj * 2) + pw, x, y, w1);
|
|
488
|
+
// prepare second part of row data
|
|
489
|
+
prepareMapDataRow(map, buf, buf + pw, x + w1, y, w - w1);
|
|
490
|
+
}
|
|
491
|
+
// no split needed
|
|
492
|
+
else prepareMapDataRow(map, buf + (xAdj * 2), buf + (xAdj * 2) + pw, x, y, w);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
static void prepareMapDataColumn(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
496
|
+
{
|
|
497
|
+
#ifdef MAP_PROFIL
|
|
498
|
+
u16 start = GET_VCOUNTER;
|
|
499
|
+
#endif
|
|
500
|
+
|
|
501
|
+
map->prepareMapDataColumnCB(map, bufCol1, bufCol2, xm, ym, height);
|
|
502
|
+
|
|
503
|
+
// patch data callback set ?
|
|
504
|
+
if (map->mapDataPatchCB != NULL)
|
|
505
|
+
{
|
|
506
|
+
map->mapDataPatchCB(map, bufCol1, (xm * 2) + 0, ym * 2, COLUMN_UPDATE, height * 2);
|
|
507
|
+
map->mapDataPatchCB(map, bufCol2, (xm * 2) + 1, ym * 2, COLUMN_UPDATE, height * 2);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
#ifdef MAP_PROFIL
|
|
511
|
+
u16 end = GET_VCOUNTER;
|
|
512
|
+
KLog_S2("prepareMapDataColumn - duration=", end - start, " h=", height);
|
|
513
|
+
#endif
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
static void prepareMapDataRow(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
517
|
+
{
|
|
518
|
+
#ifdef MAP_PROFIL
|
|
519
|
+
u16 start = GET_VCOUNTER;
|
|
520
|
+
#endif
|
|
521
|
+
|
|
522
|
+
map->prepareMapDataRowCB(map, bufRow1, bufRow2, xm, ym, width);
|
|
523
|
+
|
|
524
|
+
// patch data callback set ?
|
|
525
|
+
if (map->mapDataPatchCB != NULL)
|
|
526
|
+
{
|
|
527
|
+
map->mapDataPatchCB(map, bufRow1, xm * 2, (ym * 2) + 0, ROW_UPDATE, width * 2);
|
|
528
|
+
map->mapDataPatchCB(map, bufRow2, xm * 2, (ym * 2) + 1, ROW_UPDATE, width * 2);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
#ifdef MAP_PROFIL
|
|
532
|
+
u16 end = GET_VCOUNTER;
|
|
533
|
+
KLog_S2("prepareMapDataRow - duration=", end - start, " w=", width);
|
|
534
|
+
#endif
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
static void prepareMapDataColumn_MTI8_BI8(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
539
|
+
{
|
|
540
|
+
u16 *d1 = bufCol1;
|
|
541
|
+
u16 *d2 = bufCol2;
|
|
542
|
+
// number of metatile to decode
|
|
543
|
+
u16 h = height;
|
|
544
|
+
|
|
545
|
+
u8* blockIndexes = map->blockIndexes;
|
|
546
|
+
u8* blocks = map->blocks;
|
|
547
|
+
|
|
548
|
+
// block X position
|
|
549
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
550
|
+
// block Y position
|
|
551
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
552
|
+
// get block grid index
|
|
553
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
554
|
+
// get first block data pointer
|
|
555
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
556
|
+
// internal block fixed offset (will never change)
|
|
557
|
+
u16 blockFixedOffset = xm & 7;
|
|
558
|
+
// start y position inside block
|
|
559
|
+
u16 yi = ym & 7;
|
|
560
|
+
|
|
561
|
+
// block start offset
|
|
562
|
+
block += blockFixedOffset + (yi * 8);
|
|
563
|
+
|
|
564
|
+
u16* metaTiles = map->metaTiles;
|
|
565
|
+
|
|
566
|
+
// remain metatile ?
|
|
567
|
+
while(h--)
|
|
568
|
+
{
|
|
569
|
+
// get metatile index
|
|
570
|
+
u8 metaTileInd = *block;
|
|
571
|
+
// next row
|
|
572
|
+
block += 8;
|
|
573
|
+
|
|
574
|
+
// get metatile pointeur
|
|
575
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
576
|
+
|
|
577
|
+
// copy tiles attribute
|
|
578
|
+
*d1++ = *metaTile++;
|
|
579
|
+
*d2++ = *metaTile++;
|
|
580
|
+
*d1++ = *metaTile++;
|
|
581
|
+
*d2++ = *metaTile;
|
|
582
|
+
|
|
583
|
+
// next metatile Y is a new block ?
|
|
584
|
+
if (++yi == 8)
|
|
585
|
+
{
|
|
586
|
+
yi = 0;
|
|
587
|
+
// next row
|
|
588
|
+
yb = (yb + 1) & map->hMask;
|
|
589
|
+
// get new block grid index
|
|
590
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
591
|
+
// get block data pointer
|
|
592
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
593
|
+
// add base offset
|
|
594
|
+
block += blockFixedOffset;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
static void prepareMapDataColumn_MTI8_BI16(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
600
|
+
{
|
|
601
|
+
u16 *d1 = bufCol1;
|
|
602
|
+
u16 *d2 = bufCol2;
|
|
603
|
+
// number of metatile to decode
|
|
604
|
+
u16 h = height;
|
|
605
|
+
|
|
606
|
+
u16* blockIndexes = map->blockIndexes;
|
|
607
|
+
u8* blocks = map->blocks;
|
|
608
|
+
|
|
609
|
+
// block X position
|
|
610
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
611
|
+
// block Y position
|
|
612
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
613
|
+
// get block grid index
|
|
614
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
615
|
+
// get first block data pointer
|
|
616
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
617
|
+
// internal block fixed offset (will never change)
|
|
618
|
+
u16 blockFixedOffset = xm & 7;
|
|
619
|
+
// start y position inside block
|
|
620
|
+
u16 yi = ym & 7;
|
|
621
|
+
|
|
622
|
+
// block start offset
|
|
623
|
+
block += blockFixedOffset + (yi * 8);
|
|
624
|
+
|
|
625
|
+
u16* metaTiles = map->metaTiles;
|
|
626
|
+
|
|
627
|
+
// remain metatile ?
|
|
628
|
+
while(h--)
|
|
629
|
+
{
|
|
630
|
+
// get metatile index
|
|
631
|
+
u8 metaTileInd = *block;
|
|
632
|
+
// next row
|
|
633
|
+
block += 8;
|
|
634
|
+
|
|
635
|
+
// get metatile pointeur
|
|
636
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
637
|
+
|
|
638
|
+
// copy tiles attribute
|
|
639
|
+
*d1++ = *metaTile++;
|
|
640
|
+
*d2++ = *metaTile++;
|
|
641
|
+
*d1++ = *metaTile++;
|
|
642
|
+
*d2++ = *metaTile;
|
|
643
|
+
|
|
644
|
+
// next metatile Y is a new block ?
|
|
645
|
+
if (++yi == 8)
|
|
646
|
+
{
|
|
647
|
+
yi = 0;
|
|
648
|
+
// next row
|
|
649
|
+
yb = (yb + 1) & map->hMask;
|
|
650
|
+
// get new block grid index
|
|
651
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
652
|
+
// get block data pointer
|
|
653
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
654
|
+
// add base offset
|
|
655
|
+
block += blockFixedOffset;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
static void prepareMapDataColumn_MTI16_BI8(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
661
|
+
{
|
|
662
|
+
u16 *d1 = bufCol1;
|
|
663
|
+
u16 *d2 = bufCol2;
|
|
664
|
+
// number of metatile to decode
|
|
665
|
+
u16 h = height;
|
|
666
|
+
|
|
667
|
+
u8* blockIndexes = map->blockIndexes;
|
|
668
|
+
u16* blocks = map->blocks;
|
|
669
|
+
|
|
670
|
+
// block X position
|
|
671
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
672
|
+
// block Y position
|
|
673
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
674
|
+
// get block grid index
|
|
675
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
676
|
+
// get first block data pointer
|
|
677
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
678
|
+
// internal block fixed offset (will never change)
|
|
679
|
+
u16 blockFixedOffset = xm & 7;
|
|
680
|
+
// start y position inside block
|
|
681
|
+
u16 yi = ym & 7;
|
|
682
|
+
|
|
683
|
+
// block start offset
|
|
684
|
+
block += blockFixedOffset + (yi * 8);
|
|
685
|
+
|
|
686
|
+
u16* metaTiles = map->metaTiles;
|
|
687
|
+
|
|
688
|
+
// remain metatile ?
|
|
689
|
+
while(h--)
|
|
690
|
+
{
|
|
691
|
+
// get metatile index
|
|
692
|
+
u16 metaTileInd = *block;
|
|
693
|
+
// next row
|
|
694
|
+
block += 8;
|
|
695
|
+
|
|
696
|
+
// get metatile pointeur
|
|
697
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
698
|
+
|
|
699
|
+
// copy tiles attribute
|
|
700
|
+
*d1++ = *metaTile++;
|
|
701
|
+
*d2++ = *metaTile++;
|
|
702
|
+
*d1++ = *metaTile++;
|
|
703
|
+
*d2++ = *metaTile;
|
|
704
|
+
|
|
705
|
+
// next metatile Y is a new block ?
|
|
706
|
+
if (++yi == 8)
|
|
707
|
+
{
|
|
708
|
+
yi = 0;
|
|
709
|
+
// next row
|
|
710
|
+
yb = (yb + 1) & map->hMask;
|
|
711
|
+
// get new block grid index
|
|
712
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
713
|
+
// get block data pointer
|
|
714
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
715
|
+
// add base offset
|
|
716
|
+
block += blockFixedOffset;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
static void prepareMapDataColumn_MTI16_BI16(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
722
|
+
{
|
|
723
|
+
u16 *d1 = bufCol1;
|
|
724
|
+
u16 *d2 = bufCol2;
|
|
725
|
+
// number of metatile to decode
|
|
726
|
+
u16 h = height;
|
|
727
|
+
|
|
728
|
+
u16* blockIndexes = map->blockIndexes;
|
|
729
|
+
u16* blocks = map->blocks;
|
|
730
|
+
|
|
731
|
+
// block X position
|
|
732
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
733
|
+
// block Y position
|
|
734
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
735
|
+
// get block grid index
|
|
736
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
737
|
+
// get first block data pointer
|
|
738
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
739
|
+
// internal block fixed offset (will never change)
|
|
740
|
+
u16 blockFixedOffset = xm & 7;
|
|
741
|
+
// start y position inside block
|
|
742
|
+
u16 yi = ym & 7;
|
|
743
|
+
|
|
744
|
+
// block start offset
|
|
745
|
+
block += blockFixedOffset + (yi * 8);
|
|
746
|
+
|
|
747
|
+
u16* metaTiles = map->metaTiles;
|
|
748
|
+
|
|
749
|
+
// remain metatile ?
|
|
750
|
+
while(h--)
|
|
751
|
+
{
|
|
752
|
+
// get metatile index
|
|
753
|
+
u16 metaTileInd = *block;
|
|
754
|
+
// next row
|
|
755
|
+
block += 8;
|
|
756
|
+
|
|
757
|
+
// get metatile pointeur
|
|
758
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
759
|
+
|
|
760
|
+
// copy tiles attribute
|
|
761
|
+
*d1++ = *metaTile++;
|
|
762
|
+
*d2++ = *metaTile++;
|
|
763
|
+
*d1++ = *metaTile++;
|
|
764
|
+
*d2++ = *metaTile;
|
|
765
|
+
|
|
766
|
+
// next metatile Y is a new block ?
|
|
767
|
+
if (++yi == 8)
|
|
768
|
+
{
|
|
769
|
+
yi = 0;
|
|
770
|
+
// next row
|
|
771
|
+
yb = (yb + 1) & map->hMask;
|
|
772
|
+
// get new block grid index
|
|
773
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
774
|
+
// get block data pointer
|
|
775
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
776
|
+
// add base offset
|
|
777
|
+
block += blockFixedOffset;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
static void prepareMapDataColumnEx_MTI8_BI8(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
783
|
+
{
|
|
784
|
+
// we can add both base index and base palette
|
|
785
|
+
const u16 baseAttr = map->baseTile;
|
|
786
|
+
|
|
787
|
+
u16 *d1 = bufCol1;
|
|
788
|
+
u16 *d2 = bufCol2;
|
|
789
|
+
// number of metatile to decode
|
|
790
|
+
u16 h = height;
|
|
791
|
+
|
|
792
|
+
u8* blockIndexes = map->blockIndexes;
|
|
793
|
+
u8* blocks = map->blocks;
|
|
794
|
+
|
|
795
|
+
// block X position
|
|
796
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
797
|
+
// block Y position
|
|
798
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
799
|
+
// get block grid index
|
|
800
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
801
|
+
// get first block data pointer
|
|
802
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
803
|
+
// internal block fixed offset (will never change)
|
|
804
|
+
u16 blockFixedOffset = xm & 7;
|
|
805
|
+
// start y position inside block
|
|
806
|
+
u16 yi = ym & 7;
|
|
807
|
+
|
|
808
|
+
// block start offset
|
|
809
|
+
block += blockFixedOffset + (yi * 8);
|
|
810
|
+
|
|
811
|
+
u16* metaTiles = map->metaTiles;
|
|
812
|
+
|
|
813
|
+
// remain metatile ?
|
|
814
|
+
while(h--)
|
|
815
|
+
{
|
|
816
|
+
// get metatile index
|
|
817
|
+
u8 metaTileInd = *block;
|
|
818
|
+
// next row
|
|
819
|
+
block += 8;
|
|
820
|
+
|
|
821
|
+
// get metatile pointeur
|
|
822
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
823
|
+
|
|
824
|
+
// copy tiles attribute
|
|
825
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
826
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
827
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
828
|
+
*d2++ = *metaTile + baseAttr;
|
|
829
|
+
|
|
830
|
+
// next metatile Y is a new block ?
|
|
831
|
+
if (++yi == 8)
|
|
832
|
+
{
|
|
833
|
+
yi = 0;
|
|
834
|
+
// next row
|
|
835
|
+
yb = (yb + 1) & map->hMask;
|
|
836
|
+
// get new block grid index
|
|
837
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
838
|
+
// get block data pointer
|
|
839
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
840
|
+
// add base offset
|
|
841
|
+
block += blockFixedOffset;
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
static void prepareMapDataColumnEx_MTI8_BI16(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
847
|
+
{
|
|
848
|
+
// we can add both base index and base palette
|
|
849
|
+
const u16 baseAttr = map->baseTile;
|
|
850
|
+
|
|
851
|
+
u16 *d1 = bufCol1;
|
|
852
|
+
u16 *d2 = bufCol2;
|
|
853
|
+
// number of metatile to decode
|
|
854
|
+
u16 h = height;
|
|
855
|
+
|
|
856
|
+
u16* blockIndexes = map->blockIndexes;
|
|
857
|
+
u8* blocks = map->blocks;
|
|
858
|
+
|
|
859
|
+
// block X position
|
|
860
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
861
|
+
// block Y position
|
|
862
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
863
|
+
// get block grid index
|
|
864
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
865
|
+
// get first block data pointer
|
|
866
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
867
|
+
// internal block fixed offset (will never change)
|
|
868
|
+
u16 blockFixedOffset = xm & 7;
|
|
869
|
+
// start y position inside block
|
|
870
|
+
u16 yi = ym & 7;
|
|
871
|
+
|
|
872
|
+
// block start offset
|
|
873
|
+
block += blockFixedOffset + (yi * 8);
|
|
874
|
+
|
|
875
|
+
u16* metaTiles = map->metaTiles;
|
|
876
|
+
|
|
877
|
+
// remain metatile ?
|
|
878
|
+
while(h--)
|
|
879
|
+
{
|
|
880
|
+
// get metatile index
|
|
881
|
+
u8 metaTileInd = *block;
|
|
882
|
+
// next row
|
|
883
|
+
block += 8;
|
|
884
|
+
|
|
885
|
+
// get metatile pointeur
|
|
886
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
887
|
+
|
|
888
|
+
// copy tiles attribute
|
|
889
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
890
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
891
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
892
|
+
*d2++ = *metaTile + baseAttr;
|
|
893
|
+
|
|
894
|
+
// next metatile Y is a new block ?
|
|
895
|
+
if (++yi == 8)
|
|
896
|
+
{
|
|
897
|
+
yi = 0;
|
|
898
|
+
// next row
|
|
899
|
+
yb = (yb + 1) & map->hMask;
|
|
900
|
+
// get new block grid index
|
|
901
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
902
|
+
// get block data pointer
|
|
903
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
904
|
+
// add base offset
|
|
905
|
+
block += blockFixedOffset;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
static void prepareMapDataColumnEx_MTI16_BI8(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
911
|
+
{
|
|
912
|
+
// we can add both base index and base palette
|
|
913
|
+
const u16 baseAttr = map->baseTile;
|
|
914
|
+
|
|
915
|
+
u16 *d1 = bufCol1;
|
|
916
|
+
u16 *d2 = bufCol2;
|
|
917
|
+
// number of metatile to decode
|
|
918
|
+
u16 h = height;
|
|
919
|
+
|
|
920
|
+
u8* blockIndexes = map->blockIndexes;
|
|
921
|
+
u16* blocks = map->blocks;
|
|
922
|
+
|
|
923
|
+
// block X position
|
|
924
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
925
|
+
// block Y position
|
|
926
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
927
|
+
// get block grid index
|
|
928
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
929
|
+
// get first block data pointer
|
|
930
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
931
|
+
// internal block fixed offset (will never change)
|
|
932
|
+
u16 blockFixedOffset = xm & 7;
|
|
933
|
+
// start y position inside block
|
|
934
|
+
u16 yi = ym & 7;
|
|
935
|
+
|
|
936
|
+
// block start offset
|
|
937
|
+
block += blockFixedOffset + (yi * 8);
|
|
938
|
+
|
|
939
|
+
u16* metaTiles = map->metaTiles;
|
|
940
|
+
|
|
941
|
+
// remain metatile ?
|
|
942
|
+
while(h--)
|
|
943
|
+
{
|
|
944
|
+
// get metatile index
|
|
945
|
+
u16 metaTileInd = *block;
|
|
946
|
+
// next row
|
|
947
|
+
block += 8;
|
|
948
|
+
|
|
949
|
+
// get metatile pointeur
|
|
950
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
951
|
+
|
|
952
|
+
// copy tiles attribute
|
|
953
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
954
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
955
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
956
|
+
*d2++ = *metaTile + baseAttr;
|
|
957
|
+
|
|
958
|
+
// next metatile Y is a new block ?
|
|
959
|
+
if (++yi == 8)
|
|
960
|
+
{
|
|
961
|
+
yi = 0;
|
|
962
|
+
// next row
|
|
963
|
+
yb = (yb + 1) & map->hMask;
|
|
964
|
+
// get new block grid index
|
|
965
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
966
|
+
// get block data pointer
|
|
967
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
968
|
+
// add base offset
|
|
969
|
+
block += blockFixedOffset;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
static void prepareMapDataColumnEx_MTI16_BI16(Map *map, u16 *bufCol1, u16 *bufCol2, u16 xm, u16 ym, u16 height)
|
|
975
|
+
{
|
|
976
|
+
// we can add both base index and base palette
|
|
977
|
+
const u16 baseAttr = map->baseTile;
|
|
978
|
+
|
|
979
|
+
u16 *d1 = bufCol1;
|
|
980
|
+
u16 *d2 = bufCol2;
|
|
981
|
+
// number of metatile to decode
|
|
982
|
+
u16 h = height;
|
|
983
|
+
|
|
984
|
+
u16* blockIndexes = map->blockIndexes;
|
|
985
|
+
u16* blocks = map->blocks;
|
|
986
|
+
|
|
987
|
+
// block X position
|
|
988
|
+
const u16 xb = (xm / 8) & map->wMask;
|
|
989
|
+
// block Y position
|
|
990
|
+
u16 yb = (ym / 8) & map->hMask;
|
|
991
|
+
// get block grid index
|
|
992
|
+
u16 blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
993
|
+
// get first block data pointer
|
|
994
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
995
|
+
// internal block fixed offset (will never change)
|
|
996
|
+
u16 blockFixedOffset = xm & 7;
|
|
997
|
+
// start y position inside block
|
|
998
|
+
u16 yi = ym & 7;
|
|
999
|
+
|
|
1000
|
+
// block start offset
|
|
1001
|
+
block += blockFixedOffset + (yi * 8);
|
|
1002
|
+
|
|
1003
|
+
u16* metaTiles = map->metaTiles;
|
|
1004
|
+
|
|
1005
|
+
// remain metatile ?
|
|
1006
|
+
while(h--)
|
|
1007
|
+
{
|
|
1008
|
+
// get metatile index
|
|
1009
|
+
u16 metaTileInd = *block;
|
|
1010
|
+
// next row
|
|
1011
|
+
block += 8;
|
|
1012
|
+
|
|
1013
|
+
// get metatile pointeur
|
|
1014
|
+
u16* metaTile = &metaTiles[2 * 2 * metaTileInd];
|
|
1015
|
+
|
|
1016
|
+
// copy tiles attribute
|
|
1017
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1018
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
1019
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1020
|
+
*d2++ = *metaTile + baseAttr;
|
|
1021
|
+
|
|
1022
|
+
// next metatile Y is a new block ?
|
|
1023
|
+
if (++yi == 8)
|
|
1024
|
+
{
|
|
1025
|
+
yi = 0;
|
|
1026
|
+
// next row
|
|
1027
|
+
yb = (yb + 1) & map->hMask;
|
|
1028
|
+
// get new block grid index
|
|
1029
|
+
blockGridIndex = map->blockRowOffsets[yb] + xb;
|
|
1030
|
+
// get block data pointer
|
|
1031
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1032
|
+
// add base offset
|
|
1033
|
+
block += blockFixedOffset;
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
static void prepareMapDataRow_MTI8_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1039
|
+
{
|
|
1040
|
+
u16 *d1 = bufRow1;
|
|
1041
|
+
u16 *d2 = bufRow2;
|
|
1042
|
+
// number of metatile to decode
|
|
1043
|
+
u16 w = width;
|
|
1044
|
+
|
|
1045
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1046
|
+
u8* blocks = map->blocks;
|
|
1047
|
+
|
|
1048
|
+
// block X position
|
|
1049
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1050
|
+
// base block grid index
|
|
1051
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1052
|
+
// block grid index
|
|
1053
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1054
|
+
// get first block data pointer
|
|
1055
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1056
|
+
// internal block fixed offset (will never change)
|
|
1057
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1058
|
+
// start x position inside block
|
|
1059
|
+
u16 xi = xm & 7;
|
|
1060
|
+
|
|
1061
|
+
// block start offset
|
|
1062
|
+
block += blockFixedOffset + xi;
|
|
1063
|
+
|
|
1064
|
+
// remain metatile ?
|
|
1065
|
+
while(w--)
|
|
1066
|
+
{
|
|
1067
|
+
// metatile index; next col
|
|
1068
|
+
u8 metaTileInd = *block++;
|
|
1069
|
+
// get metatile pointeur
|
|
1070
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1071
|
+
|
|
1072
|
+
// copy tiles attribute
|
|
1073
|
+
*d1++ = *metaTile++;
|
|
1074
|
+
*d1++ = *metaTile++;
|
|
1075
|
+
*d2++ = *metaTile++;
|
|
1076
|
+
*d2++ = *metaTile;
|
|
1077
|
+
|
|
1078
|
+
// next metatile X is a new block ?
|
|
1079
|
+
if (++xi == 8)
|
|
1080
|
+
{
|
|
1081
|
+
xi = 0;
|
|
1082
|
+
// next column
|
|
1083
|
+
xb = (xb + 1) & map->wMask;
|
|
1084
|
+
// get new block grid index
|
|
1085
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1086
|
+
// get block data pointer
|
|
1087
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1088
|
+
// add base offset
|
|
1089
|
+
block += blockFixedOffset;
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
static void prepareMapDataRow_MTI8_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1095
|
+
{
|
|
1096
|
+
u16 *d1 = bufRow1;
|
|
1097
|
+
u16 *d2 = bufRow2;
|
|
1098
|
+
// number of metatile to decode
|
|
1099
|
+
u16 w = width;
|
|
1100
|
+
|
|
1101
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1102
|
+
u8* blocks = map->blocks;
|
|
1103
|
+
|
|
1104
|
+
// block X position
|
|
1105
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1106
|
+
// base block grid index
|
|
1107
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1108
|
+
// block grid index
|
|
1109
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1110
|
+
// get first block data pointer
|
|
1111
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1112
|
+
// internal block fixed offset (will never change)
|
|
1113
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1114
|
+
// start x position inside block
|
|
1115
|
+
u16 xi = xm & 7;
|
|
1116
|
+
|
|
1117
|
+
// block start offset
|
|
1118
|
+
block += blockFixedOffset + xi;
|
|
1119
|
+
|
|
1120
|
+
// remain metatile ?
|
|
1121
|
+
while(w--)
|
|
1122
|
+
{
|
|
1123
|
+
// metatile index; next col
|
|
1124
|
+
u8 metaTileInd = *block++;
|
|
1125
|
+
// get metatile pointeur
|
|
1126
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1127
|
+
|
|
1128
|
+
// copy tiles attribute
|
|
1129
|
+
*d1++ = *metaTile++;
|
|
1130
|
+
*d1++ = *metaTile++;
|
|
1131
|
+
*d2++ = *metaTile++;
|
|
1132
|
+
*d2++ = *metaTile;
|
|
1133
|
+
|
|
1134
|
+
// next metatile X is a new block ?
|
|
1135
|
+
if (++xi == 8)
|
|
1136
|
+
{
|
|
1137
|
+
xi = 0;
|
|
1138
|
+
// next column
|
|
1139
|
+
xb = (xb + 1) & map->wMask;
|
|
1140
|
+
// get new block grid index
|
|
1141
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1142
|
+
// get block data pointer
|
|
1143
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1144
|
+
// add base offset
|
|
1145
|
+
block += blockFixedOffset;
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
static void prepareMapDataRow_MTI16_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1151
|
+
{
|
|
1152
|
+
u16 *d1 = bufRow1;
|
|
1153
|
+
u16 *d2 = bufRow2;
|
|
1154
|
+
// number of metatile to decode
|
|
1155
|
+
u16 w = width;
|
|
1156
|
+
|
|
1157
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1158
|
+
u16* blocks = map->blocks;
|
|
1159
|
+
|
|
1160
|
+
// block X position
|
|
1161
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1162
|
+
// base block grid index
|
|
1163
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1164
|
+
// block grid index
|
|
1165
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1166
|
+
// get first block data pointer
|
|
1167
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1168
|
+
// internal block fixed offset (will never change)
|
|
1169
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1170
|
+
// start x position inside block
|
|
1171
|
+
u16 xi = xm & 7;
|
|
1172
|
+
|
|
1173
|
+
// block start offset
|
|
1174
|
+
block += blockFixedOffset + xi;
|
|
1175
|
+
|
|
1176
|
+
// remain metatile ?
|
|
1177
|
+
while(w--)
|
|
1178
|
+
{
|
|
1179
|
+
// metatile index; next col
|
|
1180
|
+
u16 metaTileInd = *block++;
|
|
1181
|
+
// get metatile pointeur
|
|
1182
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1183
|
+
|
|
1184
|
+
// copy tiles attribute
|
|
1185
|
+
*d1++ = *metaTile++;
|
|
1186
|
+
*d1++ = *metaTile++;
|
|
1187
|
+
*d2++ = *metaTile++;
|
|
1188
|
+
*d2++ = *metaTile;
|
|
1189
|
+
|
|
1190
|
+
// next metatile X is a new block ?
|
|
1191
|
+
if (++xi == 8)
|
|
1192
|
+
{
|
|
1193
|
+
xi = 0;
|
|
1194
|
+
// next column
|
|
1195
|
+
xb = (xb + 1) & map->wMask;
|
|
1196
|
+
// get new block grid index
|
|
1197
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1198
|
+
// get block data pointer
|
|
1199
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1200
|
+
// add base offset
|
|
1201
|
+
block += blockFixedOffset;
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
static void prepareMapDataRow_MTI16_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1207
|
+
{
|
|
1208
|
+
u16 *d1 = bufRow1;
|
|
1209
|
+
u16 *d2 = bufRow2;
|
|
1210
|
+
// number of metatile to decode
|
|
1211
|
+
u16 w = width;
|
|
1212
|
+
|
|
1213
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1214
|
+
u16* blocks = map->blocks;
|
|
1215
|
+
|
|
1216
|
+
// block X position
|
|
1217
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1218
|
+
// base block grid index
|
|
1219
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1220
|
+
// block grid index
|
|
1221
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1222
|
+
// get first block data pointer
|
|
1223
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1224
|
+
// internal block fixed offset (will never change)
|
|
1225
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1226
|
+
// start x position inside block
|
|
1227
|
+
u16 xi = xm & 7;
|
|
1228
|
+
|
|
1229
|
+
// block start offset
|
|
1230
|
+
block += blockFixedOffset + xi;
|
|
1231
|
+
|
|
1232
|
+
// remain metatile ?
|
|
1233
|
+
while(w--)
|
|
1234
|
+
{
|
|
1235
|
+
// metatile index; next col
|
|
1236
|
+
u16 metaTileInd = *block++;
|
|
1237
|
+
// get metatile pointeur
|
|
1238
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1239
|
+
|
|
1240
|
+
// copy tiles attribute
|
|
1241
|
+
*d1++ = *metaTile++;
|
|
1242
|
+
*d1++ = *metaTile++;
|
|
1243
|
+
*d2++ = *metaTile++;
|
|
1244
|
+
*d2++ = *metaTile;
|
|
1245
|
+
|
|
1246
|
+
// next metatile X is a new block ?
|
|
1247
|
+
if (++xi == 8)
|
|
1248
|
+
{
|
|
1249
|
+
xi = 0;
|
|
1250
|
+
// next column
|
|
1251
|
+
xb = (xb + 1) & map->wMask;
|
|
1252
|
+
// get new block grid index
|
|
1253
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1254
|
+
// get block data pointer
|
|
1255
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1256
|
+
// add base offset
|
|
1257
|
+
block += blockFixedOffset;
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
static void prepareMapDataRowEx_MTI8_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1263
|
+
{
|
|
1264
|
+
// we can add both base index and base palette
|
|
1265
|
+
const u16 baseAttr = map->baseTile;
|
|
1266
|
+
|
|
1267
|
+
u16 *d1 = bufRow1;
|
|
1268
|
+
u16 *d2 = bufRow2;
|
|
1269
|
+
// number of metatile to decode
|
|
1270
|
+
u16 w = width;
|
|
1271
|
+
|
|
1272
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1273
|
+
u8* blocks = map->blocks;
|
|
1274
|
+
|
|
1275
|
+
// block X position
|
|
1276
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1277
|
+
// base block grid index
|
|
1278
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1279
|
+
// block grid index
|
|
1280
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1281
|
+
// get first block data pointer
|
|
1282
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1283
|
+
// internal block fixed offset (will never change)
|
|
1284
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1285
|
+
// start x position inside block
|
|
1286
|
+
u16 xi = xm & 7;
|
|
1287
|
+
|
|
1288
|
+
// block start offset
|
|
1289
|
+
block += blockFixedOffset + xi;
|
|
1290
|
+
|
|
1291
|
+
// remain metatile ?
|
|
1292
|
+
while(w--)
|
|
1293
|
+
{
|
|
1294
|
+
// metatile index; next col
|
|
1295
|
+
u8 metaTileInd = *block++;
|
|
1296
|
+
// get metatile pointeur
|
|
1297
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1298
|
+
|
|
1299
|
+
// copy tiles attribute
|
|
1300
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1301
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1302
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
1303
|
+
*d2++ = *metaTile + baseAttr;
|
|
1304
|
+
|
|
1305
|
+
// next metatile X is a new block ?
|
|
1306
|
+
if (++xi == 8)
|
|
1307
|
+
{
|
|
1308
|
+
xi = 0;
|
|
1309
|
+
// next column
|
|
1310
|
+
xb = (xb + 1) & map->wMask;
|
|
1311
|
+
// get new block grid index
|
|
1312
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1313
|
+
// get block data pointer
|
|
1314
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1315
|
+
// add base offset
|
|
1316
|
+
block += blockFixedOffset;
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
static void prepareMapDataRowEx_MTI8_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1322
|
+
{
|
|
1323
|
+
// we can add both base index and base palette
|
|
1324
|
+
const u16 baseAttr = map->baseTile;
|
|
1325
|
+
|
|
1326
|
+
u16 *d1 = bufRow1;
|
|
1327
|
+
u16 *d2 = bufRow2;
|
|
1328
|
+
// number of metatile to decode
|
|
1329
|
+
u16 w = width;
|
|
1330
|
+
|
|
1331
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1332
|
+
u8* blocks = map->blocks;
|
|
1333
|
+
|
|
1334
|
+
// block X position
|
|
1335
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1336
|
+
// base block grid index
|
|
1337
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1338
|
+
// block grid index
|
|
1339
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1340
|
+
// get first block data pointer
|
|
1341
|
+
u8* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1342
|
+
// internal block fixed offset (will never change)
|
|
1343
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1344
|
+
// start x position inside block
|
|
1345
|
+
u16 xi = xm & 7;
|
|
1346
|
+
|
|
1347
|
+
// block start offset
|
|
1348
|
+
block += blockFixedOffset + xi;
|
|
1349
|
+
|
|
1350
|
+
// remain metatile ?
|
|
1351
|
+
while(w--)
|
|
1352
|
+
{
|
|
1353
|
+
// metatile index; next col
|
|
1354
|
+
u8 metaTileInd = *block++;
|
|
1355
|
+
// get metatile pointeur
|
|
1356
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1357
|
+
|
|
1358
|
+
// copy tiles attribute
|
|
1359
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1360
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1361
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
1362
|
+
*d2++ = *metaTile + baseAttr;
|
|
1363
|
+
|
|
1364
|
+
// next metatile X is a new block ?
|
|
1365
|
+
if (++xi == 8)
|
|
1366
|
+
{
|
|
1367
|
+
xi = 0;
|
|
1368
|
+
// next column
|
|
1369
|
+
xb = (xb + 1) & map->wMask;
|
|
1370
|
+
// get new block grid index
|
|
1371
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1372
|
+
// get block data pointer
|
|
1373
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1374
|
+
// add base offset
|
|
1375
|
+
block += blockFixedOffset;
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
static void prepareMapDataRowEx_MTI16_BI8(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1381
|
+
{
|
|
1382
|
+
// we can add both base index and base palette
|
|
1383
|
+
const u16 baseAttr = map->baseTile;
|
|
1384
|
+
|
|
1385
|
+
u16 *d1 = bufRow1;
|
|
1386
|
+
u16 *d2 = bufRow2;
|
|
1387
|
+
// number of metatile to decode
|
|
1388
|
+
u16 w = width;
|
|
1389
|
+
|
|
1390
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1391
|
+
u16* blocks = map->blocks;
|
|
1392
|
+
|
|
1393
|
+
// block X position
|
|
1394
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1395
|
+
// base block grid index
|
|
1396
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1397
|
+
// block grid index
|
|
1398
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1399
|
+
// get first block data pointer
|
|
1400
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1401
|
+
// internal block fixed offset (will never change)
|
|
1402
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1403
|
+
// start x position inside block
|
|
1404
|
+
u16 xi = xm & 7;
|
|
1405
|
+
|
|
1406
|
+
// block start offset
|
|
1407
|
+
block += blockFixedOffset + xi;
|
|
1408
|
+
|
|
1409
|
+
// remain metatile ?
|
|
1410
|
+
while(w--)
|
|
1411
|
+
{
|
|
1412
|
+
// metatile index; next col
|
|
1413
|
+
u16 metaTileInd = *block++;
|
|
1414
|
+
// get metatile pointeur
|
|
1415
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1416
|
+
|
|
1417
|
+
// copy tiles attribute
|
|
1418
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1419
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1420
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
1421
|
+
*d2++ = *metaTile + baseAttr;
|
|
1422
|
+
|
|
1423
|
+
// next metatile X is a new block ?
|
|
1424
|
+
if (++xi == 8)
|
|
1425
|
+
{
|
|
1426
|
+
xi = 0;
|
|
1427
|
+
// next column
|
|
1428
|
+
xb = (xb + 1) & map->wMask;
|
|
1429
|
+
// get new block grid index
|
|
1430
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1431
|
+
// get block data pointer
|
|
1432
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1433
|
+
// add base offset
|
|
1434
|
+
block += blockFixedOffset;
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
static void prepareMapDataRowEx_MTI16_BI16(Map* map, u16 *bufRow1, u16 *bufRow2, u16 xm, u16 ym, u16 width)
|
|
1440
|
+
{
|
|
1441
|
+
// we can add both base index and base palette
|
|
1442
|
+
const u16 baseAttr = map->baseTile;
|
|
1443
|
+
|
|
1444
|
+
u16 *d1 = bufRow1;
|
|
1445
|
+
u16 *d2 = bufRow2;
|
|
1446
|
+
// number of metatile to decode
|
|
1447
|
+
u16 w = width;
|
|
1448
|
+
|
|
1449
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1450
|
+
u16* blocks = map->blocks;
|
|
1451
|
+
|
|
1452
|
+
// block X position
|
|
1453
|
+
u16 xb = (xm / 8) & map->wMask;
|
|
1454
|
+
// base block grid index
|
|
1455
|
+
const u16 baseBlockGridIndex = map->blockRowOffsets[(ym / 8) & map->hMask];
|
|
1456
|
+
// block grid index
|
|
1457
|
+
u16 blockGridIndex = baseBlockGridIndex + xb;
|
|
1458
|
+
// get first block data pointer
|
|
1459
|
+
u16* block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1460
|
+
// internal block fixed offset (will never change)
|
|
1461
|
+
u16 blockFixedOffset = (ym & 7) * 8;
|
|
1462
|
+
// start x position inside block
|
|
1463
|
+
u16 xi = xm & 7;
|
|
1464
|
+
|
|
1465
|
+
// block start offset
|
|
1466
|
+
block += blockFixedOffset + xi;
|
|
1467
|
+
|
|
1468
|
+
// remain metatile ?
|
|
1469
|
+
while(w--)
|
|
1470
|
+
{
|
|
1471
|
+
// metatile index; next col
|
|
1472
|
+
u16 metaTileInd = *block++;
|
|
1473
|
+
// get metatile pointeur
|
|
1474
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1475
|
+
|
|
1476
|
+
// copy tiles attribute
|
|
1477
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1478
|
+
*d1++ = *metaTile++ + baseAttr;
|
|
1479
|
+
*d2++ = *metaTile++ + baseAttr;
|
|
1480
|
+
*d2++ = *metaTile + baseAttr;
|
|
1481
|
+
|
|
1482
|
+
// next metatile X is a new block ?
|
|
1483
|
+
if (++xi == 8)
|
|
1484
|
+
{
|
|
1485
|
+
xi = 0;
|
|
1486
|
+
// next column
|
|
1487
|
+
xb = (xb + 1) & map->wMask;
|
|
1488
|
+
// get new block grid index
|
|
1489
|
+
blockGridIndex = baseBlockGridIndex + xb;
|
|
1490
|
+
// get block data pointer
|
|
1491
|
+
block = &blocks[8 * 8 * blockIndexes[blockGridIndex]];
|
|
1492
|
+
// add base offset
|
|
1493
|
+
block += blockFixedOffset;
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
u16 MAP_getMetaTile(Map* map, u16 x, u16 y)
|
|
1500
|
+
{
|
|
1501
|
+
return map->getMetaTileCB(map, x, y);
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
u16 MAP_getTile(Map* map, u16 x, u16 y)
|
|
1505
|
+
{
|
|
1506
|
+
u16 metaTileInd = map->getMetaTileCB(map, x / 2, y / 2);
|
|
1507
|
+
u16* metaTile = &map->metaTiles[2 * 2 * metaTileInd];
|
|
1508
|
+
return metaTile[((y & 1) * 2) + (x & 1)];
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
void MAP_getMetaTilemapRect(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest)
|
|
1512
|
+
{
|
|
1513
|
+
return map->getMetaTilemapRectCB(map, x, y, w, h, dest);
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
void MAP_getTilemapRect(Map* map, u16 x, u16 y, u16 w, u16 h, bool column, u16* dest)
|
|
1517
|
+
{
|
|
1518
|
+
// destination
|
|
1519
|
+
u16 *d1 = dest;
|
|
1520
|
+
|
|
1521
|
+
// column arrangment ?
|
|
1522
|
+
if (column)
|
|
1523
|
+
{
|
|
1524
|
+
u16 xi = x;
|
|
1525
|
+
u16 wi = w;
|
|
1526
|
+
|
|
1527
|
+
// secondary destination
|
|
1528
|
+
u16 *d2 = dest + (h * 2);
|
|
1529
|
+
// get map col update function pointer
|
|
1530
|
+
void (*updateCol)(Map *map, u16 *d1, u16 *d2, u16 xm, u16 ym, u16 h) = map->prepareMapDataColumnCB;
|
|
1531
|
+
|
|
1532
|
+
while(wi--)
|
|
1533
|
+
{
|
|
1534
|
+
updateCol(map, d1, d2, xi, y, h);
|
|
1535
|
+
// next metatile X
|
|
1536
|
+
xi++;
|
|
1537
|
+
// next metatile column
|
|
1538
|
+
d1 += h * 4;
|
|
1539
|
+
d2 += h * 4;
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
// classic row arrangment
|
|
1543
|
+
else
|
|
1544
|
+
{
|
|
1545
|
+
u16 yi = y;
|
|
1546
|
+
u16 hi = h;
|
|
1547
|
+
|
|
1548
|
+
// secondary destination
|
|
1549
|
+
u16 *d2 = dest + (w * 2);
|
|
1550
|
+
// get map row update function pointer
|
|
1551
|
+
void (*updateRow)(Map *map, u16 *d1, u16 *d2, u16 xm, u16 ym, u16 h) = map->prepareMapDataRowCB;
|
|
1552
|
+
|
|
1553
|
+
while(hi--)
|
|
1554
|
+
{
|
|
1555
|
+
updateRow(map, d1, d2, x, yi, w);
|
|
1556
|
+
// next metatile Y
|
|
1557
|
+
yi++;
|
|
1558
|
+
// next metatile row
|
|
1559
|
+
d1 += w * 4;
|
|
1560
|
+
d2 += w * 4;
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
static u16 getMetaTile_MTI8_BI8(Map* map, u16 x, u16 y)
|
|
1567
|
+
{
|
|
1568
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1569
|
+
u8* blocks = map->blocks;
|
|
1570
|
+
|
|
1571
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1572
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1573
|
+
u8* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xb]];
|
|
1574
|
+
u16 xi = x & 7;
|
|
1575
|
+
u16 yi = y & 7;
|
|
1576
|
+
|
|
1577
|
+
return block[(yi * 8) + xi];
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1580
|
+
static u16 getMetaTile_MTI8_BI16(Map* map, u16 x, u16 y)
|
|
1581
|
+
{
|
|
1582
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1583
|
+
u8* blocks = map->blocks;
|
|
1584
|
+
|
|
1585
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1586
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1587
|
+
u8* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xb]];
|
|
1588
|
+
u16 xi = x & 7;
|
|
1589
|
+
u16 yi = y & 7;
|
|
1590
|
+
|
|
1591
|
+
return block[(yi * 8) + xi];
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
static u16 getMetaTile_MTI16_BI8(Map* map, u16 x, u16 y)
|
|
1595
|
+
{
|
|
1596
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1597
|
+
u16* blocks = map->blocks;
|
|
1598
|
+
|
|
1599
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1600
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1601
|
+
u16* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xb]];
|
|
1602
|
+
u16 xi = x & 7;
|
|
1603
|
+
u16 yi = y & 7;
|
|
1604
|
+
|
|
1605
|
+
return block[(yi * 8) + xi];
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
static u16 getMetaTile_MTI16_BI16(Map* map, u16 x, u16 y)
|
|
1609
|
+
{
|
|
1610
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1611
|
+
u16* blocks = map->blocks;
|
|
1612
|
+
|
|
1613
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1614
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1615
|
+
u16* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xb]];
|
|
1616
|
+
u16 xi = x & 7;
|
|
1617
|
+
u16 yi = y & 7;
|
|
1618
|
+
|
|
1619
|
+
return block[(yi * 8) + xi];
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
static void getMetaTilemapRect_MTI8_BI8(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest)
|
|
1623
|
+
{
|
|
1624
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1625
|
+
u8* blocks = map->blocks;
|
|
1626
|
+
|
|
1627
|
+
// block X position
|
|
1628
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1629
|
+
// block Y position
|
|
1630
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1631
|
+
// start y position inside block
|
|
1632
|
+
u16 yi = y & 7;
|
|
1633
|
+
u16 hi = h;
|
|
1634
|
+
|
|
1635
|
+
// remain metatile ?
|
|
1636
|
+
while(hi--)
|
|
1637
|
+
{
|
|
1638
|
+
// x block position
|
|
1639
|
+
u16 xbi = xb;
|
|
1640
|
+
// start x position inside block
|
|
1641
|
+
u16 xi = x & 7;
|
|
1642
|
+
// get block data pointer
|
|
1643
|
+
u8* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1644
|
+
u16 wi = w;
|
|
1645
|
+
|
|
1646
|
+
// add Y offset
|
|
1647
|
+
block += yi * 8;
|
|
1648
|
+
// add X offset
|
|
1649
|
+
block += xi;
|
|
1650
|
+
|
|
1651
|
+
// remain metatile ?
|
|
1652
|
+
while(wi--)
|
|
1653
|
+
{
|
|
1654
|
+
// store metatile attribute; next col
|
|
1655
|
+
*dest++ = *block++;
|
|
1656
|
+
|
|
1657
|
+
// next metatile X is a new block ?
|
|
1658
|
+
if (++xi == 8)
|
|
1659
|
+
{
|
|
1660
|
+
xi = 0;
|
|
1661
|
+
// next column
|
|
1662
|
+
xbi = (xbi + 1) & map->wMask;
|
|
1663
|
+
// get block data pointer
|
|
1664
|
+
block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1665
|
+
// add Y offset
|
|
1666
|
+
block += yi * 8;
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
// next metatile Y is a new block ?
|
|
1671
|
+
if (++yi == 8)
|
|
1672
|
+
{
|
|
1673
|
+
yi = 0;
|
|
1674
|
+
// next row
|
|
1675
|
+
yb = (yb + 1) & map->hMask;
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
static void getMetaTilemapRect_MTI8_BI16(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest)
|
|
1681
|
+
{
|
|
1682
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1683
|
+
u8* blocks = map->blocks;
|
|
1684
|
+
|
|
1685
|
+
// block X position
|
|
1686
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1687
|
+
// block Y position
|
|
1688
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1689
|
+
// start y position inside block
|
|
1690
|
+
u16 yi = y & 7;
|
|
1691
|
+
u16 hi = h;
|
|
1692
|
+
|
|
1693
|
+
// remain metatile ?
|
|
1694
|
+
while(hi--)
|
|
1695
|
+
{
|
|
1696
|
+
// x block position
|
|
1697
|
+
u16 xbi = xb;
|
|
1698
|
+
// start x position inside block
|
|
1699
|
+
u16 xi = x & 7;
|
|
1700
|
+
// get first block data pointer
|
|
1701
|
+
u8* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1702
|
+
u16 wi = w;
|
|
1703
|
+
|
|
1704
|
+
// add Y offset
|
|
1705
|
+
block += yi * 8;
|
|
1706
|
+
// add X offset
|
|
1707
|
+
block += xi;
|
|
1708
|
+
|
|
1709
|
+
// remain metatile ?
|
|
1710
|
+
while(wi--)
|
|
1711
|
+
{
|
|
1712
|
+
// store metatile attribute; next col
|
|
1713
|
+
*dest++ = *block++;
|
|
1714
|
+
|
|
1715
|
+
// next metatile X is a new block ?
|
|
1716
|
+
if (++xi == 8)
|
|
1717
|
+
{
|
|
1718
|
+
xi = 0;
|
|
1719
|
+
// next column
|
|
1720
|
+
xbi = (xbi + 1) & map->wMask;
|
|
1721
|
+
// get block data pointer
|
|
1722
|
+
block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1723
|
+
// add Y offset
|
|
1724
|
+
block += yi * 8;
|
|
1725
|
+
}
|
|
1726
|
+
}
|
|
1727
|
+
|
|
1728
|
+
// next metatile Y is a new block ?
|
|
1729
|
+
if (++yi == 8)
|
|
1730
|
+
{
|
|
1731
|
+
yi = 0;
|
|
1732
|
+
// next row
|
|
1733
|
+
yb = (yb + 1) & map->hMask;
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
|
|
1738
|
+
static void getMetaTilemapRect_MTI16_BI8(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest)
|
|
1739
|
+
{
|
|
1740
|
+
u8* blockIndexes = map->blockIndexes;
|
|
1741
|
+
u16* blocks = map->blocks;
|
|
1742
|
+
|
|
1743
|
+
// block X position
|
|
1744
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1745
|
+
// block Y position
|
|
1746
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1747
|
+
// start y position inside block
|
|
1748
|
+
u16 yi = y & 7;
|
|
1749
|
+
u16 hi = h;
|
|
1750
|
+
|
|
1751
|
+
// remain metatile ?
|
|
1752
|
+
while(hi--)
|
|
1753
|
+
{
|
|
1754
|
+
// x block position
|
|
1755
|
+
u16 xbi = xb;
|
|
1756
|
+
// start x position inside block
|
|
1757
|
+
u16 xi = x & 7;
|
|
1758
|
+
// get first block data pointer
|
|
1759
|
+
u16* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1760
|
+
u16 wi = w;
|
|
1761
|
+
|
|
1762
|
+
// add Y offset
|
|
1763
|
+
block += yi * 8;
|
|
1764
|
+
// add X offset
|
|
1765
|
+
block += xi;
|
|
1766
|
+
|
|
1767
|
+
// remain metatile ?
|
|
1768
|
+
while(wi--)
|
|
1769
|
+
{
|
|
1770
|
+
// store metatile attribute; next col
|
|
1771
|
+
*dest++ = *block++;
|
|
1772
|
+
|
|
1773
|
+
// next metatile X is a new block ?
|
|
1774
|
+
if (++xi == 8)
|
|
1775
|
+
{
|
|
1776
|
+
xi = 0;
|
|
1777
|
+
// next column
|
|
1778
|
+
xbi = (xbi + 1) & map->wMask;
|
|
1779
|
+
// get block data pointer
|
|
1780
|
+
block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1781
|
+
// add Y offset
|
|
1782
|
+
block += yi * 8;
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
// next metatile Y is a new block ?
|
|
1787
|
+
if (++yi == 8)
|
|
1788
|
+
{
|
|
1789
|
+
yi = 0;
|
|
1790
|
+
// next row
|
|
1791
|
+
yb = (yb + 1) & map->hMask;
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
static void getMetaTilemapRect_MTI16_BI16(Map* map, u16 x, u16 y, u16 w, u16 h, u16* dest)
|
|
1797
|
+
{
|
|
1798
|
+
u16* blockIndexes = map->blockIndexes;
|
|
1799
|
+
u16* blocks = map->blocks;
|
|
1800
|
+
|
|
1801
|
+
// block X position
|
|
1802
|
+
u16 xb = (x / 8) & map->wMask;
|
|
1803
|
+
// block Y position
|
|
1804
|
+
u16 yb = (y / 8) & map->hMask;
|
|
1805
|
+
// start y position inside block
|
|
1806
|
+
u16 yi = y & 7;
|
|
1807
|
+
u16 hi = h;
|
|
1808
|
+
|
|
1809
|
+
// remain metatile ?
|
|
1810
|
+
while(hi--)
|
|
1811
|
+
{
|
|
1812
|
+
// x block position
|
|
1813
|
+
u16 xbi = xb;
|
|
1814
|
+
// start x position inside block
|
|
1815
|
+
u16 xi = x & 7;
|
|
1816
|
+
// get first block data pointer
|
|
1817
|
+
u16* block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1818
|
+
u16 wi = w;
|
|
1819
|
+
|
|
1820
|
+
// add Y offset
|
|
1821
|
+
block += yi * 8;
|
|
1822
|
+
// add X offset
|
|
1823
|
+
block += xi;
|
|
1824
|
+
|
|
1825
|
+
// remain metatile ?
|
|
1826
|
+
while(wi--)
|
|
1827
|
+
{
|
|
1828
|
+
// store metatile attribute; next col
|
|
1829
|
+
*dest++ = *block++;
|
|
1830
|
+
|
|
1831
|
+
// next metatile X is a new block ?
|
|
1832
|
+
if (++xi == 8)
|
|
1833
|
+
{
|
|
1834
|
+
xi = 0;
|
|
1835
|
+
// next column
|
|
1836
|
+
xbi = (xbi + 1) & map->wMask;
|
|
1837
|
+
// get block data pointer
|
|
1838
|
+
block = &blocks[8 * 8 * blockIndexes[map->blockRowOffsets[yb] + xbi]];
|
|
1839
|
+
// add Y offset
|
|
1840
|
+
block += yi * 8;
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
// next metatile Y is a new block ?
|
|
1845
|
+
if (++yi == 8)
|
|
1846
|
+
{
|
|
1847
|
+
yi = 0;
|
|
1848
|
+
// next row
|
|
1849
|
+
yb = (yb + 1) & map->hMask;
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
|
|
1854
|
+
|
|
1855
|
+
void MAP_setDataPatchCallback(Map* map, MapDataPatchCallback *CB)
|
|
1856
|
+
{
|
|
1857
|
+
map->mapDataPatchCB = CB;
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
|
|
1861
|
+
void MAP_overridePlaneSize(Map* map, u16 w, u16 h)
|
|
1862
|
+
{
|
|
1863
|
+
// only 32, 64 or 128 accepted here
|
|
1864
|
+
if (w & 0x80)
|
|
1865
|
+
{
|
|
1866
|
+
map->planeWidth = 128;
|
|
1867
|
+
map->planeWidthMaskAdj = (128 >> 1) - 1;
|
|
1868
|
+
map->planeWidthSftAdj = 7 + 2;
|
|
1869
|
+
|
|
1870
|
+
// plane height fixed to 32
|
|
1871
|
+
map->planeHeight = 32;
|
|
1872
|
+
map->planeHeightMaskAdj = (32 >> 1) - 1;
|
|
1873
|
+
}
|
|
1874
|
+
else if (w & 0x40)
|
|
1875
|
+
{
|
|
1876
|
+
map->planeWidth = 64;
|
|
1877
|
+
map->planeWidthMaskAdj = (64 >> 1) - 1;
|
|
1878
|
+
map->planeWidthSftAdj = 6 + 2;
|
|
1879
|
+
|
|
1880
|
+
// only 64 or 32 accepted for plane height
|
|
1881
|
+
if (h & 0x40)
|
|
1882
|
+
{
|
|
1883
|
+
map->planeHeight = 64;
|
|
1884
|
+
map->planeHeightMaskAdj = (64 >> 1) - 1;
|
|
1885
|
+
}
|
|
1886
|
+
else
|
|
1887
|
+
{
|
|
1888
|
+
map->planeHeight = 32;
|
|
1889
|
+
map->planeHeightMaskAdj = (32 >> 1) - 1;
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
else
|
|
1893
|
+
{
|
|
1894
|
+
map->planeWidth = 32;
|
|
1895
|
+
map->planeWidthMaskAdj = (32 >> 1) - 1;
|
|
1896
|
+
map->planeWidthSftAdj = 5 + 2;
|
|
1897
|
+
|
|
1898
|
+
// plane height can be 128, 64 or 32
|
|
1899
|
+
if (h & 0x80)
|
|
1900
|
+
{
|
|
1901
|
+
map->planeHeight = 128;
|
|
1902
|
+
map->planeHeightMaskAdj = (128 >> 1) - 1;
|
|
1903
|
+
}
|
|
1904
|
+
else if (h & 0x40)
|
|
1905
|
+
{
|
|
1906
|
+
map->planeHeight = 64;
|
|
1907
|
+
map->planeHeightMaskAdj = (64 >> 1) - 1;
|
|
1908
|
+
}
|
|
1909
|
+
else
|
|
1910
|
+
{
|
|
1911
|
+
map->planeHeight = 32;
|
|
1912
|
+
map->planeHeightMaskAdj = (32 >> 1) - 1;
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
}
|