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,2309 @@
|
|
|
1
|
+
#include "config.h"
|
|
2
|
+
#include "types.h"
|
|
3
|
+
|
|
4
|
+
#if LEGACY_SPRITE_ENGINE
|
|
5
|
+
|
|
6
|
+
#include "sprite_eng_legacy.h"
|
|
7
|
+
|
|
8
|
+
#include "sys.h"
|
|
9
|
+
#include "vdp.h"
|
|
10
|
+
#include "vdp_spr.h"
|
|
11
|
+
#include "dma.h"
|
|
12
|
+
#include "memory.h"
|
|
13
|
+
#include "pool.h"
|
|
14
|
+
#include "vram.h"
|
|
15
|
+
#include "tools.h"
|
|
16
|
+
#include "mapper.h"
|
|
17
|
+
|
|
18
|
+
#include "kdebug.h"
|
|
19
|
+
#include "string.h"
|
|
20
|
+
#include "timer.h"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
//#define SPR_DEBUG
|
|
24
|
+
//#define SPR_PROFIL
|
|
25
|
+
|
|
26
|
+
#ifdef SPR_PROFIL
|
|
27
|
+
#define START_PROFIL s32 prof = getSubTick();
|
|
28
|
+
#define END_PROFIL(x) profil_time[x] += getSubTick() - prof;
|
|
29
|
+
#else
|
|
30
|
+
#define START_PROFIL
|
|
31
|
+
#define END_PROFIL(x)
|
|
32
|
+
#endif // SPR_PROFIL
|
|
33
|
+
|
|
34
|
+
// first hardware sprite is reserved (used internally for sorting)
|
|
35
|
+
#define MAX_SPRITE (80 - 1)
|
|
36
|
+
|
|
37
|
+
// internals
|
|
38
|
+
#define VISIBILITY_ON 0xFFFF
|
|
39
|
+
#define VISIBILITY_OFF 0x0000
|
|
40
|
+
|
|
41
|
+
#define ALLOCATED 0x8000
|
|
42
|
+
|
|
43
|
+
#define NEED_ST_POS_UPDATE 0x0001
|
|
44
|
+
#define NEED_ST_ALL_UPDATE 0x0002
|
|
45
|
+
#define NEED_ST_UPDATE 0x0003
|
|
46
|
+
#define NEED_VISIBILITY_UPDATE 0x0004
|
|
47
|
+
#define NEED_FRAME_UPDATE 0x0008
|
|
48
|
+
#define NEED_TILES_UPLOAD 0x0010
|
|
49
|
+
|
|
50
|
+
#define NEED_UPDATE 0x001F
|
|
51
|
+
|
|
52
|
+
#define STATE_ANIMATION_DONE 0x0020
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// shared from vdp_spr.c unit
|
|
56
|
+
extern void logVDPSprite(u16 index);
|
|
57
|
+
// shared from vdp.c unit
|
|
58
|
+
extern void updateUserTileMaxIndex();
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
// forward
|
|
62
|
+
static Sprite* allocateSprite(u16 head);
|
|
63
|
+
static bool releaseSprite(Sprite* sprite);
|
|
64
|
+
|
|
65
|
+
static void setVDPSpriteIndex(Sprite* sprite, u16 ind, u16 num);
|
|
66
|
+
static u16 updateVisibility(Sprite* sprite, u16 status);
|
|
67
|
+
static u16 setVisibility(Sprite* sprite, u16 visibility);
|
|
68
|
+
static u16 updateFrame(Sprite* sprite, u16 status);
|
|
69
|
+
|
|
70
|
+
static void updateSpriteTableAll(Sprite* sprite);
|
|
71
|
+
static void updateSpriteTablePos(Sprite* sprite);
|
|
72
|
+
static void updateSpriteTableHide(Sprite* sprite);
|
|
73
|
+
|
|
74
|
+
static void loadTiles(Sprite* sprite);
|
|
75
|
+
static Sprite* sortSprite(Sprite* sprite);
|
|
76
|
+
static void moveAfter(Sprite* pos, Sprite* sprite);
|
|
77
|
+
static u16 getSpriteIndex(Sprite* sprite);
|
|
78
|
+
static void logSprite(Sprite* sprite);
|
|
79
|
+
|
|
80
|
+
// starter VDP sprite - never visible (used for sprite sorting)
|
|
81
|
+
static VDPSprite* starter;
|
|
82
|
+
|
|
83
|
+
// pool of Sprite objects
|
|
84
|
+
Pool* spritesPool;
|
|
85
|
+
|
|
86
|
+
// pointer on first and last active sprite in the linked list
|
|
87
|
+
Sprite* firstSprite;
|
|
88
|
+
Sprite* lastSprite;
|
|
89
|
+
|
|
90
|
+
// VRAM region allocated for the Sprite Engine
|
|
91
|
+
static VRAMRegion vram;
|
|
92
|
+
|
|
93
|
+
// size of VRAM allocated for Sprite Engine
|
|
94
|
+
u16 spriteVramSize;
|
|
95
|
+
|
|
96
|
+
#ifdef SPR_PROFIL
|
|
97
|
+
|
|
98
|
+
#define PROFIL_ALLOCATE_SPRITE 0
|
|
99
|
+
#define PROFIL_RELEASE_SPRITE 1
|
|
100
|
+
#define PROFIL_ADD_SPRITE 2
|
|
101
|
+
#define PROFIL_REMOVE_SPRITE 3
|
|
102
|
+
#define PROFIL_SET_DEF 4
|
|
103
|
+
#define PROFIL_SET_ATTRIBUTE 5
|
|
104
|
+
#define PROFIL_SET_ANIM_FRAME 6
|
|
105
|
+
#define PROFIL_SET_VRAM_OR_SPRIND 7
|
|
106
|
+
#define PROFIL_SET_VISIBILITY 8
|
|
107
|
+
#define PROFIL_CLEAR 9
|
|
108
|
+
#define PROFIL_UPDATE 10
|
|
109
|
+
#define PROFIL_UPDATE_VISIBILITY 11
|
|
110
|
+
#define PROFIL_SET_VIS_INT 12
|
|
111
|
+
#define PROFIL_UPDATE_FRAME 13
|
|
112
|
+
#define PROFIL_UPDATE_VDPSPRIND 14
|
|
113
|
+
#define PROFIL_UPDATE_VISTABLE 15
|
|
114
|
+
#define PROFIL_UPDATE_SPRITE_TABLE 16
|
|
115
|
+
#define PROFIL_LOADTILES 17
|
|
116
|
+
#define PROFIL_SORT 18
|
|
117
|
+
#define PROFIL_VRAM_DEFRAG 19
|
|
118
|
+
|
|
119
|
+
static u32 profil_time[20];
|
|
120
|
+
#endif
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
NO_INLINE void SPR_initEx(u16 vramSize)
|
|
124
|
+
{
|
|
125
|
+
// end it first (if initialized)
|
|
126
|
+
SPR_end();
|
|
127
|
+
|
|
128
|
+
// create sprites object pool
|
|
129
|
+
spritesPool = POOL_create(MAX_SPRITE, sizeof(Sprite));
|
|
130
|
+
|
|
131
|
+
// store allocated VRAM size to let SGDK know about it
|
|
132
|
+
spriteVramSize = vramSize ? vramSize : 420;
|
|
133
|
+
// and create a VRAM region for sprite tile allocation
|
|
134
|
+
VRAM_createRegion(&vram, TILE_SPRITE_INDEX, spriteVramSize);
|
|
135
|
+
|
|
136
|
+
// need to update user tile max index
|
|
137
|
+
updateUserTileMaxIndex();
|
|
138
|
+
|
|
139
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
|
|
140
|
+
KLog("Sprite engine initialized !");
|
|
141
|
+
KLog_U2_(" VRAM region: [", TILE_SPRITE_INDEX, " - ", TILE_SPRITE_INDEX + (spriteVramSize - 1), "]");
|
|
142
|
+
#endif // LIB_DEBUG
|
|
143
|
+
|
|
144
|
+
// reset
|
|
145
|
+
SPR_reset();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void SPR_init()
|
|
149
|
+
{
|
|
150
|
+
SPR_initEx(420);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
NO_INLINE void SPR_end()
|
|
154
|
+
{
|
|
155
|
+
if (SPR_isInitialized())
|
|
156
|
+
{
|
|
157
|
+
// reset and clear VDP sprite
|
|
158
|
+
VDP_resetSprites();
|
|
159
|
+
VDP_updateSprites(1, DMA_QUEUE_COPY);
|
|
160
|
+
|
|
161
|
+
// release memory
|
|
162
|
+
POOL_destroy(spritesPool);
|
|
163
|
+
spritesPool = NULL;
|
|
164
|
+
VRAM_releaseRegion(&vram);
|
|
165
|
+
spriteVramSize = 0;
|
|
166
|
+
|
|
167
|
+
// need to update user tile max index
|
|
168
|
+
updateUserTileMaxIndex();
|
|
169
|
+
|
|
170
|
+
// try to pack memory free blocks (before to avoid memory fragmentation)
|
|
171
|
+
MEM_pack();
|
|
172
|
+
|
|
173
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
|
|
174
|
+
KLog("Sprite engine ended !");
|
|
175
|
+
#endif
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
bool SPR_isInitialized()
|
|
180
|
+
{
|
|
181
|
+
return (spritesPool != NULL);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
void SPR_reset()
|
|
185
|
+
{
|
|
186
|
+
// release all and clear sprites data
|
|
187
|
+
POOL_reset(spritesPool, TRUE);
|
|
188
|
+
|
|
189
|
+
// no active sprites
|
|
190
|
+
firstSprite = NULL;
|
|
191
|
+
lastSprite = NULL;
|
|
192
|
+
|
|
193
|
+
// clear VRAM region
|
|
194
|
+
VRAM_clearRegion(&vram);
|
|
195
|
+
// reset VDP sprite (allocation and display)
|
|
196
|
+
VDP_resetSprites();
|
|
197
|
+
|
|
198
|
+
// we reserve sprite 0 for sorting (cannot be used for display)
|
|
199
|
+
starter = &vdpSpriteCache[VDP_allocateSprites(1)];
|
|
200
|
+
// hide it (should be already done by VDP_resetSprites)
|
|
201
|
+
starter->y = 0;
|
|
202
|
+
|
|
203
|
+
#ifdef SPR_PROFIL
|
|
204
|
+
memset(profil_time, 0, sizeof(profil_time));
|
|
205
|
+
#endif // SPR_PROFIL
|
|
206
|
+
|
|
207
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
|
|
208
|
+
KLog("Sprite engine reset");
|
|
209
|
+
KLog_U1(" VRAM region free: ", VRAM_getFree(&vram));
|
|
210
|
+
KLog_U1(" Available VDP sprites: ", VDP_getAvailableSprites());
|
|
211
|
+
#endif // LIB_DEBUG
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
static Sprite* allocateSprite(u16 head)
|
|
216
|
+
{
|
|
217
|
+
Sprite* result;
|
|
218
|
+
|
|
219
|
+
// allocate
|
|
220
|
+
result = POOL_allocate(spritesPool);
|
|
221
|
+
// enough sprite remaining ?
|
|
222
|
+
if (result == NULL)
|
|
223
|
+
{
|
|
224
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
225
|
+
KLog("allocateSprite(): failed - no more available sprite !");
|
|
226
|
+
#endif
|
|
227
|
+
|
|
228
|
+
return NULL;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
|
|
232
|
+
kprintf("allocateSprite(): success - allocating sprite at pos %d", POOL_find(spritesPool, result));
|
|
233
|
+
#endif // LIB_DEBUG
|
|
234
|
+
|
|
235
|
+
if (head)
|
|
236
|
+
{
|
|
237
|
+
// add the new sprite at the beginning of the chained list
|
|
238
|
+
if (firstSprite) firstSprite->prev = result;
|
|
239
|
+
result->prev = NULL;
|
|
240
|
+
result->next = firstSprite;
|
|
241
|
+
// update first and last sprite
|
|
242
|
+
if (lastSprite == NULL) lastSprite = result;
|
|
243
|
+
firstSprite = result;
|
|
244
|
+
}
|
|
245
|
+
else
|
|
246
|
+
{
|
|
247
|
+
// add the new sprite at the end of the chained list
|
|
248
|
+
if (lastSprite) lastSprite->next = result;
|
|
249
|
+
result->prev = lastSprite;
|
|
250
|
+
result->next = NULL;
|
|
251
|
+
// update first and last sprite
|
|
252
|
+
if (firstSprite == NULL) firstSprite = result;
|
|
253
|
+
lastSprite = result;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// mark as allocated --> this is done after allocate call, not needed here
|
|
257
|
+
// result->status = ALLOCATED;
|
|
258
|
+
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
static bool releaseSprite(Sprite* sprite)
|
|
263
|
+
{
|
|
264
|
+
START_PROFIL
|
|
265
|
+
|
|
266
|
+
// really allocated ?
|
|
267
|
+
if (sprite->status & ALLOCATED)
|
|
268
|
+
{
|
|
269
|
+
Sprite* prev;
|
|
270
|
+
Sprite* next;
|
|
271
|
+
VDPSprite* lastVDPSprite;
|
|
272
|
+
|
|
273
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
|
|
274
|
+
kprintf("releaseSprite: success - released sprite at pos %d", POOL_find(spritesPool, sprite));
|
|
275
|
+
#endif // LIB_DEBUG
|
|
276
|
+
|
|
277
|
+
// release sprite (we don't need stack coherency here as we don't use stack iteration)
|
|
278
|
+
POOL_release(spritesPool, sprite, FALSE);
|
|
279
|
+
|
|
280
|
+
// remove sprite from chained list
|
|
281
|
+
prev = sprite->prev;
|
|
282
|
+
next = sprite->next;
|
|
283
|
+
|
|
284
|
+
// get the last VDP sprite to link from
|
|
285
|
+
if (prev)
|
|
286
|
+
{
|
|
287
|
+
lastVDPSprite = prev->lastVDPSprite;
|
|
288
|
+
prev->next = next;
|
|
289
|
+
}
|
|
290
|
+
else
|
|
291
|
+
{
|
|
292
|
+
lastVDPSprite = starter;
|
|
293
|
+
// update first sprite
|
|
294
|
+
firstSprite = next;
|
|
295
|
+
}
|
|
296
|
+
// get the next VDP Sprite index to link to
|
|
297
|
+
if (next)
|
|
298
|
+
{
|
|
299
|
+
lastVDPSprite->link = next->VDPSpriteIndex;
|
|
300
|
+
next->prev = prev;
|
|
301
|
+
}
|
|
302
|
+
else
|
|
303
|
+
{
|
|
304
|
+
lastVDPSprite->link = 0;
|
|
305
|
+
// update last sprite
|
|
306
|
+
lastSprite = prev;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// not anymore allocated
|
|
310
|
+
sprite->status &= ~ALLOCATED;
|
|
311
|
+
|
|
312
|
+
END_PROFIL(PROFIL_RELEASE_SPRITE)
|
|
313
|
+
|
|
314
|
+
return TRUE;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
318
|
+
kprintf("SPR_internalReleaseSprite: failed - sprite at address %p is not allocated !", sprite);
|
|
319
|
+
#endif // LIB_DEBUG
|
|
320
|
+
|
|
321
|
+
END_PROFIL(PROFIL_RELEASE_SPRITE)
|
|
322
|
+
|
|
323
|
+
return FALSE;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
static bool isSpriteValid(Sprite* sprite, char* methodName)
|
|
327
|
+
{
|
|
328
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
329
|
+
if (!(sprite->status & ALLOCATED))
|
|
330
|
+
{
|
|
331
|
+
kprintf("%s: error - sprite at address %p is invalid (not allocated) !", methodName, sprite);
|
|
332
|
+
return FALSE;
|
|
333
|
+
}
|
|
334
|
+
#endif
|
|
335
|
+
|
|
336
|
+
return TRUE;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
Sprite* NO_INLINE SPR_addSpriteEx(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 spriteIndex, u16 flag)
|
|
340
|
+
{
|
|
341
|
+
START_PROFIL
|
|
342
|
+
|
|
343
|
+
s16 ind;
|
|
344
|
+
Sprite* sprite;
|
|
345
|
+
|
|
346
|
+
// allocate new sprite
|
|
347
|
+
sprite = allocateSprite(flag & SPR_FLAG_INSERT_HEAD);
|
|
348
|
+
|
|
349
|
+
// can't allocate --> return NULL
|
|
350
|
+
if (!sprite)
|
|
351
|
+
{
|
|
352
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
353
|
+
KDebug_Alert("SPR_addSpriteEx failed: max sprite number reached !");
|
|
354
|
+
#endif
|
|
355
|
+
|
|
356
|
+
return NULL;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
sprite->status = ALLOCATED | (flag & SPR_FLAG_MASK);
|
|
360
|
+
|
|
361
|
+
#ifdef SPR_DEBUG
|
|
362
|
+
KLog_U2("SPR_addSpriteEx: added sprite #", getSpriteIndex(sprite), " - internal position = ", sprite - spritesBank);
|
|
363
|
+
#endif // SPR_DEBUG
|
|
364
|
+
|
|
365
|
+
// auto visibility ?
|
|
366
|
+
if (flag & SPR_FLAG_AUTO_VISIBILITY) sprite->visibility = 0;
|
|
367
|
+
// otherwise we set it to visible by default
|
|
368
|
+
else sprite->visibility = VISIBILITY_ON;
|
|
369
|
+
// initialized with specified flag
|
|
370
|
+
sprite->definition = spriteDef;
|
|
371
|
+
sprite->onFrameChange = NULL;
|
|
372
|
+
|
|
373
|
+
// FIXME: not needed
|
|
374
|
+
// sprite->animation = NULL;
|
|
375
|
+
sprite->frame = NULL;
|
|
376
|
+
|
|
377
|
+
sprite->animInd = -1;
|
|
378
|
+
sprite->frameInd = -1;
|
|
379
|
+
// sprite->seqInd = -1;
|
|
380
|
+
|
|
381
|
+
sprite->x = x + 0x80;
|
|
382
|
+
sprite->y = y + 0x80;
|
|
383
|
+
// depending sprite position (first or last) we set its default depth
|
|
384
|
+
if (flag & SPR_FLAG_INSERT_HEAD) sprite->depth = SPR_MIN_DEPTH;
|
|
385
|
+
else sprite->depth = SPR_MAX_DEPTH;
|
|
386
|
+
|
|
387
|
+
const u16 numVDPSprite = spriteDef->maxNumSprite;
|
|
388
|
+
|
|
389
|
+
// default on sprite init
|
|
390
|
+
sprite->lastNumSprite = numVDPSprite;
|
|
391
|
+
sprite->spriteToHide = 0;
|
|
392
|
+
|
|
393
|
+
// auto VDP sprite alloc enabled ?
|
|
394
|
+
if (flag & SPR_FLAG_AUTO_SPRITE_ALLOC)
|
|
395
|
+
{
|
|
396
|
+
// allocate VDP sprite
|
|
397
|
+
ind = VDP_allocateSprites(numVDPSprite);
|
|
398
|
+
// not enough --> release sprite and return NULL
|
|
399
|
+
if (ind == -1)
|
|
400
|
+
{
|
|
401
|
+
releaseSprite(sprite);
|
|
402
|
+
return NULL;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
#ifdef SPR_DEBUG
|
|
406
|
+
KLog_U3(" allocated ", numVDPSprite, " VDP sprite(s) at ", ind, ", remaining VDP sprite = ", VDP_getAvailableSprites());
|
|
407
|
+
#endif // SPR_DEBUG
|
|
408
|
+
}
|
|
409
|
+
// use given sprite index
|
|
410
|
+
else ind = spriteIndex;
|
|
411
|
+
|
|
412
|
+
// set the VDP Sprite index for this sprite and do attached operation
|
|
413
|
+
setVDPSpriteIndex(sprite, ind, numVDPSprite);
|
|
414
|
+
|
|
415
|
+
// auto VRAM alloc enabled ?
|
|
416
|
+
if (flag & SPR_FLAG_AUTO_VRAM_ALLOC)
|
|
417
|
+
{
|
|
418
|
+
// allocate VRAM
|
|
419
|
+
ind = VRAM_alloc(&vram, spriteDef->maxNumTile);
|
|
420
|
+
// not enough --> release sprite and return NULL
|
|
421
|
+
if (ind < 0)
|
|
422
|
+
{
|
|
423
|
+
// release allocated VDP sprites
|
|
424
|
+
if (flag & SPR_FLAG_AUTO_SPRITE_ALLOC)
|
|
425
|
+
VDP_releaseSprites(sprite->VDPSpriteIndex, numVDPSprite);
|
|
426
|
+
|
|
427
|
+
releaseSprite(sprite);
|
|
428
|
+
return NULL;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// set VRAM index and preserve specific attributs from parameter
|
|
432
|
+
sprite->attribut = ind | (attribut & TILE_ATTR_MASK);
|
|
433
|
+
|
|
434
|
+
#ifdef SPR_DEBUG
|
|
435
|
+
KLog_U3(" allocated ", spriteDef->maxNumTile, " tiles in VRAM at ", ind, ", remaining VRAM: ", VRAM_getFree(&vram));
|
|
436
|
+
#endif // SPR_DEBUG
|
|
437
|
+
}
|
|
438
|
+
// just use the given attribut
|
|
439
|
+
else sprite->attribut = attribut;
|
|
440
|
+
|
|
441
|
+
// set anim and frame to 0 (important to do it after sprite->attribut has been set)
|
|
442
|
+
SPR_setAnimAndFrame(sprite, 0, 0);
|
|
443
|
+
|
|
444
|
+
END_PROFIL(PROFIL_ADD_SPRITE)
|
|
445
|
+
|
|
446
|
+
return sprite;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut)
|
|
450
|
+
{
|
|
451
|
+
return SPR_addSpriteEx(spriteDef, x, y, attribut, 0,
|
|
452
|
+
SPR_FLAG_AUTO_VRAM_ALLOC | SPR_FLAG_AUTO_SPRITE_ALLOC | SPR_FLAG_AUTO_TILE_UPLOAD);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
Sprite* SPR_addSpriteExSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 spriteIndex, u16 flag)
|
|
456
|
+
{
|
|
457
|
+
Sprite* result = SPR_addSpriteEx(spriteDef, x, y, attribut, spriteIndex, flag);
|
|
458
|
+
|
|
459
|
+
// allocation failed ?
|
|
460
|
+
if (result == NULL)
|
|
461
|
+
{
|
|
462
|
+
// try to defragment VRAM, it can help
|
|
463
|
+
SPR_defragVRAM();
|
|
464
|
+
// VRAM is now defragmented, so allocation should pass this time
|
|
465
|
+
result = SPR_addSpriteEx(spriteDef, x, y, attribut, spriteIndex, flag);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return result;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
Sprite* SPR_addSpriteSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut)
|
|
472
|
+
{
|
|
473
|
+
Sprite* result = SPR_addSprite(spriteDef, x, y, attribut);
|
|
474
|
+
|
|
475
|
+
// allocation failed ?
|
|
476
|
+
if (result == NULL)
|
|
477
|
+
{
|
|
478
|
+
// try to defragment VRAM, it can help
|
|
479
|
+
SPR_defragVRAM();
|
|
480
|
+
// VRAM is now defragmented, so allocation should pass this time
|
|
481
|
+
result = SPR_addSprite(spriteDef, x, y, attribut);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
return result;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
void SPR_releaseSprite(Sprite* sprite)
|
|
488
|
+
{
|
|
489
|
+
START_PROFIL
|
|
490
|
+
|
|
491
|
+
#ifdef SPR_DEBUG
|
|
492
|
+
KLog_U2("SPR_releaseSprite: releasing sprite #", getSpriteIndex(sprite), " - internal position = ", sprite - spritesBank);
|
|
493
|
+
#endif // SPR_DEBUG
|
|
494
|
+
|
|
495
|
+
// release sprite
|
|
496
|
+
if (!releaseSprite(sprite))
|
|
497
|
+
{
|
|
498
|
+
END_PROFIL(PROFIL_REMOVE_SPRITE)
|
|
499
|
+
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
u16 status = sprite->status;
|
|
504
|
+
|
|
505
|
+
// auto VDP sprite alloc enabled --> release VDP sprite(s)
|
|
506
|
+
if (status & SPR_FLAG_AUTO_SPRITE_ALLOC)
|
|
507
|
+
{
|
|
508
|
+
VDP_releaseSprites(sprite->VDPSpriteIndex, sprite->definition->maxNumSprite);
|
|
509
|
+
|
|
510
|
+
#ifdef SPR_DEBUG
|
|
511
|
+
KLog_U3(" released ", sprite->definition->maxNumSprite, " VDP sprite(s) at ", sprite->VDPSpriteIndex, ", remaining VDP sprite = ", VDP_getAvailableSprites());
|
|
512
|
+
#endif // SPR_DEBUG
|
|
513
|
+
}
|
|
514
|
+
// auto VRAM alloc enabled --> release VRAM area allocated for this sprite
|
|
515
|
+
if (status & SPR_FLAG_AUTO_VRAM_ALLOC)
|
|
516
|
+
{
|
|
517
|
+
VRAM_free(&vram, sprite->attribut & TILE_INDEX_MASK);
|
|
518
|
+
|
|
519
|
+
#ifdef SPR_DEBUG
|
|
520
|
+
KLog_U3(" released ", sprite->definition->maxNumTile, " tiles in VRAM at ", sprite->attribut & TILE_INDEX_MASK, ", remaining VRAM: ", VRAM_getFree(&vram));
|
|
521
|
+
#endif // SPR_DEBUG
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
END_PROFIL(PROFIL_REMOVE_SPRITE)
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
u16 SPR_getNumActiveSprite()
|
|
528
|
+
{
|
|
529
|
+
return POOL_getNumAllocated(spritesPool);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
NO_INLINE void SPR_defragVRAM()
|
|
533
|
+
{
|
|
534
|
+
START_PROFIL
|
|
535
|
+
|
|
536
|
+
Sprite* sprite;
|
|
537
|
+
|
|
538
|
+
// release VRAM region
|
|
539
|
+
VRAM_releaseRegion(&vram);
|
|
540
|
+
// pack
|
|
541
|
+
MEM_pack();
|
|
542
|
+
// and re-create it
|
|
543
|
+
VRAM_createRegion(&vram, TILE_SPRITE_INDEX, spriteVramSize);
|
|
544
|
+
|
|
545
|
+
// iterate over all sprites to re-allocate auto allocated VRAM
|
|
546
|
+
sprite = firstSprite;
|
|
547
|
+
while(sprite)
|
|
548
|
+
{
|
|
549
|
+
u16 status = sprite->status;
|
|
550
|
+
|
|
551
|
+
// sprite is using auto VRAM allocation ?
|
|
552
|
+
if (status & SPR_FLAG_AUTO_VRAM_ALLOC)
|
|
553
|
+
{
|
|
554
|
+
// re-allocate VRAM for this sprite (can't fail here)
|
|
555
|
+
const u16 ind = VRAM_alloc(&vram, sprite->definition->maxNumTile);
|
|
556
|
+
const u16 attr = sprite->attribut;
|
|
557
|
+
|
|
558
|
+
// VRAM allocation changed ?
|
|
559
|
+
if ((attr & ~TILE_ATTR_MASK) != ind)
|
|
560
|
+
{
|
|
561
|
+
// set VRAM index and preserve previous attributs
|
|
562
|
+
sprite->attribut = ind | (attr & TILE_ATTR_MASK);
|
|
563
|
+
|
|
564
|
+
// need to update VDP sprite table
|
|
565
|
+
status |= NEED_ST_ALL_UPDATE;
|
|
566
|
+
// auto tile upload enabled ? --> need to re upload tile to new location
|
|
567
|
+
if (status & SPR_FLAG_AUTO_TILE_UPLOAD)
|
|
568
|
+
status |= NEED_TILES_UPLOAD;
|
|
569
|
+
|
|
570
|
+
sprite->status = status;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// next sprite
|
|
575
|
+
sprite = sprite->next;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
END_PROFIL(PROFIL_VRAM_DEFRAG)
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
static u16 getTilesetIndex(TileSet** tilesets, u16* indexes, TileSet* tileset, u16 index)
|
|
582
|
+
{
|
|
583
|
+
TileSet** t = tilesets;
|
|
584
|
+
u16* i = indexes;
|
|
585
|
+
|
|
586
|
+
// try fo find if tileset already exist
|
|
587
|
+
while(*t)
|
|
588
|
+
{
|
|
589
|
+
// find the tileset, return its index
|
|
590
|
+
if (*t == tileset) return *i;
|
|
591
|
+
// next
|
|
592
|
+
t++; i++;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// set new tileset index
|
|
596
|
+
*t = tileset;
|
|
597
|
+
*i = index;
|
|
598
|
+
|
|
599
|
+
return index;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
NO_INLINE u16** SPR_loadAllFrames(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile)
|
|
603
|
+
{
|
|
604
|
+
u16 numFrameTot = 0;
|
|
605
|
+
u16 numTileTot = 0;
|
|
606
|
+
Animation** anim = sprDef->animations;
|
|
607
|
+
const u16 numAnimation = sprDef->numAnimation;
|
|
608
|
+
|
|
609
|
+
for(u16 indAnim = 0; indAnim < numAnimation; indAnim++)
|
|
610
|
+
{
|
|
611
|
+
AnimationFrame** frame = (*anim)->frames;
|
|
612
|
+
const u16 numFrame = (*anim)->numFrame;
|
|
613
|
+
|
|
614
|
+
for(u16 indFrame = 0; indFrame < numFrame; indFrame++)
|
|
615
|
+
{
|
|
616
|
+
numTileTot += (*frame)->tileset->numTile;
|
|
617
|
+
frame++;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
numFrameTot += numFrame;
|
|
621
|
+
anim++;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// allocate result table indexes[numAnim][numFrame]
|
|
625
|
+
u16** indexes = MEM_alloc((numAnimation * sizeof(u16*)) + (numFrameTot * sizeof(u16)));
|
|
626
|
+
// used to detect duplicate
|
|
627
|
+
TileSet** tilesets = MEM_alloc(numFrameTot * sizeof(TileSet*));
|
|
628
|
+
u16* tilesetIndexes = MEM_alloc(numFrameTot * sizeof(u16));
|
|
629
|
+
|
|
630
|
+
// not enough memory
|
|
631
|
+
if ((tilesets == NULL) || (tilesetIndexes == NULL) || (indexes == NULL))
|
|
632
|
+
{
|
|
633
|
+
if (totalNumTile) *totalNumTile = 0;
|
|
634
|
+
if (tilesets) MEM_free(tilesets);
|
|
635
|
+
if (tilesetIndexes) MEM_free(tilesetIndexes);
|
|
636
|
+
if (indexes) MEM_free(indexes);
|
|
637
|
+
|
|
638
|
+
return NULL;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// clear tilesets table
|
|
642
|
+
memset(tilesets, 0, numFrameTot * sizeof(TileSet*));
|
|
643
|
+
|
|
644
|
+
// store pointer
|
|
645
|
+
u16** result = indexes;
|
|
646
|
+
// init frames indexes pointer
|
|
647
|
+
u16* indFrames = (u16*) (indexes + numAnimation);
|
|
648
|
+
|
|
649
|
+
// start index
|
|
650
|
+
u16 tileInd = index;
|
|
651
|
+
anim = sprDef->animations;
|
|
652
|
+
|
|
653
|
+
for(u16 indAnim = 0; indAnim < numAnimation; indAnim++)
|
|
654
|
+
{
|
|
655
|
+
// store frames indexes pointer for this animation
|
|
656
|
+
*indexes++ = indFrames;
|
|
657
|
+
|
|
658
|
+
AnimationFrame** frame = (*anim)->frames;
|
|
659
|
+
const u16 numFrame = (*anim)->numFrame;
|
|
660
|
+
|
|
661
|
+
for(u16 indFrame = 0; indFrame < numFrame; indFrame++)
|
|
662
|
+
{
|
|
663
|
+
const TileSet* tileset = (*frame)->tileset;
|
|
664
|
+
const u16 ind = getTilesetIndex(tilesets, tilesetIndexes, (TileSet*) tileset, tileInd);
|
|
665
|
+
|
|
666
|
+
// new tileset ?
|
|
667
|
+
if (ind == tileInd)
|
|
668
|
+
{
|
|
669
|
+
// load tileset
|
|
670
|
+
VDP_loadTileSet(tileset, tileInd, DMA);
|
|
671
|
+
// next tileset
|
|
672
|
+
tileInd += tileset->numTile;
|
|
673
|
+
}
|
|
674
|
+
// store frame tile index
|
|
675
|
+
*indFrames++ = ind;
|
|
676
|
+
// next frame
|
|
677
|
+
frame++;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
anim++;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// store total num tile (discarding duplicated tilesets)
|
|
684
|
+
if (totalNumTile) *totalNumTile = (tileInd - index);
|
|
685
|
+
|
|
686
|
+
MEM_free(tilesets);
|
|
687
|
+
MEM_free(tilesetIndexes);
|
|
688
|
+
MEM_pack();
|
|
689
|
+
|
|
690
|
+
return result;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
NO_INLINE bool SPR_setDefinition(Sprite* sprite, const SpriteDefinition* spriteDef)
|
|
695
|
+
{
|
|
696
|
+
START_PROFIL
|
|
697
|
+
|
|
698
|
+
#ifdef SPR_DEBUG
|
|
699
|
+
KLog_U1("SPR_setDefinition: #", getSpriteIndex(sprite));
|
|
700
|
+
#endif // SPR_DEBUG
|
|
701
|
+
|
|
702
|
+
if (!isSpriteValid(sprite, "SPR_setDefinition"))
|
|
703
|
+
return FALSE;
|
|
704
|
+
|
|
705
|
+
// nothing to do...
|
|
706
|
+
if (sprite->definition == spriteDef) return TRUE;
|
|
707
|
+
|
|
708
|
+
u16 status = sprite->status;
|
|
709
|
+
const u16 oldNumSprite = sprite->definition->maxNumSprite;
|
|
710
|
+
const u16 newNumSprite = spriteDef->maxNumSprite;
|
|
711
|
+
|
|
712
|
+
// definition changed --> re-init that
|
|
713
|
+
sprite->lastNumSprite = newNumSprite;
|
|
714
|
+
sprite->spriteToHide = 0;
|
|
715
|
+
|
|
716
|
+
// auto VDP sprite alloc enabled and sprite number changed ? --> realloc VDP sprite(s)
|
|
717
|
+
if ((status & SPR_FLAG_AUTO_SPRITE_ALLOC) && (oldNumSprite != newNumSprite))
|
|
718
|
+
{
|
|
719
|
+
// we release previous allocated VDP sprite(s)
|
|
720
|
+
VDP_releaseSprites(sprite->VDPSpriteIndex, oldNumSprite);
|
|
721
|
+
|
|
722
|
+
#ifdef SPR_DEBUG
|
|
723
|
+
KLog_U3(" released ", oldNumSprite, " VDP sprite(s) at ", sprite->VDPSpriteIndex, ", remaining VDP sprite = ", VDP_getAvailableSprites());
|
|
724
|
+
#endif // SPR_DEBUG
|
|
725
|
+
|
|
726
|
+
// then we allocate the VDP sprite(s) for the new definition
|
|
727
|
+
const s16 ind = VDP_allocateSprites(newNumSprite);
|
|
728
|
+
// not enough --> return error
|
|
729
|
+
if (ind == -1) return FALSE;
|
|
730
|
+
|
|
731
|
+
// set the VDP Sprite index for this sprite and do attached operation
|
|
732
|
+
setVDPSpriteIndex(sprite, ind, newNumSprite);
|
|
733
|
+
|
|
734
|
+
#ifdef SPR_DEBUG
|
|
735
|
+
KLog_U3(" allocated ", newNumSprite, " VDP sprite(s) at ", ind, ", remaining VDP sprite = ", VDP_getAvailableSprites());
|
|
736
|
+
#endif // SPR_DEBUG
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
const u16 newNumTile = spriteDef->maxNumTile;
|
|
740
|
+
|
|
741
|
+
// auto VRAM alloc enabled --> realloc VRAM tile area
|
|
742
|
+
if ((status & SPR_FLAG_AUTO_VRAM_ALLOC) && (sprite->definition->maxNumTile != newNumTile))
|
|
743
|
+
{
|
|
744
|
+
// we release previous allocated VRAM
|
|
745
|
+
VRAM_free(&vram, sprite->attribut & TILE_INDEX_MASK);
|
|
746
|
+
|
|
747
|
+
#ifdef SPR_DEBUG
|
|
748
|
+
KLog_U3(" released ", sprite->definition->maxNumTile, " tiles in VRAM at ", sprite->attribut & TILE_INDEX_MASK, ", remaining VRAM: ", VRAM_getFree(&vram));
|
|
749
|
+
#endif // SPR_DEBUG
|
|
750
|
+
|
|
751
|
+
// allocate VRAM
|
|
752
|
+
const s16 ind = VRAM_alloc(&vram, newNumTile);
|
|
753
|
+
// not enough --> return error
|
|
754
|
+
if (ind < 0) return FALSE;
|
|
755
|
+
|
|
756
|
+
// preserve the attributes and just overwrite VRAM index (set frame will rebuild everything)
|
|
757
|
+
sprite->attribut = (sprite->attribut & TILE_ATTR_MASK) | ind;
|
|
758
|
+
|
|
759
|
+
#ifdef SPR_DEBUG
|
|
760
|
+
KLog_U3(" allocated ", spriteDef->maxNumTile, " tiles in VRAM at ", ind, ", remaining VRAM: ", VRAM_getFree(&vram));
|
|
761
|
+
#endif // SPR_DEBUG
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
sprite->definition = spriteDef;
|
|
765
|
+
// FIXME: not needed
|
|
766
|
+
// sprite->animation = NULL;
|
|
767
|
+
sprite->frame = NULL;
|
|
768
|
+
sprite->animInd = -1;
|
|
769
|
+
sprite->frameInd = -1;
|
|
770
|
+
// sprite->seqInd = -1;
|
|
771
|
+
|
|
772
|
+
// set anim and frame to 0
|
|
773
|
+
SPR_setAnimAndFrame(sprite, 0, 0);
|
|
774
|
+
|
|
775
|
+
END_PROFIL(PROFIL_SET_DEF)
|
|
776
|
+
|
|
777
|
+
return TRUE;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
s16 SPR_getPositionX(Sprite* sprite)
|
|
781
|
+
{
|
|
782
|
+
return sprite->x - 0x80;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
s16 SPR_getPositionY(Sprite* sprite)
|
|
786
|
+
{
|
|
787
|
+
return sprite->y - 0x80;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
void SPR_setPosition(Sprite* sprite, s16 x, s16 y)
|
|
791
|
+
{
|
|
792
|
+
START_PROFIL
|
|
793
|
+
|
|
794
|
+
const s16 newx = x + 0x80;
|
|
795
|
+
const s16 newy = y + 0x80;
|
|
796
|
+
|
|
797
|
+
#ifdef SPR_DEBUG
|
|
798
|
+
KLog_U3("SPR_setPosition: #", getSpriteIndex(sprite), " X=", newx, " Y=", newy);
|
|
799
|
+
#endif // SPR_DEBUG
|
|
800
|
+
|
|
801
|
+
if (!isSpriteValid(sprite, "SPR_setPosition"))
|
|
802
|
+
return;
|
|
803
|
+
|
|
804
|
+
if ((sprite->x != newx) || (sprite->y != newy))
|
|
805
|
+
{
|
|
806
|
+
u16 status = sprite->status;
|
|
807
|
+
|
|
808
|
+
sprite->x = newx;
|
|
809
|
+
sprite->y = newy;
|
|
810
|
+
|
|
811
|
+
// need to recompute visibility if auto visibility is enabled
|
|
812
|
+
if (status & SPR_FLAG_AUTO_VISIBILITY)
|
|
813
|
+
status |= NEED_VISIBILITY_UPDATE;
|
|
814
|
+
|
|
815
|
+
sprite->status = status | NEED_ST_POS_UPDATE;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
END_PROFIL(PROFIL_SET_ATTRIBUTE)
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
void SPR_setHFlip(Sprite* sprite, bool value)
|
|
822
|
+
{
|
|
823
|
+
START_PROFIL
|
|
824
|
+
|
|
825
|
+
if (!isSpriteValid(sprite, "SPR_setHFlip"))
|
|
826
|
+
return;
|
|
827
|
+
|
|
828
|
+
u16 attr = sprite->attribut;
|
|
829
|
+
|
|
830
|
+
if (attr & TILE_ATTR_HFLIP_MASK)
|
|
831
|
+
{
|
|
832
|
+
// H flip removed
|
|
833
|
+
if (!value)
|
|
834
|
+
{
|
|
835
|
+
// update attribut
|
|
836
|
+
sprite->attribut = attr & ~TILE_ATTR_HFLIP_MASK;
|
|
837
|
+
|
|
838
|
+
#ifdef SPR_DEBUG
|
|
839
|
+
KLog_U1_("SPR_setHFlip: #", getSpriteIndex(sprite), " removed HFlip");
|
|
840
|
+
#endif // SPR_DEBUG
|
|
841
|
+
|
|
842
|
+
// need to recompute visibility if auto visibility is enabled
|
|
843
|
+
if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
|
|
844
|
+
sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
|
|
845
|
+
else
|
|
846
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
else
|
|
850
|
+
{
|
|
851
|
+
// H flip set
|
|
852
|
+
if (value)
|
|
853
|
+
{
|
|
854
|
+
// update attribut
|
|
855
|
+
sprite->attribut = attr | TILE_ATTR_HFLIP_MASK;
|
|
856
|
+
|
|
857
|
+
#ifdef SPR_DEBUG
|
|
858
|
+
KLog_U1_("SPR_setHFlip: #", getSpriteIndex(sprite), " added HFlip");
|
|
859
|
+
#endif // SPR_DEBUG
|
|
860
|
+
|
|
861
|
+
// need to recompute visibility if auto visibility is enabled
|
|
862
|
+
if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
|
|
863
|
+
sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
|
|
864
|
+
else
|
|
865
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
END_PROFIL(PROFIL_SET_ATTRIBUTE)
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
void SPR_setVFlip(Sprite* sprite, bool value)
|
|
873
|
+
{
|
|
874
|
+
START_PROFIL
|
|
875
|
+
|
|
876
|
+
if (!isSpriteValid(sprite, "SPR_setVFlip"))
|
|
877
|
+
return;
|
|
878
|
+
|
|
879
|
+
u16 attr = sprite->attribut;
|
|
880
|
+
|
|
881
|
+
if (attr & TILE_ATTR_VFLIP_MASK)
|
|
882
|
+
{
|
|
883
|
+
// V flip removed
|
|
884
|
+
if (!value)
|
|
885
|
+
{
|
|
886
|
+
// update attribut
|
|
887
|
+
sprite->attribut = attr & ~TILE_ATTR_VFLIP_MASK;
|
|
888
|
+
|
|
889
|
+
#ifdef SPR_DEBUG
|
|
890
|
+
KLog_U1_("SPR_setVFlip: #", getSpriteIndex(sprite), " removed VFlip");
|
|
891
|
+
#endif // SPR_DEBUG
|
|
892
|
+
|
|
893
|
+
// need to recompute visibility if auto visibility is enabled
|
|
894
|
+
if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
|
|
895
|
+
sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
|
|
896
|
+
else
|
|
897
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
else
|
|
901
|
+
{
|
|
902
|
+
// V flip set
|
|
903
|
+
if (value)
|
|
904
|
+
{
|
|
905
|
+
// update attribut
|
|
906
|
+
sprite->attribut = attr | TILE_ATTR_VFLIP_MASK;
|
|
907
|
+
|
|
908
|
+
#ifdef SPR_DEBUG
|
|
909
|
+
KLog_U1_("SPR_setVFlip: #", getSpriteIndex(sprite), " added VFlip");
|
|
910
|
+
#endif // SPR_DEBUG
|
|
911
|
+
|
|
912
|
+
// need to recompute visibility if auto visibility is enabled
|
|
913
|
+
if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
|
|
914
|
+
sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
|
|
915
|
+
else
|
|
916
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
END_PROFIL(PROFIL_SET_ATTRIBUTE)
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
void SPR_setPriority(Sprite* sprite, bool value)
|
|
924
|
+
{
|
|
925
|
+
START_PROFIL
|
|
926
|
+
|
|
927
|
+
if (!isSpriteValid(sprite, "SPR_setPriority"))
|
|
928
|
+
return;
|
|
929
|
+
|
|
930
|
+
const u16 attr = sprite->attribut;
|
|
931
|
+
|
|
932
|
+
if (attr & TILE_ATTR_PRIORITY_MASK)
|
|
933
|
+
{
|
|
934
|
+
// priority removed
|
|
935
|
+
if (!value)
|
|
936
|
+
{
|
|
937
|
+
sprite->attribut = attr & (~TILE_ATTR_PRIORITY_MASK);
|
|
938
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
939
|
+
|
|
940
|
+
#ifdef SPR_DEBUG
|
|
941
|
+
KLog_U1_("SPR_setPriority: #", getSpriteIndex(sprite), " removed priority");
|
|
942
|
+
#endif // SPR_DEBUG
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
else
|
|
946
|
+
{
|
|
947
|
+
// priority set
|
|
948
|
+
if (value)
|
|
949
|
+
{
|
|
950
|
+
sprite->attribut = attr | TILE_ATTR_PRIORITY_MASK;
|
|
951
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
952
|
+
|
|
953
|
+
#ifdef SPR_DEBUG
|
|
954
|
+
KLog_U1_("SPR_setPriority: #", getSpriteIndex(sprite), " added priority");
|
|
955
|
+
#endif // SPR_DEBUG
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
END_PROFIL(PROFIL_SET_ATTRIBUTE)
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
void SPR_setPalette(Sprite* sprite, u16 value)
|
|
963
|
+
{
|
|
964
|
+
START_PROFIL
|
|
965
|
+
|
|
966
|
+
if (!isSpriteValid(sprite, "SPR_setPalette"))
|
|
967
|
+
return;
|
|
968
|
+
|
|
969
|
+
const u16 oldAttribut = sprite->attribut;
|
|
970
|
+
const u16 newAttribut = (oldAttribut & (~TILE_ATTR_PALETTE_MASK)) | (value << TILE_ATTR_PALETTE_SFT);
|
|
971
|
+
|
|
972
|
+
if (oldAttribut != newAttribut)
|
|
973
|
+
{
|
|
974
|
+
sprite->attribut = newAttribut;
|
|
975
|
+
// need to update VDP sprite attribut field only
|
|
976
|
+
sprite->status |= NEED_ST_ALL_UPDATE;
|
|
977
|
+
|
|
978
|
+
#ifdef SPR_DEBUG
|
|
979
|
+
KLog_U2("SPR_setPalette: #", getSpriteIndex(sprite), " palette=", value);
|
|
980
|
+
#endif // SPR_DEBUG
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
END_PROFIL(PROFIL_SET_ATTRIBUTE)
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
void SPR_setDepth(Sprite* sprite, s16 value)
|
|
987
|
+
{
|
|
988
|
+
START_PROFIL
|
|
989
|
+
|
|
990
|
+
if (!isSpriteValid(sprite, "SPR_setDepth"))
|
|
991
|
+
return;
|
|
992
|
+
|
|
993
|
+
// depth changed ?
|
|
994
|
+
if (sprite->depth != value)
|
|
995
|
+
{
|
|
996
|
+
#ifdef SPR_DEBUG
|
|
997
|
+
KLog_U2("SPR_setDepth: #", getSpriteIndex(sprite), " Depth=", value);
|
|
998
|
+
#endif // SPR_DEBUG
|
|
999
|
+
|
|
1000
|
+
// set depth and sort sprite (need to be done immediately to get consistent sort)
|
|
1001
|
+
sprite->depth = value;
|
|
1002
|
+
sortSprite(sprite);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
END_PROFIL(PROFIL_SET_ATTRIBUTE)
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
void SPR_setZ(Sprite* sprite, s16 value)
|
|
1009
|
+
{
|
|
1010
|
+
SPR_setDepth(sprite, value);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
void SPR_setAlwaysOnTop(Sprite* sprite)
|
|
1014
|
+
{
|
|
1015
|
+
SPR_setDepth(sprite, SPR_MIN_DEPTH);
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
void SPR_setAlwaysAtBottom(Sprite* sprite)
|
|
1019
|
+
{
|
|
1020
|
+
SPR_setDepth(sprite, SPR_MAX_DEPTH);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
void SPR_setAnimAndFrame(Sprite* sprite, s16 anim, s16 frame)
|
|
1024
|
+
{
|
|
1025
|
+
START_PROFIL
|
|
1026
|
+
|
|
1027
|
+
if (!isSpriteValid(sprite, "SPR_setAnimAndFrame"))
|
|
1028
|
+
return;
|
|
1029
|
+
|
|
1030
|
+
if ((sprite->animInd != anim) || (sprite->frameInd != frame))
|
|
1031
|
+
{
|
|
1032
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
1033
|
+
if (anim >= (s16) sprite->definition->numAnimation)
|
|
1034
|
+
{
|
|
1035
|
+
kprintf("SPR_setAnimAndFrame: error - trying to use non existing animation #%d on definition=%p - num animation = %d", anim, sprite->definition, sprite->definition->numAnimation);
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
1038
|
+
#endif // LIB_DEBUG
|
|
1039
|
+
|
|
1040
|
+
Animation* animation = sprite->definition->animations[anim];
|
|
1041
|
+
|
|
1042
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
1043
|
+
if (frame >= (s16) animation->numFrame)
|
|
1044
|
+
{
|
|
1045
|
+
kprintf("SPR_setAnimAndFrame: error - trying to use non existing frame #%d for animation %d on definition=%p - num frame = %d", frame, anim, sprite->definition, animation->numFrame);
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
#endif // LIB_DEBUG
|
|
1049
|
+
|
|
1050
|
+
sprite->animInd = anim;
|
|
1051
|
+
sprite->frameInd = frame;
|
|
1052
|
+
sprite->animation = animation;
|
|
1053
|
+
|
|
1054
|
+
// set timer to 0 to prevent auto animation to change frame in between
|
|
1055
|
+
if (sprite->timer > 0)
|
|
1056
|
+
sprite->timer = 0;
|
|
1057
|
+
|
|
1058
|
+
#ifdef SPR_DEBUG
|
|
1059
|
+
KLog_U3("SPR_setAnimAndFrame: #", getSpriteIndex(sprite), " anim=", anim, " frame=", frame);
|
|
1060
|
+
#endif // SPR_DEBUG
|
|
1061
|
+
|
|
1062
|
+
sprite->status |= NEED_FRAME_UPDATE;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
END_PROFIL(PROFIL_SET_ANIM_FRAME)
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
void SPR_setAnim(Sprite* sprite, s16 anim)
|
|
1069
|
+
{
|
|
1070
|
+
START_PROFIL
|
|
1071
|
+
|
|
1072
|
+
if (!isSpriteValid(sprite, "SPR_setAnim"))
|
|
1073
|
+
return;
|
|
1074
|
+
|
|
1075
|
+
if (sprite->animInd != anim)
|
|
1076
|
+
{
|
|
1077
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
1078
|
+
if (anim >= (s16) sprite->definition->numAnimation)
|
|
1079
|
+
{
|
|
1080
|
+
kprintf("SPR_setAnim: error - trying to use non existing animation #%d on definition=%p - num animation = %d", anim, sprite->definition, sprite->definition->numAnimation);
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
#endif // LIB_DEBUG
|
|
1084
|
+
|
|
1085
|
+
sprite->animInd = anim;
|
|
1086
|
+
// first frame by default
|
|
1087
|
+
sprite->frameInd = 0;
|
|
1088
|
+
sprite->animation = sprite->definition->animations[anim];
|
|
1089
|
+
|
|
1090
|
+
// set timer to 0 to prevent auto animation to change frame in between
|
|
1091
|
+
if (sprite->timer > 0)
|
|
1092
|
+
sprite->timer = 0;
|
|
1093
|
+
|
|
1094
|
+
#ifdef SPR_DEBUG
|
|
1095
|
+
KLog_U2_("SPR_setAnim: #", getSpriteIndex(sprite), " anim=", anim, " frame=0");
|
|
1096
|
+
#endif // SPR_DEBUG
|
|
1097
|
+
|
|
1098
|
+
sprite->status |= NEED_FRAME_UPDATE;
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
END_PROFIL(PROFIL_SET_ANIM_FRAME)
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
void SPR_setFrame(Sprite* sprite, s16 frame)
|
|
1105
|
+
{
|
|
1106
|
+
START_PROFIL
|
|
1107
|
+
|
|
1108
|
+
if (!isSpriteValid(sprite, "SPR_setFrame"))
|
|
1109
|
+
return;
|
|
1110
|
+
|
|
1111
|
+
if (sprite->frameInd != frame)
|
|
1112
|
+
{
|
|
1113
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
1114
|
+
if (frame >= (s16) sprite->animation->numFrame)
|
|
1115
|
+
{
|
|
1116
|
+
kprintf("SPR_setFrame: error - trying to use non existing frame #%d for animation %d on definition=%p - num frame = %d", frame, sprite->animInd, sprite->definition, sprite->animation->numFrame);
|
|
1117
|
+
return;
|
|
1118
|
+
}
|
|
1119
|
+
#endif // LIB_DEBUG
|
|
1120
|
+
|
|
1121
|
+
sprite->frameInd = frame;
|
|
1122
|
+
|
|
1123
|
+
// set timer to 0 to prevent auto animation to change frame in between
|
|
1124
|
+
if (sprite->timer > 0)
|
|
1125
|
+
sprite->timer = 0;
|
|
1126
|
+
|
|
1127
|
+
#ifdef SPR_DEBUG
|
|
1128
|
+
KLog_U2("SPR_setFrame: #", getSpriteIndex(sprite), " frame=", frame);
|
|
1129
|
+
#endif // SPR_DEBUG
|
|
1130
|
+
|
|
1131
|
+
sprite->status |= NEED_FRAME_UPDATE;
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
END_PROFIL(PROFIL_SET_ANIM_FRAME)
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
void SPR_nextFrame(Sprite* sprite)
|
|
1138
|
+
{
|
|
1139
|
+
START_PROFIL
|
|
1140
|
+
|
|
1141
|
+
if (!isSpriteValid(sprite, "SPR_nextFrame"))
|
|
1142
|
+
return;
|
|
1143
|
+
|
|
1144
|
+
const Animation *anim = sprite->animation;
|
|
1145
|
+
u16 frameInd = sprite->frameInd + 1;
|
|
1146
|
+
|
|
1147
|
+
if (frameInd >= anim->numFrame)
|
|
1148
|
+
{
|
|
1149
|
+
// no loop ?
|
|
1150
|
+
if (sprite->status & SPR_FLAG_DISABLE_ANIMATION_LOOP)
|
|
1151
|
+
{
|
|
1152
|
+
// can quit now
|
|
1153
|
+
END_PROFIL(PROFIL_SET_ANIM_FRAME)
|
|
1154
|
+
return;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
// loop
|
|
1158
|
+
frameInd = anim->loop;
|
|
1159
|
+
// set animation done state (allows SPR_isAnimationDone(..) to correctly report state when called from frame change callback)
|
|
1160
|
+
sprite->status |= STATE_ANIMATION_DONE;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
// set new frame
|
|
1164
|
+
SPR_setFrame(sprite, frameInd);
|
|
1165
|
+
|
|
1166
|
+
END_PROFIL(PROFIL_SET_ANIM_FRAME)
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
void SPR_setAutoAnimation(Sprite* sprite, bool value)
|
|
1170
|
+
{
|
|
1171
|
+
// for debug
|
|
1172
|
+
if (!isSpriteValid(sprite, "SPR_setAutoAnimation"))
|
|
1173
|
+
return;
|
|
1174
|
+
|
|
1175
|
+
if (value)
|
|
1176
|
+
{
|
|
1177
|
+
// currently disabled ? --> reset timer to current frame timer
|
|
1178
|
+
if (sprite->timer == -1)
|
|
1179
|
+
sprite->timer = sprite->frame->timer;
|
|
1180
|
+
}
|
|
1181
|
+
else
|
|
1182
|
+
{
|
|
1183
|
+
// disable it
|
|
1184
|
+
sprite->timer = -1;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
#ifdef SPR_DEBUG
|
|
1188
|
+
KLog_U2("SPR_setAutoAnimation: #", getSpriteIndex(sprite), " AutoAnimation=", value);
|
|
1189
|
+
#endif // SPR_DEBUG
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
bool SPR_getAutoAnimation(Sprite* sprite)
|
|
1193
|
+
{
|
|
1194
|
+
// for debug
|
|
1195
|
+
if (!isSpriteValid(sprite, "SPR_getAutoAnimation"))
|
|
1196
|
+
return FALSE;
|
|
1197
|
+
|
|
1198
|
+
return (sprite->timer != -1)?TRUE:FALSE;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
void SPR_setAnimationLoop(Sprite* sprite, bool value)
|
|
1202
|
+
{
|
|
1203
|
+
// for debug
|
|
1204
|
+
if (!isSpriteValid(sprite, "SPR_setAnimationLoop"))
|
|
1205
|
+
return;
|
|
1206
|
+
|
|
1207
|
+
if (value) sprite->status &= ~SPR_FLAG_DISABLE_ANIMATION_LOOP;
|
|
1208
|
+
else sprite->status |= SPR_FLAG_DISABLE_ANIMATION_LOOP;
|
|
1209
|
+
|
|
1210
|
+
#ifdef SPR_DEBUG
|
|
1211
|
+
KLog_U2("SPR_setAnimationLoop: #", getSpriteIndex(sprite), " loop=", value);
|
|
1212
|
+
#endif // SPR_DEBUG
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
bool SPR_isAnimationDone(Sprite* sprite)
|
|
1216
|
+
{
|
|
1217
|
+
// for debug
|
|
1218
|
+
if (!isSpriteValid(sprite, "SPR_isAnimationDone"))
|
|
1219
|
+
return FALSE;
|
|
1220
|
+
|
|
1221
|
+
// check for animation done state (mainly used for frame change callback) or
|
|
1222
|
+
return (sprite->status & STATE_ANIMATION_DONE) ||
|
|
1223
|
+
// if we are on last tick from last frame (if auto animation is disabled then only test for last frame)
|
|
1224
|
+
((sprite->frameInd == (sprite->animation->numFrame - 1)) && ((sprite->timer == 1) || (sprite->timer == -1)));
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value)
|
|
1229
|
+
{
|
|
1230
|
+
START_PROFIL
|
|
1231
|
+
|
|
1232
|
+
if (!isSpriteValid(sprite, "SPR_setVRAMTileIndex"))
|
|
1233
|
+
return FALSE;
|
|
1234
|
+
|
|
1235
|
+
s16 newInd;
|
|
1236
|
+
u16 status = sprite->status;
|
|
1237
|
+
u16 oldAttribut = sprite->attribut;
|
|
1238
|
+
|
|
1239
|
+
if (status & SPR_FLAG_AUTO_VRAM_ALLOC)
|
|
1240
|
+
{
|
|
1241
|
+
// pass to manual allocation
|
|
1242
|
+
if (value != -1)
|
|
1243
|
+
{
|
|
1244
|
+
// remove auto vram alloc flag
|
|
1245
|
+
status &= ~SPR_FLAG_AUTO_VRAM_ALLOC;
|
|
1246
|
+
// release allocated VRAM first
|
|
1247
|
+
VRAM_free(&vram, oldAttribut & TILE_INDEX_MASK);
|
|
1248
|
+
// set fixed VRAM index
|
|
1249
|
+
newInd = value;
|
|
1250
|
+
|
|
1251
|
+
#ifdef SPR_DEBUG
|
|
1252
|
+
KLog_U2("SPR_setVRAMTileIndex: #", getSpriteIndex(sprite), " passed to manual allocation, VRAM index =", value);
|
|
1253
|
+
KLog_U3(" released ", sprite->definition->maxNumTile, " tiles in VRAM at ", sprite->attribut & TILE_INDEX_MASK, ", remaining VRAM: ", VRAM_getFree(&vram));
|
|
1254
|
+
#endif // SPR_DEBUG
|
|
1255
|
+
}
|
|
1256
|
+
// nothing to do --> just return TRUE
|
|
1257
|
+
else
|
|
1258
|
+
{
|
|
1259
|
+
END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
|
|
1260
|
+
|
|
1261
|
+
return TRUE;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
else
|
|
1265
|
+
{
|
|
1266
|
+
// pass to auto allocation
|
|
1267
|
+
if (value == -1)
|
|
1268
|
+
{
|
|
1269
|
+
// set auto vram alloc flag
|
|
1270
|
+
status |= SPR_FLAG_AUTO_VRAM_ALLOC;
|
|
1271
|
+
// allocate VRAM
|
|
1272
|
+
newInd = VRAM_alloc(&vram, sprite->definition->maxNumTile);
|
|
1273
|
+
|
|
1274
|
+
#ifdef SPR_DEBUG
|
|
1275
|
+
KLog_U1_("SPR_setVRAMTileIndex: #", getSpriteIndex(sprite), " passed to auto allocation");
|
|
1276
|
+
KLog_U3(" allocated ", sprite->definition->maxNumTile, " tiles in VRAM at ", newInd, ", remaining VRAM: ", VRAM_getFree(&vram));
|
|
1277
|
+
#endif // SPR_DEBUG
|
|
1278
|
+
|
|
1279
|
+
// can't allocate ?
|
|
1280
|
+
if (newInd < 0)
|
|
1281
|
+
{
|
|
1282
|
+
// save status and return FALSE
|
|
1283
|
+
sprite->status = status;
|
|
1284
|
+
|
|
1285
|
+
END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
|
|
1286
|
+
|
|
1287
|
+
return FALSE;
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
// just use the new value for index
|
|
1291
|
+
else newInd = value;
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
// VRAM tile index changed ?
|
|
1295
|
+
if ((oldAttribut & TILE_INDEX_MASK) != (u16) newInd)
|
|
1296
|
+
{
|
|
1297
|
+
sprite->attribut = (oldAttribut & TILE_ATTR_MASK) | newInd;
|
|
1298
|
+
// need to update sprite table
|
|
1299
|
+
status |= NEED_ST_ALL_UPDATE;
|
|
1300
|
+
// auto tile upload enabled ? --> need to re upload tile to new location
|
|
1301
|
+
if (status & SPR_FLAG_AUTO_TILE_UPLOAD)
|
|
1302
|
+
status |= NEED_TILES_UPLOAD;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
// save status
|
|
1306
|
+
sprite->status = status;
|
|
1307
|
+
|
|
1308
|
+
END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
|
|
1309
|
+
|
|
1310
|
+
return TRUE;
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
bool SPR_setSpriteTableIndex(Sprite* sprite, s16 value)
|
|
1314
|
+
{
|
|
1315
|
+
START_PROFIL
|
|
1316
|
+
|
|
1317
|
+
if (!isSpriteValid(sprite, "SPR_setSpriteTableIndex"))
|
|
1318
|
+
return FALSE;
|
|
1319
|
+
|
|
1320
|
+
s16 newInd;
|
|
1321
|
+
u16 status = sprite->status;
|
|
1322
|
+
u16 num = sprite->definition->maxNumSprite;
|
|
1323
|
+
|
|
1324
|
+
if (status & SPR_FLAG_AUTO_SPRITE_ALLOC)
|
|
1325
|
+
{
|
|
1326
|
+
// pass to manual allocation
|
|
1327
|
+
if (value != -1)
|
|
1328
|
+
{
|
|
1329
|
+
// remove auto VDP sprite alloc flag
|
|
1330
|
+
status &= ~SPR_FLAG_AUTO_SPRITE_ALLOC;
|
|
1331
|
+
// release allocated VDP sprite
|
|
1332
|
+
VDP_releaseSprites(sprite->VDPSpriteIndex, num);
|
|
1333
|
+
// set manually the VDP sprite index
|
|
1334
|
+
newInd = value;
|
|
1335
|
+
|
|
1336
|
+
#ifdef SPR_DEBUG
|
|
1337
|
+
KLog_U2("SPR_setSpriteTableIndex: #", getSpriteIndex(sprite), " passed to manual allocation, VDP Sprite index =", value);
|
|
1338
|
+
KLog_U3(" released ", num, " VDP sprite(s) at ", sprite->VDPSpriteIndex, ", remaining VDP sprite = ", VDP_getAvailableSprites());
|
|
1339
|
+
#endif // SPR_DEBUG
|
|
1340
|
+
}
|
|
1341
|
+
// nothing to do --> return TRUE
|
|
1342
|
+
else
|
|
1343
|
+
{
|
|
1344
|
+
END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
|
|
1345
|
+
|
|
1346
|
+
return TRUE;
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
else
|
|
1350
|
+
{
|
|
1351
|
+
// pass to auto allocation
|
|
1352
|
+
if (value == -1)
|
|
1353
|
+
{
|
|
1354
|
+
// set auto VDP sprite alloc flag
|
|
1355
|
+
status |= SPR_FLAG_AUTO_SPRITE_ALLOC;
|
|
1356
|
+
// allocate VDP sprite
|
|
1357
|
+
newInd = VDP_allocateSprites(num);
|
|
1358
|
+
|
|
1359
|
+
#ifdef SPR_DEBUG
|
|
1360
|
+
KLog_U1_("SPR_setSpriteTableIndex: #", getSpriteIndex(sprite), " passed to auto allocation");
|
|
1361
|
+
KLog_U3(" allocated ", num, " VDP sprite(s) at ", newInd, ", remaining VDP sprite = ", VDP_getAvailableSprites());
|
|
1362
|
+
#endif // SPR_DEBUG
|
|
1363
|
+
|
|
1364
|
+
// can't allocate ?
|
|
1365
|
+
if (newInd < 0)
|
|
1366
|
+
{
|
|
1367
|
+
// save status and return FALSE
|
|
1368
|
+
sprite->status = status;
|
|
1369
|
+
|
|
1370
|
+
END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
|
|
1371
|
+
|
|
1372
|
+
return FALSE;
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
// just use the new value for index
|
|
1376
|
+
else newInd = value;
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
// VDP sprite index changed ?
|
|
1380
|
+
if (sprite->VDPSpriteIndex != (u16) newInd)
|
|
1381
|
+
{
|
|
1382
|
+
// set the VDP Sprite index for this sprite and do attached operation
|
|
1383
|
+
setVDPSpriteIndex(sprite, newInd, num);
|
|
1384
|
+
// need to update complete sprite table infos
|
|
1385
|
+
status |= NEED_ST_ALL_UPDATE;
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
// save status
|
|
1389
|
+
sprite->status = status;
|
|
1390
|
+
|
|
1391
|
+
END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
|
|
1392
|
+
|
|
1393
|
+
return TRUE;
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
void SPR_setAutoTileUpload(Sprite* sprite, bool value)
|
|
1397
|
+
{
|
|
1398
|
+
if (!isSpriteValid(sprite, "SPR_setAutoTileUpload"))
|
|
1399
|
+
return;
|
|
1400
|
+
|
|
1401
|
+
if (value) sprite->status |= SPR_FLAG_AUTO_TILE_UPLOAD;
|
|
1402
|
+
else sprite->status &= ~SPR_FLAG_AUTO_TILE_UPLOAD;
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
void SPR_setDelayedFrameUpdate(Sprite* sprite, bool value)
|
|
1406
|
+
{
|
|
1407
|
+
if (!isSpriteValid(sprite, "SPR_setDelayedFrameUpdate"))
|
|
1408
|
+
return;
|
|
1409
|
+
|
|
1410
|
+
if (value) sprite->status &= ~SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE;
|
|
1411
|
+
else sprite->status |= SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE;
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
void SPR_setFrameChangeCallback(Sprite* sprite, FrameChangeCallback* callback)
|
|
1415
|
+
{
|
|
1416
|
+
if (!isSpriteValid(sprite, "SPR_setFrameChangeCallback"))
|
|
1417
|
+
return;
|
|
1418
|
+
|
|
1419
|
+
sprite->onFrameChange = callback;
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
SpriteVisibility SPR_getVisibility(Sprite* sprite)
|
|
1423
|
+
{
|
|
1424
|
+
u16 status = sprite->status;
|
|
1425
|
+
|
|
1426
|
+
if (status & SPR_FLAG_AUTO_VISIBILITY)
|
|
1427
|
+
{
|
|
1428
|
+
if (status & SPR_FLAG_FAST_AUTO_VISIBILITY) return AUTO_FAST;
|
|
1429
|
+
else return AUTO_SLOW;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
if (sprite->visibility) return VISIBLE;
|
|
1433
|
+
else return HIDDEN;
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
bool SPR_isVisible(Sprite* sprite, bool recompute)
|
|
1437
|
+
{
|
|
1438
|
+
if (!isSpriteValid(sprite, "SPR_isVisible"))
|
|
1439
|
+
return FALSE;
|
|
1440
|
+
|
|
1441
|
+
if (recompute)
|
|
1442
|
+
{
|
|
1443
|
+
u16 status = sprite->status;
|
|
1444
|
+
|
|
1445
|
+
// update visibility if needed
|
|
1446
|
+
if (status & NEED_VISIBILITY_UPDATE)
|
|
1447
|
+
{
|
|
1448
|
+
// frame update need to be done first
|
|
1449
|
+
if (status & NEED_FRAME_UPDATE)
|
|
1450
|
+
status = updateFrame(sprite, status);
|
|
1451
|
+
// then do visibility update
|
|
1452
|
+
sprite->status = updateVisibility(sprite, status);
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
return (sprite->visibility) ? TRUE : FALSE;
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
void SPR_setVisibility(Sprite* sprite, SpriteVisibility value)
|
|
1460
|
+
{
|
|
1461
|
+
START_PROFIL
|
|
1462
|
+
|
|
1463
|
+
if (!isSpriteValid(sprite, "SPR_setVisibility"))
|
|
1464
|
+
return;
|
|
1465
|
+
|
|
1466
|
+
u16 status = sprite->status;
|
|
1467
|
+
|
|
1468
|
+
if (status & SPR_FLAG_AUTO_VISIBILITY)
|
|
1469
|
+
{
|
|
1470
|
+
switch(value)
|
|
1471
|
+
{
|
|
1472
|
+
case VISIBLE:
|
|
1473
|
+
status &= ~(SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE);
|
|
1474
|
+
status |= setVisibility(sprite, VISIBILITY_ON);
|
|
1475
|
+
break;
|
|
1476
|
+
|
|
1477
|
+
case HIDDEN:
|
|
1478
|
+
status &= ~(SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE);
|
|
1479
|
+
status |= setVisibility(sprite, VISIBILITY_OFF);
|
|
1480
|
+
break;
|
|
1481
|
+
|
|
1482
|
+
case AUTO_FAST:
|
|
1483
|
+
// passed from slow to fast visibility compute method
|
|
1484
|
+
if (!(status & SPR_FLAG_FAST_AUTO_VISIBILITY))
|
|
1485
|
+
status |= SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE;
|
|
1486
|
+
break;
|
|
1487
|
+
|
|
1488
|
+
case AUTO_SLOW:
|
|
1489
|
+
// passed from fast to slow visibility compute method
|
|
1490
|
+
if (status & SPR_FLAG_FAST_AUTO_VISIBILITY)
|
|
1491
|
+
{
|
|
1492
|
+
status &= ~SPR_FLAG_FAST_AUTO_VISIBILITY;
|
|
1493
|
+
status |= NEED_VISIBILITY_UPDATE;
|
|
1494
|
+
}
|
|
1495
|
+
break;
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1498
|
+
else
|
|
1499
|
+
{
|
|
1500
|
+
switch(value)
|
|
1501
|
+
{
|
|
1502
|
+
case VISIBLE:
|
|
1503
|
+
status |= setVisibility(sprite, VISIBILITY_ON);
|
|
1504
|
+
break;
|
|
1505
|
+
|
|
1506
|
+
case HIDDEN:
|
|
1507
|
+
status |= setVisibility(sprite, VISIBILITY_OFF);
|
|
1508
|
+
break;
|
|
1509
|
+
|
|
1510
|
+
case AUTO_FAST:
|
|
1511
|
+
status |= SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE;
|
|
1512
|
+
break;
|
|
1513
|
+
|
|
1514
|
+
case AUTO_SLOW:
|
|
1515
|
+
status |= SPR_FLAG_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE;
|
|
1516
|
+
break;
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
// update status
|
|
1521
|
+
sprite->status = status;
|
|
1522
|
+
|
|
1523
|
+
END_PROFIL(PROFIL_SET_VISIBILITY)
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
void SPR_clear()
|
|
1528
|
+
{
|
|
1529
|
+
START_PROFIL
|
|
1530
|
+
|
|
1531
|
+
// save starter link
|
|
1532
|
+
u8 linkSave = starter->link;
|
|
1533
|
+
|
|
1534
|
+
VDP_clearSprites();
|
|
1535
|
+
VDP_updateSprites(1, DMA_QUEUE_COPY);
|
|
1536
|
+
|
|
1537
|
+
// restore starter link
|
|
1538
|
+
starter->link = linkSave;
|
|
1539
|
+
|
|
1540
|
+
END_PROFIL(PROFIL_CLEAR)
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
NO_INLINE void SPR_update()
|
|
1544
|
+
{
|
|
1545
|
+
START_PROFIL
|
|
1546
|
+
|
|
1547
|
+
Sprite* sprite;
|
|
1548
|
+
|
|
1549
|
+
#ifdef SPR_DEBUG
|
|
1550
|
+
KLog_U1("----------------- SPR_update: sprite number = ", SPR_getNumActiveSprite());
|
|
1551
|
+
#endif // SPR_DEBUG
|
|
1552
|
+
|
|
1553
|
+
#ifdef SPR_DEBUG
|
|
1554
|
+
KLog_U1_(" Send sprites to DMA queue: ", highestVDPSpriteIndex + 1, " sprite(s) sent");
|
|
1555
|
+
#endif // SPR_DEBUG
|
|
1556
|
+
|
|
1557
|
+
const u16 sprNum = highestVDPSpriteIndex + 1;
|
|
1558
|
+
// send sprites to VRAM using DMA queue (better to do it before sprite tiles upload to avoid being ignored by DMA queue)
|
|
1559
|
+
void* vdpSpriteTableCopy = DMA_allocateAndQueueDma(DMA_VRAM, VDP_SPRITE_TABLE, (sizeof(VDPSprite) * sprNum) / 2, 2);
|
|
1560
|
+
|
|
1561
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
1562
|
+
// DMA temporary buffer is full ? --> can't do sprite update
|
|
1563
|
+
if (!vdpSpriteTableCopy)
|
|
1564
|
+
{
|
|
1565
|
+
KLog("SPR_update(): failed... DMA data buffer is full.");
|
|
1566
|
+
return;
|
|
1567
|
+
}
|
|
1568
|
+
#endif // LIB_DEBUG
|
|
1569
|
+
|
|
1570
|
+
// iterate over all sprites
|
|
1571
|
+
sprite = firstSprite;
|
|
1572
|
+
while(sprite)
|
|
1573
|
+
{
|
|
1574
|
+
s16 timer = sprite->timer;
|
|
1575
|
+
|
|
1576
|
+
#ifdef SPR_DEBUG
|
|
1577
|
+
char str1[32];
|
|
1578
|
+
char str2[8];
|
|
1579
|
+
|
|
1580
|
+
intToHex(sprite->visibility, str2, 4);
|
|
1581
|
+
strcpy(str1, " visibility = ");
|
|
1582
|
+
strcat(str1, str2);
|
|
1583
|
+
|
|
1584
|
+
KLog_U2_(" processing sprite pos #", getSpriteIndex(sprite), " - timer = ", timer, str1);
|
|
1585
|
+
#endif // SPR_DEBUG
|
|
1586
|
+
|
|
1587
|
+
// handle frame animation
|
|
1588
|
+
if (timer > 0)
|
|
1589
|
+
{
|
|
1590
|
+
// timer elapsed --> next frame
|
|
1591
|
+
if (--timer == 0) SPR_nextFrame(sprite);
|
|
1592
|
+
// just update remaining timer
|
|
1593
|
+
else sprite->timer = timer;
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
u16 status = sprite->status;
|
|
1597
|
+
|
|
1598
|
+
// trivial optimization
|
|
1599
|
+
if (status & NEED_UPDATE)
|
|
1600
|
+
{
|
|
1601
|
+
// ! order is important !
|
|
1602
|
+
if (status & NEED_FRAME_UPDATE)
|
|
1603
|
+
status = updateFrame(sprite, status);
|
|
1604
|
+
if (status & NEED_VISIBILITY_UPDATE)
|
|
1605
|
+
status = updateVisibility(sprite, status);
|
|
1606
|
+
|
|
1607
|
+
// sprite not visible ?
|
|
1608
|
+
if (!sprite->visibility)
|
|
1609
|
+
{
|
|
1610
|
+
// need to update its visibility (done via pos Y) ?
|
|
1611
|
+
if (status & NEED_ST_POS_UPDATE)
|
|
1612
|
+
{
|
|
1613
|
+
// hide sprite
|
|
1614
|
+
updateSpriteTableHide(sprite);
|
|
1615
|
+
status &= ~NEED_ST_POS_UPDATE;
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
// only if sprite is visible
|
|
1619
|
+
else
|
|
1620
|
+
{
|
|
1621
|
+
if (status & NEED_TILES_UPLOAD)
|
|
1622
|
+
loadTiles(sprite);
|
|
1623
|
+
|
|
1624
|
+
if (status & NEED_ST_ALL_UPDATE)
|
|
1625
|
+
updateSpriteTableAll(sprite);
|
|
1626
|
+
else if (status & NEED_ST_POS_UPDATE)
|
|
1627
|
+
updateSpriteTablePos(sprite);
|
|
1628
|
+
|
|
1629
|
+
// tiles upload and sprite table done
|
|
1630
|
+
status &= ~(NEED_TILES_UPLOAD | NEED_ST_UPDATE);
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
// processes done !
|
|
1634
|
+
sprite->status = status;
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
// next sprite
|
|
1638
|
+
sprite = sprite->next;
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
// TODO: maybe prevent using SPR_xxx methods between SPR_update() and SYS_doVBlankProcess() call
|
|
1642
|
+
// so we don't need to do a copy of vdpSpriteCache here
|
|
1643
|
+
|
|
1644
|
+
// VDP sprite cache is now updated, copy it to the temporary cache copy we got from DMA queue buffer
|
|
1645
|
+
memcpy(vdpSpriteTableCopy, vdpSpriteCache, sizeof(VDPSprite) * sprNum);
|
|
1646
|
+
|
|
1647
|
+
END_PROFIL(PROFIL_UPDATE)
|
|
1648
|
+
}
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
void SPR_logProfil()
|
|
1652
|
+
{
|
|
1653
|
+
#ifdef SPR_PROFIL
|
|
1654
|
+
KLog("SPR Engine profiling ------------------------------------------------------");
|
|
1655
|
+
KLog_U2x(4, "Alloc=", profil_time[PROFIL_ALLOCATE_SPRITE], " Release=", profil_time[PROFIL_RELEASE_SPRITE]);
|
|
1656
|
+
KLog_U2x(4, "Add=", profil_time[PROFIL_ADD_SPRITE], " Remove=", profil_time[PROFIL_REMOVE_SPRITE]);
|
|
1657
|
+
KLog_U2x(4, "Set Def.=", profil_time[PROFIL_SET_DEF], " Set Attr.=", profil_time[PROFIL_SET_ATTRIBUTE]);
|
|
1658
|
+
KLog_U2x(4, "Set Anim & Frame=", profil_time[PROFIL_SET_ANIM_FRAME], " Set VRAM & Sprite Ind=", profil_time[PROFIL_SET_VRAM_OR_SPRIND]);
|
|
1659
|
+
KLog_U2x(4, "Set Visibility=", profil_time[PROFIL_SET_VISIBILITY], " Clear=", profil_time[PROFIL_CLEAR]);
|
|
1660
|
+
KLog_U1x(4, "Sort Sprite list=", profil_time[PROFIL_SORT]);
|
|
1661
|
+
KLog_U1x_(4, " Update all=", profil_time[PROFIL_UPDATE], " -------------");
|
|
1662
|
+
KLog_U2x(4, "Update visibility=", profil_time[PROFIL_UPDATE_VISIBILITY], " Update frame=", profil_time[PROFIL_UPDATE_FRAME]);
|
|
1663
|
+
KLog_U2x(4, "Update vdp_spr_ind=", profil_time[PROFIL_UPDATE_VDPSPRIND], " Update vis spr table=", profil_time[PROFIL_UPDATE_VISTABLE]);
|
|
1664
|
+
KLog_U2x(4, "Update Sprite Table=", profil_time[PROFIL_UPDATE_SPRITE_TABLE], " Load Tiles=", profil_time[PROFIL_LOADTILES]);
|
|
1665
|
+
|
|
1666
|
+
// reset profil counters
|
|
1667
|
+
memset(profil_time, 0, sizeof(profil_time));
|
|
1668
|
+
#endif // SPR_PROFIL
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
void SPR_logSprites()
|
|
1672
|
+
{
|
|
1673
|
+
Sprite* sprite = firstSprite;
|
|
1674
|
+
|
|
1675
|
+
KLog_U1_("Num sprite = ", SPR_getNumActiveSprite(), " -----------------------------");
|
|
1676
|
+
while(sprite)
|
|
1677
|
+
{
|
|
1678
|
+
logSprite(sprite);
|
|
1679
|
+
sprite = sprite->next;
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
static void setVDPSpriteIndex(Sprite* sprite, u16 ind, u16 num)
|
|
1685
|
+
{
|
|
1686
|
+
START_PROFIL
|
|
1687
|
+
|
|
1688
|
+
Sprite* spr;
|
|
1689
|
+
VDPSprite* vdpSprite;
|
|
1690
|
+
u16 i;
|
|
1691
|
+
|
|
1692
|
+
#ifdef SPR_DEBUG
|
|
1693
|
+
KLog_U2("setVDPSpriteIndex: sprite #", getSpriteIndex(sprite), " new VDP Sprite index = ", ind);
|
|
1694
|
+
#endif // SPR_DEBUG
|
|
1695
|
+
|
|
1696
|
+
sprite->VDPSpriteIndex = ind;
|
|
1697
|
+
|
|
1698
|
+
// we don't need to hide sprite by default anymore as we take care of it with 'lastNumSprite' field
|
|
1699
|
+
// // hide all sprites by default and get last sprite
|
|
1700
|
+
// vdpSprite = &vdpSpriteCache[ind];
|
|
1701
|
+
// vdpSprite->y = 0;
|
|
1702
|
+
//
|
|
1703
|
+
// i = num - 1;
|
|
1704
|
+
// while(i--)
|
|
1705
|
+
// {
|
|
1706
|
+
// vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
1707
|
+
// vdpSprite->y = 0;
|
|
1708
|
+
// }
|
|
1709
|
+
|
|
1710
|
+
// get the last vdpSprite
|
|
1711
|
+
vdpSprite = &vdpSpriteCache[ind];
|
|
1712
|
+
i = num - 1;
|
|
1713
|
+
while(i--) vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
1714
|
+
|
|
1715
|
+
// adjust VDP sprites links
|
|
1716
|
+
spr = sprite->prev;
|
|
1717
|
+
// do we have a previous sprite ? --> set its next link to current sprite index
|
|
1718
|
+
if (spr) spr->lastVDPSprite->link = ind;
|
|
1719
|
+
// othrwise we set started link
|
|
1720
|
+
else starter->link = ind;
|
|
1721
|
+
|
|
1722
|
+
spr = sprite->next;
|
|
1723
|
+
// do we have a next sprite ? --> set link on next sprite
|
|
1724
|
+
if (spr) vdpSprite->link = spr->VDPSpriteIndex;
|
|
1725
|
+
// last sprite
|
|
1726
|
+
else vdpSprite->link = 0;
|
|
1727
|
+
|
|
1728
|
+
// set last VDP sprite pointer for this sprite
|
|
1729
|
+
sprite->lastVDPSprite = vdpSprite;
|
|
1730
|
+
|
|
1731
|
+
#ifdef SPR_DEBUG
|
|
1732
|
+
KLog_U1(" last VDP sprite = ", sprite->lastVDPSprite - vdpSpriteCache);
|
|
1733
|
+
#endif // SPR_DEBUG
|
|
1734
|
+
|
|
1735
|
+
END_PROFIL(PROFIL_UPDATE_VDPSPRIND)
|
|
1736
|
+
}
|
|
1737
|
+
|
|
1738
|
+
static u16 updateVisibility(Sprite* sprite, u16 status)
|
|
1739
|
+
{
|
|
1740
|
+
START_PROFIL
|
|
1741
|
+
|
|
1742
|
+
u16 visibility;
|
|
1743
|
+
const SpriteDefinition* sprDef = sprite->definition;
|
|
1744
|
+
|
|
1745
|
+
// fast visibility computation ?
|
|
1746
|
+
if (status & SPR_FLAG_FAST_AUTO_VISIBILITY)
|
|
1747
|
+
{
|
|
1748
|
+
const s16 x = sprite->x - 0x80;
|
|
1749
|
+
|
|
1750
|
+
// compute global visibility for sprite
|
|
1751
|
+
if (((x + sprDef->w) > (s16) 0) && (x < (s16) screenWidth))
|
|
1752
|
+
visibility = VISIBILITY_ON;
|
|
1753
|
+
else
|
|
1754
|
+
visibility = VISIBILITY_OFF;
|
|
1755
|
+
|
|
1756
|
+
#ifdef SPR_DEBUG
|
|
1757
|
+
KLog_S1(" updateVisibility (fast): global x=", x);
|
|
1758
|
+
KLog_S2(" frame w=", sprDef->w, " h=", sprDef->h);
|
|
1759
|
+
#endif // SPR_DEBUG
|
|
1760
|
+
}
|
|
1761
|
+
else
|
|
1762
|
+
{
|
|
1763
|
+
AnimationFrame* frame = sprite->frame;
|
|
1764
|
+
|
|
1765
|
+
// attributes
|
|
1766
|
+
u16 attr = sprite->attribut;
|
|
1767
|
+
// xmin relative to sprite pos
|
|
1768
|
+
const s16 xmin = 0x80 - sprite->x;
|
|
1769
|
+
// xmax relative to sprite pos
|
|
1770
|
+
const s16 xmax = screenWidth + xmin;
|
|
1771
|
+
const s16 fw = sprDef->w;
|
|
1772
|
+
|
|
1773
|
+
#ifdef SPR_DEBUG
|
|
1774
|
+
KLog_S1(" updateVisibility (slow): global x=", sprite->x);
|
|
1775
|
+
KLog_S1(" frame w=", fw);
|
|
1776
|
+
KLog_S2(" xmin=", xmin, " xmax=", xmax);
|
|
1777
|
+
#endif // SPR_DEBUG
|
|
1778
|
+
|
|
1779
|
+
// sprite is fully visible ? --> set all sprite visible
|
|
1780
|
+
if ((xmin <= 0) && (xmax >= fw)) visibility = VISIBILITY_ON;
|
|
1781
|
+
// sprite is fully hidden ? --> set all sprite to hidden
|
|
1782
|
+
else if ((xmax < 0) || ((xmin - fw) > 0)) visibility = VISIBILITY_OFF;
|
|
1783
|
+
else
|
|
1784
|
+
{
|
|
1785
|
+
u16 num = frame->numSprite & 0x7F;
|
|
1786
|
+
// start from the last one
|
|
1787
|
+
FrameVDPSprite* frameSprite = &(frame->frameVDPSprites[num]);
|
|
1788
|
+
visibility = 0;
|
|
1789
|
+
|
|
1790
|
+
if (attr & TILE_ATTR_HFLIP_MASK)
|
|
1791
|
+
{
|
|
1792
|
+
// H flip
|
|
1793
|
+
while(num--)
|
|
1794
|
+
{
|
|
1795
|
+
// next
|
|
1796
|
+
frameSprite--;
|
|
1797
|
+
visibility <<= 1;
|
|
1798
|
+
|
|
1799
|
+
s16 w = ((frameSprite->size & 0x0C) << 1) + 8;
|
|
1800
|
+
s16 x = frameSprite->offsetXFlip;
|
|
1801
|
+
|
|
1802
|
+
// compute visibility
|
|
1803
|
+
if (((x + w) > xmin) && (x < xmax))
|
|
1804
|
+
visibility |= 1;
|
|
1805
|
+
}
|
|
1806
|
+
}
|
|
1807
|
+
else
|
|
1808
|
+
{
|
|
1809
|
+
while(num--)
|
|
1810
|
+
{
|
|
1811
|
+
// next
|
|
1812
|
+
frameSprite--;
|
|
1813
|
+
visibility <<= 1;
|
|
1814
|
+
|
|
1815
|
+
s16 w = ((frameSprite->size & 0x0C) << 1) + 8;
|
|
1816
|
+
s16 x = frameSprite->offsetX;
|
|
1817
|
+
|
|
1818
|
+
// compute visibility
|
|
1819
|
+
if (((x + w) > xmin) && (x < xmax))
|
|
1820
|
+
visibility |= 1;
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
#ifdef SPR_DEBUG
|
|
1827
|
+
KLog_U3(" Sprite at [", sprite->x - 0x80, ",", sprite->y - 0x80, "] visibility = ", visibility);
|
|
1828
|
+
#endif // SPR_DEBUG
|
|
1829
|
+
|
|
1830
|
+
END_PROFIL(PROFIL_UPDATE_VISIBILITY)
|
|
1831
|
+
|
|
1832
|
+
// set the new computed visibility
|
|
1833
|
+
status |= setVisibility(sprite, visibility);
|
|
1834
|
+
|
|
1835
|
+
// visibility update done !
|
|
1836
|
+
return status & ~NEED_VISIBILITY_UPDATE;
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
static u16 setVisibility(Sprite* sprite, u16 newVisibility)
|
|
1840
|
+
{
|
|
1841
|
+
// visibility changed ?
|
|
1842
|
+
if (sprite->visibility != newVisibility)
|
|
1843
|
+
{
|
|
1844
|
+
// set new visibility info
|
|
1845
|
+
sprite->visibility = newVisibility;
|
|
1846
|
+
// need to recompute the position info (hidding a sprite is done by setting posY to 0)
|
|
1847
|
+
return NEED_ST_POS_UPDATE;
|
|
1848
|
+
}
|
|
1849
|
+
|
|
1850
|
+
return 0;
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1853
|
+
static u16 updateFrame(Sprite* sprite, u16 status)
|
|
1854
|
+
{
|
|
1855
|
+
START_PROFIL
|
|
1856
|
+
|
|
1857
|
+
#ifdef SPR_DEBUG
|
|
1858
|
+
KLog_U1(" updateFrame: sprite #", getSpriteIndex(sprite));
|
|
1859
|
+
#endif // SPR_DEBUG
|
|
1860
|
+
|
|
1861
|
+
AnimationFrame* frame = sprite->animation->frames[sprite->frameInd];
|
|
1862
|
+
|
|
1863
|
+
// we need to transfert tiles data for this sprite and frame delay is not disabled ?
|
|
1864
|
+
if ((status & (SPR_FLAG_AUTO_TILE_UPLOAD | SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE)) == SPR_FLAG_AUTO_TILE_UPLOAD)
|
|
1865
|
+
{
|
|
1866
|
+
// not enough DMA capacity to transfer sprite tile data ?
|
|
1867
|
+
const u16 dmaCapacity = DMA_getMaxTransferSize();
|
|
1868
|
+
|
|
1869
|
+
if (dmaCapacity && ((DMA_getQueueTransferSize() + (frame->tileset->numTile * 32)) > dmaCapacity))
|
|
1870
|
+
{
|
|
1871
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_WARNING)
|
|
1872
|
+
KLog_U4_("Warning: sprite #", getSpriteIndex(sprite), " update delayed on frame #", vtimer, " - exceeding DMA capacity: ", DMA_getQueueTransferSize(), " bytes already queued and require ", frame->tileset->numTile * 32, " more bytes");
|
|
1873
|
+
#endif // LIB_DEBUG
|
|
1874
|
+
|
|
1875
|
+
// initial frame update ? --> better to set frame at least
|
|
1876
|
+
if (sprite->frame == NULL)
|
|
1877
|
+
sprite->frame = frame;
|
|
1878
|
+
|
|
1879
|
+
// delay frame update (when we will have enough DMA capacity to do it)
|
|
1880
|
+
return status;
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
|
|
1884
|
+
// detect if we need to hide some VDP sprite
|
|
1885
|
+
s16 currentNumSprite = frame->numSprite & 0x7F;
|
|
1886
|
+
|
|
1887
|
+
// adjust number of sprite to hide
|
|
1888
|
+
sprite->spriteToHide += sprite->lastNumSprite - currentNumSprite;
|
|
1889
|
+
|
|
1890
|
+
// if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
|
|
1891
|
+
// KLog_U3("currNumSprite= ", currentNumSprite, " lastNumSprite= ", sprite->lastNumSprite, " spriteToHide= ", sprite->spriteToHide);
|
|
1892
|
+
|
|
1893
|
+
// store last used number of sprite
|
|
1894
|
+
sprite->lastNumSprite = currentNumSprite;
|
|
1895
|
+
// set frame
|
|
1896
|
+
sprite->frame = frame;
|
|
1897
|
+
// init timer for this frame *before* frame change callback so it can modify change it if needed.
|
|
1898
|
+
if (SPR_getAutoAnimation(sprite))
|
|
1899
|
+
sprite->timer = frame->timer;
|
|
1900
|
+
|
|
1901
|
+
// frame change event handler defined ? --> call it
|
|
1902
|
+
if (sprite->onFrameChange)
|
|
1903
|
+
{
|
|
1904
|
+
// important to preserve status value which may be modified externally here
|
|
1905
|
+
sprite->status = status;
|
|
1906
|
+
sprite->onFrameChange(sprite);
|
|
1907
|
+
status = sprite->status;
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
// require tile data upload
|
|
1911
|
+
if (status & SPR_FLAG_AUTO_TILE_UPLOAD)
|
|
1912
|
+
status |= NEED_TILES_UPLOAD;
|
|
1913
|
+
// require visibility update
|
|
1914
|
+
if (status & SPR_FLAG_AUTO_VISIBILITY)
|
|
1915
|
+
status |= NEED_VISIBILITY_UPDATE;
|
|
1916
|
+
|
|
1917
|
+
// frame update done, also clear ANIMATION_DONE state
|
|
1918
|
+
status &= ~(NEED_FRAME_UPDATE | STATE_ANIMATION_DONE);
|
|
1919
|
+
|
|
1920
|
+
END_PROFIL(PROFIL_UPDATE_FRAME)
|
|
1921
|
+
|
|
1922
|
+
// need to update all sprite table
|
|
1923
|
+
return status | NEED_ST_ALL_UPDATE;
|
|
1924
|
+
}
|
|
1925
|
+
|
|
1926
|
+
static void updateSpriteTableAll(Sprite* sprite)
|
|
1927
|
+
{
|
|
1928
|
+
START_PROFIL
|
|
1929
|
+
|
|
1930
|
+
AnimationFrame* frame;
|
|
1931
|
+
FrameVDPSprite* frameSprite;
|
|
1932
|
+
VDPSprite* vdpSprite;
|
|
1933
|
+
u16 attr;
|
|
1934
|
+
s16 num;
|
|
1935
|
+
u16 visibility;
|
|
1936
|
+
|
|
1937
|
+
visibility = sprite->visibility;
|
|
1938
|
+
attr = sprite->attribut;
|
|
1939
|
+
frame = sprite->frame;
|
|
1940
|
+
num = frame->numSprite & 0x7F;
|
|
1941
|
+
frameSprite = frame->frameVDPSprites;
|
|
1942
|
+
vdpSprite = &vdpSpriteCache[sprite->VDPSpriteIndex];
|
|
1943
|
+
|
|
1944
|
+
if (visibility == VISIBILITY_ON)
|
|
1945
|
+
{
|
|
1946
|
+
while(num--)
|
|
1947
|
+
{
|
|
1948
|
+
if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
|
|
1949
|
+
else vdpSprite->y = sprite->y + frameSprite->offsetY;
|
|
1950
|
+
vdpSprite->size = frameSprite->size;
|
|
1951
|
+
vdpSprite->attribut = attr;
|
|
1952
|
+
if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
|
|
1953
|
+
else vdpSprite->x = sprite->x + frameSprite->offsetX;
|
|
1954
|
+
|
|
1955
|
+
// increment tile index in attribut field
|
|
1956
|
+
attr += frameSprite->numTile;
|
|
1957
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
1958
|
+
// next
|
|
1959
|
+
frameSprite++;
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
else
|
|
1963
|
+
{
|
|
1964
|
+
while(num--)
|
|
1965
|
+
{
|
|
1966
|
+
if (visibility & 1)
|
|
1967
|
+
{
|
|
1968
|
+
if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
|
|
1969
|
+
else vdpSprite->y = sprite->y + frameSprite->offsetY;
|
|
1970
|
+
if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
|
|
1971
|
+
else vdpSprite->x = sprite->x + frameSprite->offsetX;
|
|
1972
|
+
}
|
|
1973
|
+
else vdpSprite->y = 0;
|
|
1974
|
+
vdpSprite->size = frameSprite->size;
|
|
1975
|
+
vdpSprite->attribut = attr;
|
|
1976
|
+
|
|
1977
|
+
// increment tile index in attribut field
|
|
1978
|
+
attr += frameSprite->numTile;
|
|
1979
|
+
// next VDP sprite
|
|
1980
|
+
visibility >>= 1;
|
|
1981
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
1982
|
+
// next
|
|
1983
|
+
frameSprite++;
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
|
|
1987
|
+
// hide sprites that were used by previous frame
|
|
1988
|
+
if ((num = sprite->spriteToHide) > 0)
|
|
1989
|
+
{
|
|
1990
|
+
while(num--)
|
|
1991
|
+
{
|
|
1992
|
+
vdpSprite->y = 0;
|
|
1993
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
sprite->spriteToHide = 0;
|
|
1997
|
+
|
|
1998
|
+
#ifdef SPR_DEBUG
|
|
1999
|
+
{
|
|
2000
|
+
u16 ind = sprite->VDPSpriteIndex;
|
|
2001
|
+
u16 i = sprite->definition->maxNumSprite;
|
|
2002
|
+
while(i--)
|
|
2003
|
+
{
|
|
2004
|
+
logVDPSprite(ind);
|
|
2005
|
+
// get next sprite
|
|
2006
|
+
ind = vdpSpriteCache[ind].link;
|
|
2007
|
+
}
|
|
2008
|
+
}
|
|
2009
|
+
#endif // SPR_DEBUG
|
|
2010
|
+
|
|
2011
|
+
END_PROFIL(PROFIL_UPDATE_SPRITE_TABLE)
|
|
2012
|
+
}
|
|
2013
|
+
|
|
2014
|
+
static void updateSpriteTablePos(Sprite* sprite)
|
|
2015
|
+
{
|
|
2016
|
+
START_PROFIL
|
|
2017
|
+
|
|
2018
|
+
AnimationFrame* frame;
|
|
2019
|
+
FrameVDPSprite* frameSprite;
|
|
2020
|
+
VDPSprite* vdpSprite;
|
|
2021
|
+
u16 attr;
|
|
2022
|
+
s16 num;
|
|
2023
|
+
u16 visibility;
|
|
2024
|
+
|
|
2025
|
+
visibility = sprite->visibility;
|
|
2026
|
+
attr = sprite->attribut;
|
|
2027
|
+
frame = sprite->frame;
|
|
2028
|
+
num = frame->numSprite & 0x7F;
|
|
2029
|
+
frameSprite = frame->frameVDPSprites;
|
|
2030
|
+
vdpSprite = &vdpSpriteCache[sprite->VDPSpriteIndex];
|
|
2031
|
+
|
|
2032
|
+
if (visibility == VISIBILITY_ON)
|
|
2033
|
+
{
|
|
2034
|
+
while(num--)
|
|
2035
|
+
{
|
|
2036
|
+
if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
|
|
2037
|
+
else vdpSprite->y = sprite->y + frameSprite->offsetY;
|
|
2038
|
+
if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
|
|
2039
|
+
else vdpSprite->x = sprite->x + frameSprite->offsetX;
|
|
2040
|
+
|
|
2041
|
+
// pass to next VDP sprite
|
|
2042
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
2043
|
+
// next
|
|
2044
|
+
frameSprite++;
|
|
2045
|
+
}
|
|
2046
|
+
}
|
|
2047
|
+
else
|
|
2048
|
+
{
|
|
2049
|
+
while(num--)
|
|
2050
|
+
{
|
|
2051
|
+
if (visibility & 1)
|
|
2052
|
+
{
|
|
2053
|
+
if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
|
|
2054
|
+
else vdpSprite->y = sprite->y + frameSprite->offsetY;
|
|
2055
|
+
if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
|
|
2056
|
+
else vdpSprite->x = sprite->x + frameSprite->offsetX;
|
|
2057
|
+
}
|
|
2058
|
+
else vdpSprite->y = 0;
|
|
2059
|
+
|
|
2060
|
+
// pass to next VDP sprite
|
|
2061
|
+
visibility >>= 1;
|
|
2062
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
2063
|
+
// next
|
|
2064
|
+
frameSprite++;
|
|
2065
|
+
}
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
// hide sprites that were used by previous frame
|
|
2069
|
+
if ((num = sprite->spriteToHide) > 0)
|
|
2070
|
+
{
|
|
2071
|
+
while(num--)
|
|
2072
|
+
{
|
|
2073
|
+
vdpSprite->y = 0;
|
|
2074
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
sprite->spriteToHide = 0;
|
|
2078
|
+
|
|
2079
|
+
#ifdef SPR_DEBUG
|
|
2080
|
+
{
|
|
2081
|
+
u16 ind = sprite->VDPSpriteIndex;
|
|
2082
|
+
u16 i = sprite->definition->maxNumSprite;
|
|
2083
|
+
while(i--)
|
|
2084
|
+
{
|
|
2085
|
+
logVDPSprite(ind);
|
|
2086
|
+
// get next sprite
|
|
2087
|
+
ind = vdpSpriteCache[ind].link;
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
#endif // SPR_DEBUG
|
|
2091
|
+
|
|
2092
|
+
END_PROFIL(PROFIL_UPDATE_SPRITE_TABLE)
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
static void updateSpriteTableHide(Sprite* sprite)
|
|
2096
|
+
{
|
|
2097
|
+
START_PROFIL
|
|
2098
|
+
|
|
2099
|
+
VDPSprite* vdpSprite = &vdpSpriteCache[sprite->VDPSpriteIndex];
|
|
2100
|
+
// don't forget to hide sprites that were used by previous frame
|
|
2101
|
+
s16 num = sprite->frame->numSprite & 0x7F;
|
|
2102
|
+
|
|
2103
|
+
if (sprite->spriteToHide > 0) num += sprite->spriteToHide;
|
|
2104
|
+
|
|
2105
|
+
// KLog_U3("updateSpriteTableHide(): sprite->spriteToHide= ", sprite->spriteToHide, " num= ", num, " maxNumSprite= ", sprite->definition->maxNumSprite);
|
|
2106
|
+
|
|
2107
|
+
while(num--)
|
|
2108
|
+
{
|
|
2109
|
+
vdpSprite->y = 0;
|
|
2110
|
+
vdpSprite = &vdpSpriteCache[vdpSprite->link];
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2113
|
+
sprite->spriteToHide = 0;
|
|
2114
|
+
|
|
2115
|
+
END_PROFIL(PROFIL_UPDATE_SPRITE_TABLE)
|
|
2116
|
+
}
|
|
2117
|
+
|
|
2118
|
+
static void loadTiles(Sprite* sprite)
|
|
2119
|
+
{
|
|
2120
|
+
START_PROFIL
|
|
2121
|
+
|
|
2122
|
+
TileSet* tileset = sprite->frame->tileset;
|
|
2123
|
+
u16 lenInWord = (tileset->numTile * 32) / 2;
|
|
2124
|
+
// need to test for empty tileset (blank frame)
|
|
2125
|
+
if (lenInWord)
|
|
2126
|
+
{
|
|
2127
|
+
u16 compression = tileset->compression;
|
|
2128
|
+
|
|
2129
|
+
// TODO: separate tileset per VDP sprite and only unpack/upload visible VDP sprite (using visibility) to VRAM
|
|
2130
|
+
|
|
2131
|
+
// need unpacking ?
|
|
2132
|
+
if (compression != COMPRESSION_NONE)
|
|
2133
|
+
{
|
|
2134
|
+
// get buffer and send to DMA queue
|
|
2135
|
+
u8* buf = DMA_allocateAndQueueDma(DMA_VRAM, (sprite->attribut & TILE_INDEX_MASK) * 32, lenInWord, 2);
|
|
2136
|
+
|
|
2137
|
+
// unpack in temp buffer obtained from DMA queue
|
|
2138
|
+
if (buf) unpack(compression, (u8*) FAR_SAFE(tileset->tiles, lenInWord * 2), buf);
|
|
2139
|
+
#if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
|
|
2140
|
+
else KLog(" loadTiles: unpack tileset failed (DMA temporary buffer is full)");
|
|
2141
|
+
#endif
|
|
2142
|
+
|
|
2143
|
+
#ifdef SPR_DEBUG
|
|
2144
|
+
char str1[32];
|
|
2145
|
+
char str2[8];
|
|
2146
|
+
|
|
2147
|
+
intToHex((u32) buf, str2, 4);
|
|
2148
|
+
strcpy(str1, " at ");
|
|
2149
|
+
strcat(str1, str2);
|
|
2150
|
+
|
|
2151
|
+
KLog_U1_(" loadTiles: unpack tileset, numTile= ", tileset->numTile, str1);
|
|
2152
|
+
KLog_U2(" Queue DMA: to=", (sprite->attribut & TILE_INDEX_MASK) * 32, " size in word=", lenInWord);
|
|
2153
|
+
#endif // SPR_DEBUG
|
|
2154
|
+
}
|
|
2155
|
+
else
|
|
2156
|
+
{
|
|
2157
|
+
// just queue DMA operation to transfer tileset data to VRAM
|
|
2158
|
+
DMA_queueDma(DMA_VRAM, FAR_SAFE(tileset->tiles, lenInWord * 2), (sprite->attribut & TILE_INDEX_MASK) * 32, lenInWord, 2);
|
|
2159
|
+
|
|
2160
|
+
#ifdef SPR_DEBUG
|
|
2161
|
+
KLog_U3(" loadTiles - queue DMA: from=", (u32) tileset->tiles, " to=", (sprite->attribut & TILE_INDEX_MASK) * 32, " size in word=", lenInWord);
|
|
2162
|
+
#endif // SPR_DEBUG
|
|
2163
|
+
}
|
|
2164
|
+
}
|
|
2165
|
+
|
|
2166
|
+
END_PROFIL(PROFIL_LOADTILES)
|
|
2167
|
+
}
|
|
2168
|
+
|
|
2169
|
+
static Sprite* sortSprite(Sprite* sprite)
|
|
2170
|
+
{
|
|
2171
|
+
START_PROFIL
|
|
2172
|
+
|
|
2173
|
+
Sprite* const prev = sprite->prev;
|
|
2174
|
+
Sprite* const next = sprite->next;
|
|
2175
|
+
Sprite* s;
|
|
2176
|
+
|
|
2177
|
+
// cache sprite depth coordinate
|
|
2178
|
+
const s16 sdepth = sprite->depth;
|
|
2179
|
+
|
|
2180
|
+
#ifdef SPR_DEBUG
|
|
2181
|
+
KLog_U2("Start depth compare for sprite #", getSpriteIndex(sprite), " VDP Sprite Ind=", sprite->VDPSpriteIndex);
|
|
2182
|
+
#endif // SPR_DEBUG
|
|
2183
|
+
|
|
2184
|
+
// find position forward first
|
|
2185
|
+
s = next;
|
|
2186
|
+
while(s && (s->depth < sdepth)) s = s->next;
|
|
2187
|
+
// position changed ? --> insert sprite after s->prev (as s is pointing on 'next')
|
|
2188
|
+
if (s != next) moveAfter(s ? s->prev : lastSprite, sprite);
|
|
2189
|
+
else
|
|
2190
|
+
{
|
|
2191
|
+
// try to find position backward then
|
|
2192
|
+
s = prev;
|
|
2193
|
+
while(s && (s->depth > sdepth)) s = s->prev;
|
|
2194
|
+
// position changed ? --> insert sprite after s
|
|
2195
|
+
if (s != prev) moveAfter(s, sprite);
|
|
2196
|
+
}
|
|
2197
|
+
|
|
2198
|
+
#ifdef SPR_DEBUG
|
|
2199
|
+
if (s) KLog_U1("Position for sprite = ", getSpriteIndex(s) + 1);
|
|
2200
|
+
else KLog_U1("Position for sprite = ", 0);
|
|
2201
|
+
#endif // SPR_DEBUG
|
|
2202
|
+
|
|
2203
|
+
END_PROFIL(PROFIL_SORT)
|
|
2204
|
+
|
|
2205
|
+
// return prev just for convenience on full sorting
|
|
2206
|
+
return prev;
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
static void moveAfter(Sprite* pos, Sprite* sprite)
|
|
2210
|
+
{
|
|
2211
|
+
Sprite* prev = sprite->prev;
|
|
2212
|
+
Sprite* next = sprite->next;
|
|
2213
|
+
|
|
2214
|
+
#ifdef SPR_DEBUG
|
|
2215
|
+
if (pos) KLog_U2("Insert #", getSpriteIndex(sprite), " after #", getSpriteIndex(pos));
|
|
2216
|
+
else KLog_U1_("Insert #", getSpriteIndex(sprite), " at #0");
|
|
2217
|
+
#endif // SPR_DEBUG
|
|
2218
|
+
|
|
2219
|
+
// we first remove the sprite from its current position
|
|
2220
|
+
if (prev)
|
|
2221
|
+
{
|
|
2222
|
+
prev->next = next;
|
|
2223
|
+
if (next)
|
|
2224
|
+
{
|
|
2225
|
+
next->prev = prev;
|
|
2226
|
+
// fix sprite link from previous sprite
|
|
2227
|
+
prev->lastVDPSprite->link = next->VDPSpriteIndex;
|
|
2228
|
+
}
|
|
2229
|
+
else
|
|
2230
|
+
{
|
|
2231
|
+
lastSprite = prev;
|
|
2232
|
+
// fix sprite link from previous sprite
|
|
2233
|
+
prev->lastVDPSprite->link = 0;
|
|
2234
|
+
}
|
|
2235
|
+
}
|
|
2236
|
+
else
|
|
2237
|
+
{
|
|
2238
|
+
// 'next' become the first sprite
|
|
2239
|
+
firstSprite = next;
|
|
2240
|
+
if (next)
|
|
2241
|
+
{
|
|
2242
|
+
next->prev = prev;
|
|
2243
|
+
// fix sprite link from previous sprite
|
|
2244
|
+
starter->link = next->VDPSpriteIndex;
|
|
2245
|
+
}
|
|
2246
|
+
else
|
|
2247
|
+
{
|
|
2248
|
+
// no more sprite (both firstSprite and lastSprite == NULL)
|
|
2249
|
+
lastSprite = prev;
|
|
2250
|
+
// fix sprite link from previous sprite
|
|
2251
|
+
starter->link = 0;
|
|
2252
|
+
}
|
|
2253
|
+
}
|
|
2254
|
+
|
|
2255
|
+
// then we re-insert after 'pos'
|
|
2256
|
+
if (pos)
|
|
2257
|
+
{
|
|
2258
|
+
next = pos->next;
|
|
2259
|
+
sprite->next = next;
|
|
2260
|
+
sprite->prev = pos;
|
|
2261
|
+
if (next) next->prev = sprite;
|
|
2262
|
+
else lastSprite = sprite;
|
|
2263
|
+
pos->next = sprite;
|
|
2264
|
+
// fix sprite link
|
|
2265
|
+
sprite->lastVDPSprite->link = pos->lastVDPSprite->link;
|
|
2266
|
+
pos->lastVDPSprite->link = sprite->VDPSpriteIndex;
|
|
2267
|
+
}
|
|
2268
|
+
// or we insert before 'firstSprite' (become the new first sprite)
|
|
2269
|
+
else
|
|
2270
|
+
{
|
|
2271
|
+
sprite->next = firstSprite;
|
|
2272
|
+
sprite->prev = NULL;
|
|
2273
|
+
// sprite become the preceding sprite of previous first sprite
|
|
2274
|
+
if (firstSprite) firstSprite->prev = sprite;
|
|
2275
|
+
// no previous first sprite ? --> sprite becomes last sprite then
|
|
2276
|
+
else lastSprite = sprite;
|
|
2277
|
+
// sprite become first sprite
|
|
2278
|
+
firstSprite = sprite;
|
|
2279
|
+
// fix sprite link
|
|
2280
|
+
sprite->lastVDPSprite->link = starter->link;
|
|
2281
|
+
starter->link = sprite->VDPSpriteIndex;
|
|
2282
|
+
}
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2285
|
+
static u16 getSpriteIndex(Sprite* sprite)
|
|
2286
|
+
{
|
|
2287
|
+
u16 res = 0;
|
|
2288
|
+
Sprite* s = firstSprite;
|
|
2289
|
+
|
|
2290
|
+
while(s != sprite)
|
|
2291
|
+
{
|
|
2292
|
+
s = s->next;
|
|
2293
|
+
res++;
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
return res;
|
|
2297
|
+
}
|
|
2298
|
+
|
|
2299
|
+
static void logSprite(Sprite* sprite)
|
|
2300
|
+
{
|
|
2301
|
+
KLog_U2("Sprite #", getSpriteIndex(sprite), " ------------- status=", sprite->status);
|
|
2302
|
+
KLog_U2("animInd=", sprite->animInd, " frameInd=", sprite->frameInd);
|
|
2303
|
+
KLog_S4("attribut=", sprite->attribut, " x=", sprite->x, " y=", sprite->y, " depth=", sprite->depth);
|
|
2304
|
+
KLog_U2("visibility=", sprite->visibility, " timer=", sprite->timer);
|
|
2305
|
+
KLog_U2("VDPSpriteInd=", sprite->VDPSpriteIndex, " link=", sprite->lastVDPSprite->link);
|
|
2306
|
+
KLog_U2("prev=", (sprite->prev == NULL) ? 128 : getSpriteIndex(sprite->prev), " next=", (sprite->next == NULL) ? 128 : getSpriteIndex(sprite->next));
|
|
2307
|
+
}
|
|
2308
|
+
|
|
2309
|
+
#endif
|