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